diff --git a/src/Expr.h b/src/Expr.h index d0560942e1..ae275a7a84 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -96,6 +96,7 @@ class IndexAssignExpr; class IndexExpr; class IsExpr; class InlineExpr; +class LambdaExpr; class ListExpr; class NameExpr; class RefExpr; @@ -216,6 +217,7 @@ public: ZEEK_EXPR_ACCESSOR_DECLS(IndexExpr) ZEEK_EXPR_ACCESSOR_DECLS(IsExpr) ZEEK_EXPR_ACCESSOR_DECLS(InlineExpr) + ZEEK_EXPR_ACCESSOR_DECLS(LambdaExpr) ZEEK_EXPR_ACCESSOR_DECLS(ListExpr) ZEEK_EXPR_ACCESSOR_DECLS(NameExpr) ZEEK_EXPR_ACCESSOR_DECLS(RefExpr) @@ -1304,7 +1306,9 @@ public: LambdaExpr(std::unique_ptr ingredients, IDPList outer_ids); + const std::string& Name() const { return my_name; } const IDPList& OuterIDs() const { return outer_ids; } + const function_ingredients& Ingredients() const { return *ingredients; } ValPtr Eval(Frame* f) const override; TraversalCode Traverse(TraversalCallback* cb) const override; @@ -1427,7 +1431,7 @@ class IsExpr final : public UnaryExpr { public: IsExpr(ExprPtr op, TypePtr t); - TypePtr TestType() const { return t; } + const TypePtr& TestType() const { return t; } // Optimization-related: ExprPtr Duplicate() override; diff --git a/src/RE.cc b/src/RE.cc index 9639f8223c..0348dc4284 100644 --- a/src/RE.cc +++ b/src/RE.cc @@ -479,7 +479,7 @@ RE_Matcher::RE_Matcher() re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY); } -RE_Matcher::RE_Matcher(const char* pat) +RE_Matcher::RE_Matcher(const char* pat) : orig_text(pat) { re_anywhere = new detail::Specific_RE_Matcher(detail::MATCH_ANYWHERE); re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY); @@ -511,6 +511,8 @@ void RE_Matcher::MakeCaseInsensitive() { re_anywhere->MakeCaseInsensitive(); re_exact->MakeCaseInsensitive(); + + is_case_insensitive = true; } bool RE_Matcher::Compile(bool lazy) diff --git a/src/RE.h b/src/RE.h index fdbd023fd7..ab1b5a3439 100644 --- a/src/RE.h +++ b/src/RE.h @@ -197,6 +197,7 @@ public: // Makes the matcher as specified to date case-insensitive. void MakeCaseInsensitive(); + bool IsCaseInsensitive() const { return is_case_insensitive; } bool Compile(bool lazy = false); @@ -227,6 +228,10 @@ public: const char* PatternText() const { return re_exact->PatternText(); } const char* AnywherePatternText() const { return re_anywhere->PatternText(); } + // Original text used to construct this matcher. Empty unless + // the main ("explicit") constructor was used. + const char* OrigText() const { return orig_text.c_str(); } + unsigned int MemoryAllocation() const { return padded_sizeof(*this) @@ -235,8 +240,12 @@ public: } protected: + std::string orig_text; + detail::Specific_RE_Matcher* re_anywhere; detail::Specific_RE_Matcher* re_exact; + + bool is_case_insensitive = false; }; } // namespace zeek diff --git a/src/Type.cc b/src/Type.cc index 4f86a97253..2e8bbdd4bf 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -147,6 +147,18 @@ FuncType* Type::AsFuncType() return (FuncType*) this; } +const FileType* Type::AsFileType() const + { + CHECK_TYPE_TAG(TYPE_FILE, "Type::AsFileType"); + return (const FileType*) this; + } + +FileType* Type::AsFileType() + { + CHECK_TYPE_TAG(TYPE_FILE, "Type::AsFileType"); + return (FileType*) this; + } + const EnumType* Type::AsEnumType() const { CHECK_TYPE_TAG(TYPE_ENUM, "Type::AsEnumType"); diff --git a/src/Type.h b/src/Type.h index 7726da52c9..6ea8a47fe3 100644 --- a/src/Type.h +++ b/src/Type.h @@ -219,6 +219,9 @@ public: const FuncType* AsFuncType() const; FuncType* AsFuncType(); + const FileType* AsFileType() const; + FileType* AsFileType(); + const EnumType* AsEnumType() const; EnumType* AsEnumType(); @@ -595,7 +598,8 @@ public: // Given an offset, returns the field's name. const char* FieldName(int field) const; - type_decl_list* Types() { return types; } + const type_decl_list* Types() const { return types; } + type_decl_list* Types() { return types; } // Given an offset, returns the field's TypeDecl. const TypeDecl* FieldDecl(int field) const; diff --git a/src/Val.cc b/src/Val.cc index e76a62d0f8..f1a2681167 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -71,6 +71,8 @@ Val::~Val() CONVERTER(tag, ctype, name) \ CONST_CONVERTER(tag, ctype, name) +CONVERTERS(TYPE_FUNC, FuncVal*, Val::AsFuncVal) +CONVERTERS(TYPE_FILE, FileVal*, Val::AsFileVal) CONVERTERS(TYPE_PATTERN, PatternVal*, Val::AsPatternVal) CONVERTERS(TYPE_PORT, PortVal*, Val::AsPortVal) CONVERTERS(TYPE_SUBNET, SubNetVal*, Val::AsSubNetVal) diff --git a/src/Val.h b/src/Val.h index 3919b344d7..e95f0a2c46 100644 --- a/src/Val.h +++ b/src/Val.h @@ -61,6 +61,8 @@ class PortVal; class AddrVal; class SubNetVal; class IntervalVal; +class FuncVal; +class FileVal; class PatternVal; class TableVal; class RecordVal; @@ -143,6 +145,12 @@ UNDERLYING_ACCESSOR_DECL(PatternVal, const RE_Matcher*, AsPattern) UNDERLYING_ACCESSOR_DECL(TableVal, const PDict*, AsTable) UNDERLYING_ACCESSOR_DECL(TypeVal, zeek::Type*, AsType) + FuncVal* AsFuncVal(); + const FuncVal* AsFuncVal() const; + + FileVal* AsFileVal(); + const FileVal* AsFileVal() const; + PatternVal* AsPatternVal(); const PatternVal* AsPatternVal() const; diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 8002ef37a6..d77f20ea22 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -85,6 +85,12 @@ const AnyIndexExpr* Expr::AsAnyIndexExpr() const return (const AnyIndexExpr*) this; } +const LambdaExpr* Expr::AsLambdaExpr() const + { + CHECK_TAG(tag, EXPR_LAMBDA, "ExprVal::AsLambdaExpr", expr_name) + return (const LambdaExpr*) this; + } + ExprPtr Expr::GetOp1() const { return nullptr; } ExprPtr Expr::GetOp2() const { return nullptr; } ExprPtr Expr::GetOp3() const { return nullptr; }