Coverage Report

Created: 2026-05-12 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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