diff --git a/src/Expr.cc b/src/Expr.cc index 3c73a40ff0..d378fcb503 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -159,6 +159,12 @@ EventExprPtr Expr::AsEventExprPtr() return {NewRef{}, (EventExpr*) this}; } +const RefExpr* Expr::AsRefExpr() const + { + CHECK_TAG(tag, EXPR_REF, "ExprVal::AsRefExpr", expr_name) + return (const RefExpr*) this; + } + RefExprPtr Expr::AsRefExprPtr() { CHECK_TAG(tag, EXPR_REF, "ExprVal::AsRefExpr", expr_name) diff --git a/src/Expr.h b/src/Expr.h index 688fb97c32..f0345216a7 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -84,14 +84,19 @@ enum BroExprTag : int { extern const char* expr_name(BroExprTag t); +class AddToExpr; class AssignExpr; class CallExpr; class ConstExpr; class EventExpr; class FieldAssignExpr; class FieldExpr; +class FieldLHSAssignExpr; class ForExpr; +class HasFieldExpr; +class IndexAssignExpr; class IndexExpr; +class InlineExpr; class ListExpr; class NameExpr; class RefExpr; @@ -200,14 +205,19 @@ public: ctype* As ## ctype (); \ IntrusivePtr As ## ctype ## Ptr (); + ZEEK_EXPR_ACCESSOR_DECLS(AddToExpr) ZEEK_EXPR_ACCESSOR_DECLS(AssignExpr) ZEEK_EXPR_ACCESSOR_DECLS(CallExpr) ZEEK_EXPR_ACCESSOR_DECLS(ConstExpr) ZEEK_EXPR_ACCESSOR_DECLS(EventExpr) ZEEK_EXPR_ACCESSOR_DECLS(FieldAssignExpr) ZEEK_EXPR_ACCESSOR_DECLS(FieldExpr) + ZEEK_EXPR_ACCESSOR_DECLS(FieldLHSAssignExpr) ZEEK_EXPR_ACCESSOR_DECLS(ForExpr) + ZEEK_EXPR_ACCESSOR_DECLS(HasFieldExpr) + ZEEK_EXPR_ACCESSOR_DECLS(IndexAssignExpr) ZEEK_EXPR_ACCESSOR_DECLS(IndexExpr) + ZEEK_EXPR_ACCESSOR_DECLS(InlineExpr) ZEEK_EXPR_ACCESSOR_DECLS(ListExpr) ZEEK_EXPR_ACCESSOR_DECLS(NameExpr) ZEEK_EXPR_ACCESSOR_DECLS(RefExpr) @@ -1303,6 +1313,8 @@ public: LambdaExpr(std::unique_ptr ingredients, IDPList outer_ids); + IDPList OuterIDs() const { return outer_ids; } + ValPtr Eval(Frame* f) const override; TraversalCode Traverse(TraversalCallback* cb) const override; diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index da42ac46db..aa49eb3295 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -25,6 +25,12 @@ ConstExpr* Expr::AsConstExpr() return (ConstExpr*) this; } +const FieldExpr* Expr::AsFieldExpr() const + { + CHECK_TAG(tag, EXPR_FIELD, "ExprVal::AsFieldExpr", expr_name) + return (const FieldExpr*) this; + } + FieldExpr* Expr::AsFieldExpr() { CHECK_TAG(tag, EXPR_FIELD, "ExprVal::AsFieldExpr", expr_name) @@ -37,6 +43,30 @@ IntrusivePtr Expr::AsFieldAssignExprPtr() return {NewRef{}, (FieldAssignExpr*) this}; } +const IndexAssignExpr* Expr::AsIndexAssignExpr() const + { + CHECK_TAG(tag, EXPR_INDEX_ASSIGN, "ExprVal::AsIndexAssignExpr", expr_name) + return (const IndexAssignExpr*) this; + } + +const FieldLHSAssignExpr* Expr::AsFieldLHSAssignExpr() const + { + CHECK_TAG(tag, EXPR_FIELD_LHS_ASSIGN, "ExprVal::AsFieldLHSAssignExpr", expr_name) + return (const FieldLHSAssignExpr*) this; + } + +const HasFieldExpr* Expr::AsHasFieldExpr() const + { + CHECK_TAG(tag, EXPR_HAS_FIELD, "ExprVal::AsHasFieldExpr", expr_name) + return (const HasFieldExpr*) this; + } + +const AddToExpr* Expr::AsAddToExpr() const + { + CHECK_TAG(tag, EXPR_ADD_TO, "ExprVal::AsAddToExpr", expr_name) + return (const AddToExpr*) this; + } + ExprPtr Expr::GetOp1() const { return nullptr; } ExprPtr Expr::GetOp2() const { return nullptr; } ExprPtr Expr::GetOp3() const { return nullptr; }