diff --git a/src/Stmt.cc b/src/Stmt.cc index 61c85d6411..afa14465d8 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -84,6 +84,18 @@ const InitStmt* Stmt::AsInitStmt() const return (const InitStmt*) this; } +const IfStmt* Stmt::AsIfStmt() const + { + CHECK_TAG(tag, STMT_IF, "Stmt::AsIfStmt", stmt_name) + return (const IfStmt*) this; + } + +const WhileStmt* Stmt::AsWhileStmt() const + { + CHECK_TAG(tag, STMT_WHILE, "Stmt::AsWhileStmt", stmt_name) + return (const WhileStmt*) this; + } + const WhenStmt* Stmt::AsWhenStmt() const { CHECK_TAG(tag, STMT_WHEN, "Stmt::AsWhenStmt", stmt_name) @@ -102,6 +114,18 @@ const ExprStmt* Stmt::AsExprStmt() const return (const ExprStmt*) this; } +const PrintStmt* Stmt::AsPrintStmt() const + { + CHECK_TAG(tag, STMT_PRINT, "Stmt::AsPrintStmt", stmt_name) + return (const PrintStmt*) this; + } + +const CatchReturnStmt* Stmt::AsCatchReturnStmt() const + { + CHECK_TAG(tag, STMT_CATCH_RETURN, "Stmt::AsCatchReturnStmt", stmt_name) + return (const CatchReturnStmt*) this; + } + const ReturnStmt* Stmt::AsReturnStmt() const { CHECK_TAG(tag, STMT_RETURN, "Stmt::AsReturnStmt", stmt_name) diff --git a/src/Stmt.h b/src/Stmt.h index 99856f4a62..9acbf7726d 100644 --- a/src/Stmt.h +++ b/src/Stmt.h @@ -165,6 +165,7 @@ public: ~SwitchStmt() override; const case_list* Cases() const { return cases; } + bool HasDefault() const { return default_case_idx != -1; } void StmtDescribe(ODesc* d) const override; @@ -275,20 +276,20 @@ public: TraversalCode Traverse(TraversalCallback* cb) const override; // Optimization-related: - StmtPtr CondPredStmt() const - { return loop_cond_pred_stmt; } StmtPtr Duplicate() override; void Inline(Inliner* inl) override; bool IsReduced(Reducer* c) const override; StmtPtr DoReduce(Reducer* c) override; + const ExprPtr& Condition() const { return loop_condition; } + StmtPtr CondPredStmt() const { return loop_cond_pred_stmt; } + const StmtPtr& Body() const { return body; } + const StmtPtr& ConditionAsStmt() const { return stmt_loop_condition; } + // Note, no need for a NoFlowAfter method because the loop might // execute zero times, so it's always the default of "false". - const StmtPtr ConditionAsStmt() const - { return stmt_loop_condition; } - protected: ValPtr Exec(Frame* f, StmtFlowType& flow) const override; diff --git a/src/StmtBase.h b/src/StmtBase.h index c87a466f59..3506800902 100644 --- a/src/StmtBase.h +++ b/src/StmtBase.h @@ -24,13 +24,17 @@ using ValPtr = IntrusivePtr; namespace zeek::detail { +class CatchReturnStmt; class ExprStmt; class ForStmt; +class IfStmt; class InitStmt; +class PrintStmt; class ReturnStmt; class StmtList; class SwitchStmt; class WhenStmt; +class WhileStmt; class EventExpr; class ListExpr; @@ -69,8 +73,12 @@ public: const ForStmt* AsForStmt() const; const ExprStmt* AsExprStmt() const; + const PrintStmt* AsPrintStmt() const; const InitStmt* AsInitStmt() const; + const CatchReturnStmt* AsCatchReturnStmt() const; const ReturnStmt* AsReturnStmt() const; + const IfStmt* AsIfStmt() const; + const WhileStmt* AsWhileStmt() const; const WhenStmt* AsWhenStmt() const; const SwitchStmt* AsSwitchStmt() const;