sundry accessors/cast-ers; RE_Matcher's track their construction values

This commit is contained in:
Vern Paxson 2021-03-18 10:33:10 -07:00
parent 17affdb858
commit d53d2ac755
8 changed files with 50 additions and 3 deletions

View file

@ -96,6 +96,7 @@ class IndexAssignExpr;
class IndexExpr; class IndexExpr;
class IsExpr; class IsExpr;
class InlineExpr; class InlineExpr;
class LambdaExpr;
class ListExpr; class ListExpr;
class NameExpr; class NameExpr;
class RefExpr; class RefExpr;
@ -216,6 +217,7 @@ public:
ZEEK_EXPR_ACCESSOR_DECLS(IndexExpr) ZEEK_EXPR_ACCESSOR_DECLS(IndexExpr)
ZEEK_EXPR_ACCESSOR_DECLS(IsExpr) ZEEK_EXPR_ACCESSOR_DECLS(IsExpr)
ZEEK_EXPR_ACCESSOR_DECLS(InlineExpr) ZEEK_EXPR_ACCESSOR_DECLS(InlineExpr)
ZEEK_EXPR_ACCESSOR_DECLS(LambdaExpr)
ZEEK_EXPR_ACCESSOR_DECLS(ListExpr) ZEEK_EXPR_ACCESSOR_DECLS(ListExpr)
ZEEK_EXPR_ACCESSOR_DECLS(NameExpr) ZEEK_EXPR_ACCESSOR_DECLS(NameExpr)
ZEEK_EXPR_ACCESSOR_DECLS(RefExpr) ZEEK_EXPR_ACCESSOR_DECLS(RefExpr)
@ -1304,7 +1306,9 @@ public:
LambdaExpr(std::unique_ptr<function_ingredients> ingredients, LambdaExpr(std::unique_ptr<function_ingredients> ingredients,
IDPList outer_ids); IDPList outer_ids);
const std::string& Name() const { return my_name; }
const IDPList& OuterIDs() const { return outer_ids; } const IDPList& OuterIDs() const { return outer_ids; }
const function_ingredients& Ingredients() const { return *ingredients; }
ValPtr Eval(Frame* f) const override; ValPtr Eval(Frame* f) const override;
TraversalCode Traverse(TraversalCallback* cb) const override; TraversalCode Traverse(TraversalCallback* cb) const override;
@ -1427,7 +1431,7 @@ class IsExpr final : public UnaryExpr {
public: public:
IsExpr(ExprPtr op, TypePtr t); IsExpr(ExprPtr op, TypePtr t);
TypePtr TestType() const { return t; } const TypePtr& TestType() const { return t; }
// Optimization-related: // Optimization-related:
ExprPtr Duplicate() override; ExprPtr Duplicate() override;

View file

@ -479,7 +479,7 @@ RE_Matcher::RE_Matcher()
re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY); 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_anywhere = new detail::Specific_RE_Matcher(detail::MATCH_ANYWHERE);
re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY); re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY);
@ -511,6 +511,8 @@ void RE_Matcher::MakeCaseInsensitive()
{ {
re_anywhere->MakeCaseInsensitive(); re_anywhere->MakeCaseInsensitive();
re_exact->MakeCaseInsensitive(); re_exact->MakeCaseInsensitive();
is_case_insensitive = true;
} }
bool RE_Matcher::Compile(bool lazy) bool RE_Matcher::Compile(bool lazy)

View file

@ -197,6 +197,7 @@ public:
// Makes the matcher as specified to date case-insensitive. // Makes the matcher as specified to date case-insensitive.
void MakeCaseInsensitive(); void MakeCaseInsensitive();
bool IsCaseInsensitive() const { return is_case_insensitive; }
bool Compile(bool lazy = false); bool Compile(bool lazy = false);
@ -227,6 +228,10 @@ public:
const char* PatternText() const { return re_exact->PatternText(); } const char* PatternText() const { return re_exact->PatternText(); }
const char* AnywherePatternText() const { return re_anywhere->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 unsigned int MemoryAllocation() const
{ {
return padded_sizeof(*this) return padded_sizeof(*this)
@ -235,8 +240,12 @@ public:
} }
protected: protected:
std::string orig_text;
detail::Specific_RE_Matcher* re_anywhere; detail::Specific_RE_Matcher* re_anywhere;
detail::Specific_RE_Matcher* re_exact; detail::Specific_RE_Matcher* re_exact;
bool is_case_insensitive = false;
}; };
} // namespace zeek } // namespace zeek

View file

@ -147,6 +147,18 @@ FuncType* Type::AsFuncType()
return (FuncType*) this; 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 const EnumType* Type::AsEnumType() const
{ {
CHECK_TYPE_TAG(TYPE_ENUM, "Type::AsEnumType"); CHECK_TYPE_TAG(TYPE_ENUM, "Type::AsEnumType");

View file

@ -219,6 +219,9 @@ public:
const FuncType* AsFuncType() const; const FuncType* AsFuncType() const;
FuncType* AsFuncType(); FuncType* AsFuncType();
const FileType* AsFileType() const;
FileType* AsFileType();
const EnumType* AsEnumType() const; const EnumType* AsEnumType() const;
EnumType* AsEnumType(); EnumType* AsEnumType();
@ -595,7 +598,8 @@ public:
// Given an offset, returns the field's name. // Given an offset, returns the field's name.
const char* FieldName(int field) const; 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. // Given an offset, returns the field's TypeDecl.
const TypeDecl* FieldDecl(int field) const; const TypeDecl* FieldDecl(int field) const;

View file

@ -71,6 +71,8 @@ Val::~Val()
CONVERTER(tag, ctype, name) \ CONVERTER(tag, ctype, name) \
CONST_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_PATTERN, PatternVal*, Val::AsPatternVal)
CONVERTERS(TYPE_PORT, PortVal*, Val::AsPortVal) CONVERTERS(TYPE_PORT, PortVal*, Val::AsPortVal)
CONVERTERS(TYPE_SUBNET, SubNetVal*, Val::AsSubNetVal) CONVERTERS(TYPE_SUBNET, SubNetVal*, Val::AsSubNetVal)

View file

@ -61,6 +61,8 @@ class PortVal;
class AddrVal; class AddrVal;
class SubNetVal; class SubNetVal;
class IntervalVal; class IntervalVal;
class FuncVal;
class FileVal;
class PatternVal; class PatternVal;
class TableVal; class TableVal;
class RecordVal; class RecordVal;
@ -143,6 +145,12 @@ UNDERLYING_ACCESSOR_DECL(PatternVal, const RE_Matcher*, AsPattern)
UNDERLYING_ACCESSOR_DECL(TableVal, const PDict<TableEntryVal>*, AsTable) UNDERLYING_ACCESSOR_DECL(TableVal, const PDict<TableEntryVal>*, AsTable)
UNDERLYING_ACCESSOR_DECL(TypeVal, zeek::Type*, AsType) UNDERLYING_ACCESSOR_DECL(TypeVal, zeek::Type*, AsType)
FuncVal* AsFuncVal();
const FuncVal* AsFuncVal() const;
FileVal* AsFileVal();
const FileVal* AsFileVal() const;
PatternVal* AsPatternVal(); PatternVal* AsPatternVal();
const PatternVal* AsPatternVal() const; const PatternVal* AsPatternVal() const;

View file

@ -85,6 +85,12 @@ const AnyIndexExpr* Expr::AsAnyIndexExpr() const
return (const AnyIndexExpr*) this; 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::GetOp1() const { return nullptr; }
ExprPtr Expr::GetOp2() const { return nullptr; } ExprPtr Expr::GetOp2() const { return nullptr; }
ExprPtr Expr::GetOp3() const { return nullptr; } ExprPtr Expr::GetOp3() const { return nullptr; }