Branch data Line data Source code
1 : : // $Id: Frame.cc 6219 2008-10-01 05:39:07Z vern $
2 : : //
3 : : // See the file "COPYING" in the main distribution directory for copyright.
4 : :
5 : : #include "config.h"
6 : :
7 : : #include "Frame.h"
8 : : #include "Stmt.h"
9 : : #include "Func.h"
10 : : #include "Trigger.h"
11 : :
12 : 6 : vector<Frame*> g_frame_stack;
13 : :
14 : 94710 : Frame::Frame(int arg_size, const BroFunc* func, const val_list* fn_args)
15 : : {
16 : 94710 : size = arg_size;
17 : 94710 : frame = new Val*[size];
18 : 94710 : function = func;
19 : 94710 : func_args = fn_args;
20 : :
21 : 94710 : next_stmt = 0;
22 : 94710 : break_before_next_stmt = false;
23 : 94710 : break_on_return = false;
24 : :
25 : 94710 : trigger = 0;
26 : 94710 : call = 0;
27 : 94710 : delayed = false;
28 : :
29 : 94710 : Clear();
30 : 94710 : }
31 : :
32 : 94710 : Frame::~Frame()
33 : : {
34 [ - + ][ - + ]: 94710 : Unref(trigger);
[ # # ]
35 : 94710 : Release();
36 [ + - ][ - + ]: 94710 : }
[ # # ]
37 : :
38 : 94710 : void Frame::Release()
39 : : {
40 [ + + ]: 490358 : for ( int i = 0; i < size; ++i )
41 : 395648 : Unref(frame[i]);
42 : :
43 [ + - ]: 94710 : delete [] frame;
44 : 94710 : }
45 : :
46 : 0 : void Frame::Describe(ODesc* d) const
47 : : {
48 [ # # ]: 0 : if ( ! d->IsBinary() )
49 : 0 : d->AddSP("frame");
50 : :
51 [ # # ]: 0 : if ( ! d->IsReadable() )
52 : : {
53 : 0 : d->Add(size);
54 : :
55 [ # # ]: 0 : for ( int i = 0; i < size; ++i )
56 : : {
57 : 0 : d->Add(frame[i] != 0);
58 : 0 : d->SP();
59 : : }
60 : : }
61 : :
62 [ # # ]: 0 : for ( int i = 0; i < size; ++i )
63 [ # # ]: 0 : if ( frame[i] )
64 : 0 : frame[i]->Describe(d);
65 [ # # ]: 0 : else if ( d->IsReadable() )
66 : 0 : d->Add("<nil>");
67 : 0 : }
68 : :
69 : 94710 : void Frame::Clear()
70 : : {
71 [ + + ]: 490358 : for ( int i = 0; i < size; ++i )
72 : 395648 : frame[i] = 0;
73 : 94710 : }
74 : :
75 : 0 : Frame* Frame::Clone()
76 : : {
77 : 0 : Frame* f = new Frame(size, function, func_args);
78 : :
79 [ # # ]: 0 : for ( int i = 0; i < size; ++i )
80 [ # # ]: 0 : f->frame[i] = frame[i] ? frame[i]->Clone() : 0;
81 : :
82 [ # # ]: 0 : if ( trigger )
83 [ # # ]: 0 : Ref(trigger);
84 : 0 : f->trigger = trigger;
85 : 0 : f->call = call;
86 : :
87 : 0 : return f;
88 : : }
89 : :
90 : 69948 : void Frame::SetTrigger(Trigger* arg_trigger)
91 : : {
92 [ - + ]: 69948 : if ( arg_trigger )
93 [ # # ]: 0 : Ref(arg_trigger);
94 : 69948 : trigger = arg_trigger;
95 : 69948 : }
96 : :
97 : 0 : void Frame::ClearTrigger()
98 : : {
99 [ # # ]: 0 : Unref(trigger);
100 : 0 : trigger = 0;
101 [ + - ][ + - ]: 6 : }
|