mirror of
https://github.com/zeek/zeek.git
synced 2025-10-04 07:38:19 +00:00
inlining of Zeek script functions
This commit is contained in:
parent
3c39f11726
commit
c42586af2c
63 changed files with 21807 additions and 171 deletions
180
src/Stmt.h
180
src/Stmt.h
|
@ -2,86 +2,27 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
// Zeek statements.
|
||||
|
||||
#include "zeek/StmtBase.h"
|
||||
|
||||
#include "zeek/ZeekList.h"
|
||||
#include "zeek/Dict.h"
|
||||
#include "zeek/ID.h"
|
||||
#include "zeek/Obj.h"
|
||||
#include "zeek/StmtEnums.h"
|
||||
#include "zeek/TraverseTypes.h"
|
||||
|
||||
ZEEK_FORWARD_DECLARE_NAMESPACED(CompositeHash, zeek::detail);
|
||||
ZEEK_FORWARD_DECLARE_NAMESPACED(Frame, zeek::detail);
|
||||
|
||||
namespace zeek::run_state { extern double network_time; }
|
||||
|
||||
namespace zeek::detail {
|
||||
|
||||
class StmtList;
|
||||
class ForStmt;
|
||||
class EventExpr;
|
||||
class ListExpr;
|
||||
|
||||
using EventExprPtr = IntrusivePtr<EventExpr>;
|
||||
using ListExprPtr = IntrusivePtr<ListExpr>;
|
||||
|
||||
class Stmt;
|
||||
using StmtPtr = IntrusivePtr<Stmt>;
|
||||
|
||||
class Stmt : public Obj {
|
||||
public:
|
||||
StmtTag Tag() const { return tag; }
|
||||
|
||||
~Stmt() override;
|
||||
|
||||
virtual ValPtr Exec(Frame* f, StmtFlowType& flow) const = 0;
|
||||
|
||||
Stmt* Ref() { zeek::Ref(this); return this; }
|
||||
|
||||
bool SetLocationInfo(const Location* loc) override
|
||||
{ return Stmt::SetLocationInfo(loc, loc); }
|
||||
bool SetLocationInfo(const Location* start, const Location* end) override;
|
||||
|
||||
// True if the statement has no side effects, false otherwise.
|
||||
virtual bool IsPure() const;
|
||||
|
||||
StmtList* AsStmtList();
|
||||
const StmtList* AsStmtList() const;
|
||||
|
||||
ForStmt* AsForStmt();
|
||||
|
||||
void RegisterAccess() const { last_access = run_state::network_time; access_count++; }
|
||||
void AccessStats(ODesc* d) const;
|
||||
uint32_t GetAccessCount() const { return access_count; }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
|
||||
virtual void IncrBPCount() { ++breakpoint_count; }
|
||||
virtual void DecrBPCount();
|
||||
|
||||
virtual unsigned int BPCount() const { return breakpoint_count; }
|
||||
|
||||
virtual TraversalCode Traverse(TraversalCallback* cb) const = 0;
|
||||
|
||||
protected:
|
||||
explicit Stmt(StmtTag arg_tag);
|
||||
|
||||
void AddTag(ODesc* d) const;
|
||||
void DescribeDone(ODesc* d) const;
|
||||
|
||||
StmtTag tag;
|
||||
int breakpoint_count; // how many breakpoints on this statement
|
||||
|
||||
// FIXME: Learn the exact semantics of mutable.
|
||||
mutable double last_access; // time of last execution
|
||||
mutable uint32_t access_count; // number of executions
|
||||
};
|
||||
|
||||
class ExprListStmt : public Stmt {
|
||||
public:
|
||||
const ListExpr* ExprList() const { return l.get(); }
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ExprListStmt(StmtTag t, ListExprPtr arg_l);
|
||||
|
||||
|
@ -91,7 +32,7 @@ protected:
|
|||
virtual ValPtr DoExec(std::vector<ValPtr> vals,
|
||||
StmtFlowType& flow) const = 0;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
ListExprPtr l;
|
||||
};
|
||||
|
@ -101,6 +42,9 @@ public:
|
|||
template<typename L>
|
||||
explicit PrintStmt(L&& l) : ExprListStmt(STMT_PRINT, std::forward<L>(l)) { }
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
|
||||
protected:
|
||||
ValPtr DoExec(std::vector<ValPtr> vals,
|
||||
StmtFlowType& flow) const override;
|
||||
|
@ -115,10 +59,14 @@ public:
|
|||
|
||||
const Expr* StmtExpr() const { return e.get(); }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ExprStmt(StmtTag t, ExprPtr e);
|
||||
|
||||
|
@ -137,10 +85,14 @@ public:
|
|||
const Stmt* TrueBranch() const { return s1.get(); }
|
||||
const Stmt* FalseBranch() const { return s2.get(); }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const override;
|
||||
bool IsPure() const override;
|
||||
|
@ -167,6 +119,9 @@ public:
|
|||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const;
|
||||
|
||||
// Optimization-related:
|
||||
IntrusivePtr<Case> Duplicate();
|
||||
|
||||
protected:
|
||||
ListExprPtr expr_cases;
|
||||
IDPList* type_cases;
|
||||
|
@ -182,10 +137,14 @@ public:
|
|||
|
||||
const case_list* Cases() const { return cases; }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const override;
|
||||
bool IsPure() const override;
|
||||
|
@ -224,6 +183,9 @@ public:
|
|||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
};
|
||||
|
||||
class DelStmt final : public ExprStmt {
|
||||
|
@ -234,6 +196,9 @@ public:
|
|||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
};
|
||||
|
||||
class EventStmt final : public ExprStmt {
|
||||
|
@ -244,6 +209,9 @@ public:
|
|||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
|
||||
protected:
|
||||
EventExprPtr event_expr;
|
||||
};
|
||||
|
@ -256,15 +224,27 @@ public:
|
|||
|
||||
bool IsPure() const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
const Stmt* CondStmt() const
|
||||
{ return loop_cond_stmt ? loop_cond_stmt.get() : nullptr; }
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
|
||||
ExprPtr loop_condition;
|
||||
StmtPtr body;
|
||||
|
||||
// Optimization-related member variables.
|
||||
|
||||
// When in reduced form, the following holds a statement (which
|
||||
// might be a block) for evaluating the loop's conditional.
|
||||
StmtPtr loop_cond_stmt = nullptr;
|
||||
};
|
||||
|
||||
class ForStmt final : public ExprStmt {
|
||||
|
@ -276,16 +256,21 @@ public:
|
|||
|
||||
void AddBody(StmtPtr arg_body) { body = std::move(arg_body); }
|
||||
|
||||
const IDPList* LoopVar() const { return loop_vars; }
|
||||
const IDPList* LoopVars() const { return loop_vars; }
|
||||
IDPtr ValueVar() const { return value_var; }
|
||||
const Expr* LoopExpr() const { return e.get(); }
|
||||
const Stmt* LoopBody() const { return body.get(); }
|
||||
|
||||
bool IsPure() const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ValPtr DoExec(Frame* f, Val* v, StmtFlowType& flow) const override;
|
||||
|
||||
|
@ -303,10 +288,12 @@ public:
|
|||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
bool IsPure() const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override { return SetSucc(new NextStmt()); }
|
||||
protected:
|
||||
};
|
||||
|
||||
|
@ -317,10 +304,13 @@ public:
|
|||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
bool IsPure() const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override { return SetSucc(new BreakStmt()); }
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
@ -331,10 +321,14 @@ public:
|
|||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
bool IsPure() const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override
|
||||
{ return SetSucc(new FallthroughStmt()); }
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
@ -344,7 +338,14 @@ public:
|
|||
|
||||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
|
||||
// Constructor used for duplication, when we've already done
|
||||
// all of the type-checking.
|
||||
ReturnStmt(ExprPtr e, bool ignored);
|
||||
};
|
||||
|
||||
class StmtList : public Stmt {
|
||||
|
@ -357,10 +358,14 @@ public:
|
|||
const StmtPList& Stmts() const { return stmts; }
|
||||
StmtPList& Stmts() { return stmts; }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
bool IsPure() const override;
|
||||
|
||||
|
@ -374,7 +379,7 @@ public:
|
|||
|
||||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
// "Topmost" means that this is the main body of a function or event.
|
||||
// void SetTopmost(bool is_topmost) { topmost = is_topmost; }
|
||||
|
@ -393,10 +398,13 @@ public:
|
|||
const std::vector<IDPtr>& Inits() const
|
||||
{ return inits; }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
|
||||
protected:
|
||||
std::vector<IDPtr> inits;
|
||||
};
|
||||
|
@ -408,9 +416,12 @@ public:
|
|||
ValPtr Exec(Frame* f, StmtFlowType& flow) const override;
|
||||
bool IsPure() const override;
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override { return SetSucc(new NullStmt()); }
|
||||
};
|
||||
|
||||
class WhenStmt final : public Stmt {
|
||||
|
@ -429,10 +440,14 @@ public:
|
|||
const Expr* TimeoutExpr() const { return timeout.get(); }
|
||||
const Stmt* TimeoutBody() const { return s2.get(); }
|
||||
|
||||
void Describe(ODesc* d) const override;
|
||||
void StmtDescribe(ODesc* d) const override;
|
||||
|
||||
TraversalCode Traverse(TraversalCallback* cb) const override;
|
||||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override;
|
||||
void Inline(Inliner* inl) override;
|
||||
|
||||
protected:
|
||||
ExprPtr cond;
|
||||
StmtPtr s1;
|
||||
|
@ -443,7 +458,6 @@ protected:
|
|||
|
||||
} // namespace zeek::detail
|
||||
|
||||
using Stmt [[deprecated("Remove in v4.1. Use zeek::detail::Stmt instead.")]] = zeek::detail::Stmt;
|
||||
using ExprListStmt [[deprecated("Remove in v4.1. Use zeek::detail::ExprListStmt instead.")]] = zeek::detail::ExprListStmt;
|
||||
using PrintStmt [[deprecated("Remove in v4.1. Use zeek::detail::PrintStmt instead.")]] = zeek::detail::PrintStmt;
|
||||
using ExprStmt [[deprecated("Remove in v4.1. Use zeek::detail::ExprStmt instead.")]] = zeek::detail::ExprStmt;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue