accessors and converters for Stmt subclasses

This commit is contained in:
Vern Paxson 2021-01-23 10:33:30 -08:00
parent ca33a15626
commit c380a2a61a
3 changed files with 38 additions and 5 deletions

View file

@ -84,6 +84,18 @@ const InitStmt* Stmt::AsInitStmt() const
return (const InitStmt*) this; 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 const WhenStmt* Stmt::AsWhenStmt() const
{ {
CHECK_TAG(tag, STMT_WHEN, "Stmt::AsWhenStmt", stmt_name) CHECK_TAG(tag, STMT_WHEN, "Stmt::AsWhenStmt", stmt_name)
@ -102,6 +114,18 @@ const ExprStmt* Stmt::AsExprStmt() const
return (const ExprStmt*) this; 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 const ReturnStmt* Stmt::AsReturnStmt() const
{ {
CHECK_TAG(tag, STMT_RETURN, "Stmt::AsReturnStmt", stmt_name) CHECK_TAG(tag, STMT_RETURN, "Stmt::AsReturnStmt", stmt_name)

View file

@ -165,6 +165,7 @@ public:
~SwitchStmt() override; ~SwitchStmt() override;
const case_list* Cases() const { return cases; } const case_list* Cases() const { return cases; }
bool HasDefault() const { return default_case_idx != -1; }
void StmtDescribe(ODesc* d) const override; void StmtDescribe(ODesc* d) const override;
@ -275,20 +276,20 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override; TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related: // Optimization-related:
StmtPtr CondPredStmt() const
{ return loop_cond_pred_stmt; }
StmtPtr Duplicate() override; StmtPtr Duplicate() override;
void Inline(Inliner* inl) override; void Inline(Inliner* inl) override;
bool IsReduced(Reducer* c) const override; bool IsReduced(Reducer* c) const override;
StmtPtr DoReduce(Reducer* c) 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 // Note, no need for a NoFlowAfter method because the loop might
// execute zero times, so it's always the default of "false". // execute zero times, so it's always the default of "false".
const StmtPtr ConditionAsStmt() const
{ return stmt_loop_condition; }
protected: protected:
ValPtr Exec(Frame* f, StmtFlowType& flow) const override; ValPtr Exec(Frame* f, StmtFlowType& flow) const override;

View file

@ -24,13 +24,17 @@ using ValPtr = IntrusivePtr<Val>;
namespace zeek::detail { namespace zeek::detail {
class CatchReturnStmt;
class ExprStmt; class ExprStmt;
class ForStmt; class ForStmt;
class IfStmt;
class InitStmt; class InitStmt;
class PrintStmt;
class ReturnStmt; class ReturnStmt;
class StmtList; class StmtList;
class SwitchStmt; class SwitchStmt;
class WhenStmt; class WhenStmt;
class WhileStmt;
class EventExpr; class EventExpr;
class ListExpr; class ListExpr;
@ -69,8 +73,12 @@ public:
const ForStmt* AsForStmt() const; const ForStmt* AsForStmt() const;
const ExprStmt* AsExprStmt() const; const ExprStmt* AsExprStmt() const;
const PrintStmt* AsPrintStmt() const;
const InitStmt* AsInitStmt() const; const InitStmt* AsInitStmt() const;
const CatchReturnStmt* AsCatchReturnStmt() const;
const ReturnStmt* AsReturnStmt() const; const ReturnStmt* AsReturnStmt() const;
const IfStmt* AsIfStmt() const;
const WhileStmt* AsWhileStmt() const;
const WhenStmt* AsWhenStmt() const; const WhenStmt* AsWhenStmt() const;
const SwitchStmt* AsSwitchStmt() const; const SwitchStmt* AsSwitchStmt() const;