mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 08:38:20 +00:00
broader support for AST traversal, including Attr and Attributes objects
This commit is contained in:
parent
9a2200e60a
commit
a0fc8ca5e4
10 changed files with 280 additions and 23 deletions
65
src/Expr.cc
65
src/Expr.cc
|
@ -3716,6 +3716,24 @@ TableConstructorExpr::TableConstructorExpr(ListExprPtr constructor_list,
|
|||
}
|
||||
}
|
||||
|
||||
TraversalCode TableConstructorExpr::Traverse(TraversalCallback* cb) const
|
||||
{
|
||||
TraversalCode tc = cb->PreExpr(this);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
tc = op->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
if ( attrs )
|
||||
{
|
||||
tc = attrs->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
}
|
||||
|
||||
tc = cb->PostExpr(this);
|
||||
HANDLE_TC_EXPR_POST(tc);
|
||||
}
|
||||
|
||||
ValPtr TableConstructorExpr::Eval(Frame* f) const
|
||||
{
|
||||
if ( IsError() )
|
||||
|
@ -3834,6 +3852,24 @@ SetConstructorExpr::SetConstructorExpr(ListExprPtr constructor_list,
|
|||
}
|
||||
}
|
||||
|
||||
TraversalCode SetConstructorExpr::Traverse(TraversalCallback* cb) const
|
||||
{
|
||||
TraversalCode tc = cb->PreExpr(this);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
tc = op->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
if ( attrs )
|
||||
{
|
||||
tc = attrs->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
}
|
||||
|
||||
tc = cb->PostExpr(this);
|
||||
HANDLE_TC_EXPR_POST(tc);
|
||||
}
|
||||
|
||||
ValPtr SetConstructorExpr::Eval(Frame* f) const
|
||||
{
|
||||
if ( IsError() )
|
||||
|
@ -4700,15 +4736,15 @@ LambdaExpr::LambdaExpr(std::unique_ptr<function_ingredients> arg_ing, IDPList ar
|
|||
}
|
||||
|
||||
// Install that in the global_scope
|
||||
auto id = install_ID(my_name.c_str(), current_module.c_str(), true, false);
|
||||
lambda_id = install_ID(my_name.c_str(), current_module.c_str(), true, false);
|
||||
|
||||
// Update lamb's name
|
||||
dummy_func->SetName(my_name.c_str());
|
||||
|
||||
auto v = make_intrusive<FuncVal>(std::move(dummy_func));
|
||||
id->SetVal(std::move(v));
|
||||
id->SetType(ingredients->id->GetType());
|
||||
id->SetConst();
|
||||
lambda_id->SetVal(std::move(v));
|
||||
lambda_id->SetType(ingredients->id->GetType());
|
||||
lambda_id->SetConst();
|
||||
}
|
||||
|
||||
void LambdaExpr::CheckCaptures(StmtPtr when_parent)
|
||||
|
@ -4823,8 +4859,11 @@ TraversalCode LambdaExpr::Traverse(TraversalCallback* cb) const
|
|||
TraversalCode tc = cb->PreExpr(this);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
tc = lambda_id->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
tc = ingredients->body->Traverse(cb);
|
||||
HANDLE_TC_STMT_PRE(tc);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
tc = cb->PostExpr(this);
|
||||
HANDLE_TC_EXPR_POST(tc);
|
||||
|
@ -4895,6 +4934,22 @@ TraversalCode EventExpr::Traverse(TraversalCallback* cb) const
|
|||
TraversalCode tc = cb->PreExpr(this);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
auto& f = handler->GetFunc();
|
||||
if ( f )
|
||||
{
|
||||
// We don't traverse the function, because that can lead
|
||||
// to infinite traversals. We do, however, see if we can
|
||||
// locate the corresponding identifier, and traverse that.
|
||||
|
||||
auto& id = lookup_ID(f->Name(), GLOBAL_MODULE_NAME, false, false, false);
|
||||
|
||||
if ( id )
|
||||
{
|
||||
tc = id->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
}
|
||||
}
|
||||
|
||||
tc = args->Traverse(cb);
|
||||
HANDLE_TC_EXPR_PRE(tc);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue