making Exec methods non-const, so execution can manage side-information

This commit is contained in:
Vern Paxson 2021-03-18 08:22:55 -07:00
parent c6830193f3
commit 01bf4b8484
4 changed files with 45 additions and 47 deletions

View file

@ -235,7 +235,7 @@ ExprListStmt::ExprListStmt(StmtTag t, ListExprPtr arg_l)
ExprListStmt::~ExprListStmt() = default; ExprListStmt::~ExprListStmt() = default;
ValPtr ExprListStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr ExprListStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
last_access = run_state::network_time; last_access = run_state::network_time;
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -303,7 +303,7 @@ static void print_log(const std::vector<ValPtr>& vals)
} }
ValPtr PrintStmt::DoExec(std::vector<ValPtr> vals, ValPtr PrintStmt::DoExec(std::vector<ValPtr> vals,
StmtFlowType& /* flow */) const StmtFlowType& /* flow */)
{ {
RegisterAccess(); RegisterAccess();
@ -393,7 +393,7 @@ ExprPtr ExprStmt::StmtExprPtr() const
return e; return e;
} }
ValPtr ExprStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr ExprStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -406,7 +406,7 @@ ValPtr ExprStmt::Exec(Frame* f, StmtFlowType& flow) const
return nullptr; return nullptr;
} }
ValPtr ExprStmt::DoExec(Frame* /* f */, Val* /* v */, StmtFlowType& /* flow */) const ValPtr ExprStmt::DoExec(Frame* /* f */, Val* /* v */, StmtFlowType& /* flow */)
{ {
return nullptr; return nullptr;
} }
@ -470,7 +470,7 @@ IfStmt::IfStmt(ExprPtr test,
IfStmt::~IfStmt() = default; IfStmt::~IfStmt() = default;
ValPtr IfStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow) const ValPtr IfStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow)
{ {
// Treat 0 as false, but don't require 1 for true. // Treat 0 as false, but don't require 1 for true.
Stmt* do_stmt = v->IsZero() ? s2.get() : s1.get(); Stmt* do_stmt = v->IsZero() ? s2.get() : s1.get();
@ -917,7 +917,7 @@ std::pair<int, ID*> SwitchStmt::FindCaseLabelMatch(const Val* v) const
return std::make_pair(label_idx, label_id); return std::make_pair(label_idx, label_id);
} }
ValPtr SwitchStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow) const ValPtr SwitchStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow)
{ {
ValPtr rval; ValPtr rval;
@ -930,7 +930,7 @@ ValPtr SwitchStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow) const
for ( int i = matching_label_idx; i < cases->length(); ++i ) for ( int i = matching_label_idx; i < cases->length(); ++i )
{ {
const Case* c = (*cases)[i]; auto c = (*cases)[i];
if ( matching_id ) if ( matching_id )
{ {
@ -1033,7 +1033,7 @@ AddStmt::AddStmt(ExprPtr arg_e) : AddDelStmt(STMT_ADD, std::move(arg_e))
Error("illegal add statement"); Error("illegal add statement");
} }
ValPtr AddStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr AddStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -1051,7 +1051,7 @@ DelStmt::DelStmt(ExprPtr arg_e) : AddDelStmt(STMT_DELETE, std::move(arg_e))
Error("illegal delete statement"); Error("illegal delete statement");
} }
ValPtr DelStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr DelStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -1065,7 +1065,7 @@ EventStmt::EventStmt(EventExprPtr arg_e)
{ {
} }
ValPtr EventStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr EventStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
auto args = eval_list(f, event_expr->Args()); auto args = eval_list(f, event_expr->Args());
@ -1142,7 +1142,7 @@ TraversalCode WhileStmt::Traverse(TraversalCallback* cb) const
HANDLE_TC_STMT_POST(tc); HANDLE_TC_STMT_POST(tc);
} }
ValPtr WhileStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr WhileStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -1288,7 +1288,7 @@ ForStmt::~ForStmt()
delete loop_vars; delete loop_vars;
} }
ValPtr ForStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow) const ValPtr ForStmt::DoExec(Frame* f, Val* v, StmtFlowType& flow)
{ {
ValPtr ret; ValPtr ret;
@ -1430,7 +1430,7 @@ TraversalCode ForStmt::Traverse(TraversalCallback* cb) const
HANDLE_TC_STMT_POST(tc); HANDLE_TC_STMT_POST(tc);
} }
ValPtr NextStmt::Exec(Frame* /* f */, StmtFlowType& flow) const ValPtr NextStmt::Exec(Frame* /* f */, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_LOOP; flow = FLOW_LOOP;
@ -1457,7 +1457,7 @@ TraversalCode NextStmt::Traverse(TraversalCallback* cb) const
HANDLE_TC_STMT_POST(tc); HANDLE_TC_STMT_POST(tc);
} }
ValPtr BreakStmt::Exec(Frame* /* f */, StmtFlowType& flow) const ValPtr BreakStmt::Exec(Frame* /* f */, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_BREAK; flow = FLOW_BREAK;
@ -1484,7 +1484,7 @@ TraversalCode BreakStmt::Traverse(TraversalCallback* cb) const
HANDLE_TC_STMT_POST(tc); HANDLE_TC_STMT_POST(tc);
} }
ValPtr FallthroughStmt::Exec(Frame* /* f */, StmtFlowType& flow) const ValPtr FallthroughStmt::Exec(Frame* /* f */, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_FALLTHROUGH; flow = FLOW_FALLTHROUGH;
@ -1555,7 +1555,7 @@ ReturnStmt::ReturnStmt(ExprPtr arg_e)
} }
} }
ValPtr ReturnStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr ReturnStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_RETURN; flow = FLOW_RETURN;
@ -1597,7 +1597,7 @@ StmtList::~StmtList()
delete stmts; delete stmts;
} }
ValPtr StmtList::Exec(Frame* f, StmtFlowType& flow) const ValPtr StmtList::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -1684,7 +1684,7 @@ InitStmt::InitStmt(std::vector<IDPtr> arg_inits) : Stmt(STMT_INIT)
SetLocationInfo(inits[0]->GetLocationInfo()); SetLocationInfo(inits[0]->GetLocationInfo());
} }
ValPtr InitStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr InitStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -1749,7 +1749,7 @@ TraversalCode InitStmt::Traverse(TraversalCallback* cb) const
HANDLE_TC_STMT_POST(tc); HANDLE_TC_STMT_POST(tc);
} }
ValPtr NullStmt::Exec(Frame* /* f */, StmtFlowType& flow) const ValPtr NullStmt::Exec(Frame* /* f */, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;
@ -1804,7 +1804,7 @@ WhenStmt::WhenStmt(ExprPtr arg_cond,
WhenStmt::~WhenStmt() = default; WhenStmt::~WhenStmt() = default;
ValPtr WhenStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr WhenStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;

View file

@ -33,9 +33,8 @@ protected:
~ExprListStmt() override; ~ExprListStmt() override;
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
virtual ValPtr DoExec(std::vector<ValPtr> vals, virtual ValPtr DoExec(std::vector<ValPtr> vals, StmtFlowType& flow) = 0;
StmtFlowType& flow) const = 0;
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -57,8 +56,7 @@ public:
StmtPtr Duplicate() override; StmtPtr Duplicate() override;
protected: protected:
ValPtr DoExec(std::vector<ValPtr> vals, ValPtr DoExec(std::vector<ValPtr> vals, StmtFlowType& flow) override;
StmtFlowType& flow) const override;
// Optimization-related: // Optimization-related:
StmtPtr DoSubclassReduce(ListExprPtr singletons, Reducer* c) override; StmtPtr DoSubclassReduce(ListExprPtr singletons, Reducer* c) override;
@ -74,7 +72,7 @@ public:
// not allowing us to use "friend" for protected access. // not allowing us to use "friend" for protected access.
ExprStmt(StmtTag t, ExprPtr e); ExprStmt(StmtTag t, ExprPtr e);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
const Expr* StmtExpr() const { return e.get(); } const Expr* StmtExpr() const { return e.get(); }
ExprPtr StmtExprPtr() const; ExprPtr StmtExprPtr() const;
@ -91,7 +89,7 @@ public:
StmtPtr DoReduce(Reducer* c) override; StmtPtr DoReduce(Reducer* c) override;
protected: protected:
virtual ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const; virtual ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow);
bool IsPure() const override; bool IsPure() const override;
@ -120,7 +118,7 @@ public:
bool NoFlowAfter(bool ignore_break) const override; bool NoFlowAfter(bool ignore_break) const override;
protected: protected:
ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const override; ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
StmtPtr s1; StmtPtr s1;
@ -180,7 +178,7 @@ public:
bool NoFlowAfter(bool ignore_break) const override; bool NoFlowAfter(bool ignore_break) const override;
protected: protected:
ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const override; ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
// Initialize composite hash and case label map. // Initialize composite hash and case label map.
@ -229,7 +227,7 @@ class AddStmt final : public AddDelStmt {
public: public:
explicit AddStmt(ExprPtr e); explicit AddStmt(ExprPtr e);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
// Optimization-related: // Optimization-related:
StmtPtr Duplicate() override; StmtPtr Duplicate() override;
@ -239,7 +237,7 @@ class DelStmt final : public AddDelStmt {
public: public:
explicit DelStmt(ExprPtr e); explicit DelStmt(ExprPtr e);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
// Optimization-related: // Optimization-related:
StmtPtr Duplicate() override; StmtPtr Duplicate() override;
@ -249,7 +247,7 @@ class EventStmt final : public ExprStmt {
public: public:
explicit EventStmt(EventExprPtr e); explicit EventStmt(EventExprPtr e);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
TraversalCode Traverse(TraversalCallback* cb) const override; TraversalCode Traverse(TraversalCallback* cb) const override;
@ -290,7 +288,7 @@ public:
// execute zero times, so it's always the default of "false". // execute zero times, so it's always the default of "false".
protected: protected:
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
ExprPtr loop_condition; ExprPtr loop_condition;
StmtPtr body; StmtPtr body;
@ -339,7 +337,7 @@ public:
// execute zero times, so it's always the default of "false". // execute zero times, so it's always the default of "false".
protected: protected:
ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const override; ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) override;
IDPList* loop_vars; IDPList* loop_vars;
StmtPtr body; StmtPtr body;
@ -352,7 +350,7 @@ class NextStmt final : public Stmt {
public: public:
NextStmt() : Stmt(STMT_NEXT) { } NextStmt() : Stmt(STMT_NEXT) { }
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -371,7 +369,7 @@ class BreakStmt final : public Stmt {
public: public:
BreakStmt() : Stmt(STMT_BREAK) { } BreakStmt() : Stmt(STMT_BREAK) { }
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -391,7 +389,7 @@ class FallthroughStmt final : public Stmt {
public: public:
FallthroughStmt() : Stmt(STMT_FALLTHROUGH) { } FallthroughStmt() : Stmt(STMT_FALLTHROUGH) { }
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -409,7 +407,7 @@ class ReturnStmt final : public ExprStmt {
public: public:
explicit ReturnStmt(ExprPtr e); explicit ReturnStmt(ExprPtr e);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -432,7 +430,7 @@ public:
StmtList(); StmtList();
~StmtList() override; ~StmtList() override;
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
const StmtPList& Stmts() const { return *stmts; } const StmtPList& Stmts() const { return *stmts; }
StmtPList& Stmts() { return *stmts; } StmtPList& Stmts() { return *stmts; }
@ -474,7 +472,7 @@ class InitStmt final : public Stmt {
public: public:
explicit InitStmt(std::vector<IDPtr> arg_inits); explicit InitStmt(std::vector<IDPtr> arg_inits);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
const std::vector<IDPtr>& Inits() const const std::vector<IDPtr>& Inits() const
{ return inits; } { return inits; }
@ -497,7 +495,7 @@ class NullStmt final : public Stmt {
public: public:
NullStmt() : Stmt(STMT_NULL) { } NullStmt() : Stmt(STMT_NULL) { }
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -516,7 +514,7 @@ public:
ExprPtr timeout, bool is_return); ExprPtr timeout, bool is_return);
~WhenStmt() override; ~WhenStmt() override;
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
const Expr* Cond() const { return cond.get(); } const Expr* Cond() const { return cond.get(); }
@ -560,7 +558,7 @@ public:
// or nil if it hasn't (the common case). // or nil if it hasn't (the common case).
StmtPtr AssignStmt() const { return assign_stmt; } StmtPtr AssignStmt() const { return assign_stmt; }
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
bool IsPure() const override; bool IsPure() const override;
@ -597,7 +595,7 @@ class CheckAnyLenStmt : public ExprStmt {
public: public:
explicit CheckAnyLenStmt(ExprPtr e, int expected_len); explicit CheckAnyLenStmt(ExprPtr e, int expected_len);
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) override;
StmtPtr Duplicate() override; StmtPtr Duplicate() override;

View file

@ -54,7 +54,7 @@ public:
~Stmt() override; ~Stmt() override;
virtual ValPtr Exec(Frame* f, StmtFlowType& flow) const = 0; virtual ValPtr Exec(Frame* f, StmtFlowType& flow) = 0;
Stmt* Ref() { zeek::Ref(this); return this; } Stmt* Ref() { zeek::Ref(this); return this; }
StmtPtr ThisPtr() { return {NewRef{}, this}; } StmtPtr ThisPtr() { return {NewRef{}, this}; }

View file

@ -960,7 +960,7 @@ CatchReturnStmt::CatchReturnStmt(StmtPtr _block, NameExprPtr _ret_var)
ret_var = _ret_var; ret_var = _ret_var;
} }
ValPtr CatchReturnStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr CatchReturnStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
@ -1047,7 +1047,7 @@ CheckAnyLenStmt::CheckAnyLenStmt(ExprPtr arg_e, int _expected_len)
expected_len = _expected_len; expected_len = _expected_len;
} }
ValPtr CheckAnyLenStmt::Exec(Frame* f, StmtFlowType& flow) const ValPtr CheckAnyLenStmt::Exec(Frame* f, StmtFlowType& flow)
{ {
RegisterAccess(); RegisterAccess();
flow = FLOW_NEXT; flow = FLOW_NEXT;