diff --git a/src/Stmt.cc b/src/Stmt.cc index 84f1147272..a832aea2c4 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -19,6 +19,7 @@ #include "zeek/Trigger.h" #include "zeek/IntrusivePtr.h" #include "zeek/logging/Manager.h" +#include "zeek/script_opt/StmtOptInfo.h" #include "zeek/logging/logging.bif.h" @@ -49,11 +50,14 @@ Stmt::Stmt(StmtTag arg_tag) last_access = 0; access_count = 0; + opt_info = new StmtOptInfo(); + SetLocationInfo(&start_location, &end_location); } Stmt::~Stmt() { + delete opt_info; } StmtList* Stmt::AsStmtList() diff --git a/src/StmtBase.h b/src/StmtBase.h index 127fd7c8b3..60432ed7d9 100644 --- a/src/StmtBase.h +++ b/src/StmtBase.h @@ -48,6 +48,8 @@ class Reducer; class Stmt; using StmtPtr = IntrusivePtr; +class StmtOptInfo; + class Stmt : public Obj { public: StmtTag Tag() const { return tag; } @@ -160,6 +162,10 @@ public: return Obj::GetLocationInfo(); } + // Access script optimization information associated with + // this statement. + StmtOptInfo* GetOptInfo() const { return opt_info; } + protected: explicit Stmt(StmtTag arg_tag); @@ -182,6 +188,10 @@ protected: // derived, if any. Used as an aid for generating meaningful // and correctly-localized error messages. StmtPtr original = nullptr; + + // Information associated with the Stmt for purposes of + // script optimization. + StmtOptInfo* opt_info; }; } // namespace detail diff --git a/src/script_opt/StmtOptInfo.h b/src/script_opt/StmtOptInfo.h new file mode 100644 index 0000000000..b001f86447 --- /dev/null +++ b/src/script_opt/StmtOptInfo.h @@ -0,0 +1,25 @@ +// See the file "COPYING" in the main distribution directory for copyright. + +// Auxiliary information associated with statements to aid script +// optimization. + +#pragma once + +namespace zeek::detail { + +class StmtOptInfo { +public: + // We number statements by their traversal order in the AST. + int stmt_num = -1; // -1 = not assigned yet + + // The confluence block nesting associated with the statement. + // We number these using 0 for the outermost block of a function + // (which, strictly speaking, isn't a confluence block). + int block_level = -1; + + // True if we observe that there is a branch out of the statement + // to just beyond its extent, such as due to a "break". + bool contains_branch_beyond = false; +}; + +} // namespace zeek::detail