/src/zeek/src/script_opt/ZAM/ZInstAux.cc
Line | Count | Source |
1 | | // See the file "COPYING" in the main distribution directory for copyright. |
2 | | |
3 | | #include "zeek/script_opt/ZAM/ZInstAux.h" |
4 | | |
5 | | #include "zeek/module_util.h" |
6 | | |
7 | | namespace zeek::detail { |
8 | | |
9 | 0 | void ZInstAux::Dump(FILE* f) const { |
10 | 0 | if ( id_val ) |
11 | 0 | fprintf(f, " id=%s", id_val->Name()); |
12 | |
|
13 | 0 | if ( call_expr ) |
14 | 0 | fprintf(f, " <callexpr>"); |
15 | |
|
16 | 0 | if ( func ) |
17 | 0 | fprintf(f, " func=%s", func->GetName().c_str()); |
18 | |
|
19 | 0 | if ( is_BiF_call ) |
20 | 0 | fprintf(f, " <BiF>"); |
21 | |
|
22 | 0 | if ( lambda ) |
23 | 0 | fprintf(f, " <lambda>"); |
24 | |
|
25 | 0 | if ( event_handler ) |
26 | 0 | fprintf(f, " eh=%s", event_handler->Name()); |
27 | |
|
28 | 0 | if ( attrs ) |
29 | 0 | fprintf(f, " <attrs>"); |
30 | |
|
31 | 0 | if ( ! types.empty() ) |
32 | 0 | fprintf(f, " types=%zu", types.size()); |
33 | |
|
34 | 0 | if ( ! is_managed.empty() ) |
35 | 0 | fprintf(f, " is_managed=%zu", is_managed.size()); |
36 | |
|
37 | 0 | if ( ! map.empty() ) |
38 | 0 | fprintf(f, " map=%zu", map.size()); |
39 | |
|
40 | 0 | if ( ! rhs_map.empty() ) |
41 | 0 | fprintf(f, " rhs_map=%zu", rhs_map.size()); |
42 | |
|
43 | 0 | if ( ! lhs_map.empty() ) |
44 | 0 | fprintf(f, " lhs_map=%zu", lhs_map.size()); |
45 | |
|
46 | 0 | for ( auto lv : loop_vars ) |
47 | 0 | fprintf(f, " loop_var=%d", lv); |
48 | |
|
49 | 0 | if ( value_var_type ) |
50 | 0 | fprintf(f, " <value-var-type>"); |
51 | |
|
52 | 0 | if ( field_inits ) |
53 | 0 | fprintf(f, " field_inits=%zu", field_inits->size()); |
54 | |
|
55 | 0 | if ( elems ) { |
56 | 0 | for ( int i = 0; i < n; ++i ) { |
57 | 0 | auto& e_i = elems[i]; |
58 | 0 | auto& c = e_i.Constant(); |
59 | |
|
60 | 0 | fprintf(f, " elem-%d:", i); |
61 | |
|
62 | 0 | if ( c ) |
63 | 0 | fprintf(f, "<constant>"); |
64 | | |
65 | 0 | else if ( e_i.GetType() ) |
66 | 0 | fprintf(f, "<slot:%d>", e_i.Slot()); |
67 | | |
68 | 0 | else |
69 | 0 | fprintf(f, "<int:%d>", e_i.Slot()); |
70 | 0 | } |
71 | 0 | } |
72 | |
|
73 | 0 | if ( ! cft.empty() ) { |
74 | 0 | fprintf(f, " CFT: "); |
75 | 0 | bool first = true; |
76 | 0 | for ( auto [cft, n] : cft ) { |
77 | 0 | const char* cn; |
78 | 0 | switch ( cft ) { |
79 | 0 | case CFT_IF: cn = "if"; break; |
80 | 0 | case CFT_BLOCK_END: cn = "block-end"; break; |
81 | 0 | case CFT_ELSE: cn = "else"; break; |
82 | 0 | case CFT_LOOP: cn = "loop"; break; |
83 | 0 | case CFT_LOOP_COND: cn = "loop-cond"; break; |
84 | 0 | case CFT_LOOP_END: cn = "loop-end"; break; |
85 | 0 | case CFT_NEXT: cn = "next"; break; |
86 | 0 | case CFT_BREAK: cn = "break"; break; |
87 | 0 | case CFT_DEFAULT: cn = "default"; break; |
88 | 0 | case CFT_INLINED_RETURN: cn = "inline-return"; break; |
89 | 0 | default: cn = "unknown"; break; |
90 | 0 | } |
91 | | |
92 | 0 | if ( first ) |
93 | 0 | first = false; |
94 | 0 | else |
95 | 0 | fprintf(f, "/"); |
96 | |
|
97 | 0 | fprintf(f, "%s", cn); |
98 | 0 | } |
99 | 0 | } |
100 | 0 | } |
101 | | |
102 | 0 | TraversalCode ZInstAux::Traverse(TraversalCallback* cb) const { |
103 | 0 | TraversalCode tc; |
104 | |
|
105 | 0 | if ( id_val ) { |
106 | 0 | tc = id_val->Traverse(cb); |
107 | 0 | HANDLE_TC_STMT_PRE(tc); |
108 | 0 | } |
109 | | |
110 | | // Don't traverse the "func" field, as if it's a recursive function |
111 | | // we can wind up right back here. |
112 | | |
113 | 0 | if ( lambda ) { |
114 | 0 | tc = lambda->Traverse(cb); |
115 | 0 | HANDLE_TC_STMT_PRE(tc); |
116 | 0 | } |
117 | | |
118 | 0 | if ( event_handler ) { |
119 | 0 | auto g = lookup_ID(event_handler->Name(), GLOBAL_MODULE_NAME, false, false, false); |
120 | 0 | ASSERT(g); |
121 | 0 | tc = g->Traverse(cb); |
122 | 0 | HANDLE_TC_STMT_PRE(tc); |
123 | 0 | } |
124 | | |
125 | 0 | if ( attrs ) { |
126 | 0 | tc = attrs->Traverse(cb); |
127 | 0 | HANDLE_TC_STMT_PRE(tc); |
128 | 0 | } |
129 | | |
130 | 0 | if ( value_var_type ) { |
131 | 0 | tc = value_var_type->Traverse(cb); |
132 | 0 | HANDLE_TC_STMT_PRE(tc); |
133 | 0 | } |
134 | | |
135 | 0 | for ( auto& lvt : types ) { |
136 | 0 | tc = lvt->Traverse(cb); |
137 | 0 | HANDLE_TC_STMT_PRE(tc); |
138 | 0 | } |
139 | | |
140 | 0 | if ( elems ) { |
141 | 0 | for ( int i = 0; i < n; ++i ) { |
142 | 0 | auto& e_i = elems[i]; |
143 | |
|
144 | 0 | auto& c = e_i.Constant(); |
145 | 0 | if ( c ) { |
146 | 0 | tc = c->GetType()->Traverse(cb); |
147 | 0 | HANDLE_TC_STMT_PRE(tc); |
148 | 0 | } |
149 | | |
150 | 0 | auto& t = e_i.GetType(); |
151 | 0 | if ( t ) { |
152 | 0 | tc = t->Traverse(cb); |
153 | 0 | HANDLE_TC_STMT_PRE(tc); |
154 | 0 | } |
155 | 0 | } |
156 | 0 | } |
157 | | |
158 | 0 | return TC_CONTINUE; |
159 | 0 | } |
160 | | |
161 | | } // namespace zeek::detail |