mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
fixes for script optimization of coerce-to-any expressions
This commit is contained in:
parent
f693f22192
commit
10d5ca5948
4 changed files with 23 additions and 2 deletions
|
@ -1642,6 +1642,9 @@ class CoerceToAnyExpr : public UnaryExpr {
|
|||
public:
|
||||
CoerceToAnyExpr(ExprPtr op);
|
||||
|
||||
bool IsReduced(Reducer* c) const override;
|
||||
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
|
||||
|
||||
protected:
|
||||
ValPtr Fold(Val* v) const override;
|
||||
|
||||
|
|
|
@ -1849,7 +1849,8 @@ void WhenInfo::Build(StmtPtr ws) {
|
|||
auto else_branch = timeout_s ? timeout_s : empty;
|
||||
|
||||
auto do_bodies = make_intrusive<IfStmt>(two_test, s, else_branch);
|
||||
auto dummy_return = make_intrusive<ReturnStmt>(true_const);
|
||||
auto any_true_const = make_intrusive<CoerceToAnyExpr>(true_const);
|
||||
auto dummy_return = make_intrusive<ReturnStmt>(any_true_const);
|
||||
|
||||
auto shebang = make_intrusive<StmtList>(do_test, do_bodies, dummy_return);
|
||||
|
||||
|
|
|
@ -3094,6 +3094,23 @@ CoerceToAnyExpr::CoerceToAnyExpr(ExprPtr arg_op) : UnaryExpr(EXPR_TO_ANY_COERCE,
|
|||
type = base_type(TYPE_ANY);
|
||||
}
|
||||
|
||||
bool CoerceToAnyExpr::IsReduced(Reducer* c) const { return HasReducedOps(c); }
|
||||
|
||||
ExprPtr CoerceToAnyExpr::Reduce(Reducer* c, StmtPtr& red_stmt) {
|
||||
if ( c->Optimizing() )
|
||||
op = c->UpdateExpr(op);
|
||||
|
||||
red_stmt = nullptr;
|
||||
|
||||
if ( ! op->IsSingleton(c) )
|
||||
op = op->ReduceToSingleton(c, red_stmt);
|
||||
|
||||
if ( c->Optimizing() )
|
||||
return ThisPtr();
|
||||
else
|
||||
return AssignToTemporary(c, red_stmt);
|
||||
}
|
||||
|
||||
ValPtr CoerceToAnyExpr::Fold(Val* v) const { return {NewRef{}, v}; }
|
||||
|
||||
ExprPtr CoerceToAnyExpr::Duplicate() { return SetSucc(new CoerceToAnyExpr(op->Duplicate())); }
|
||||
|
|
|
@ -1567,7 +1567,7 @@ unary-expr-op To-Any-Coerce
|
|||
op-type X
|
||||
set-type $1
|
||||
eval auto orig_lhs = frame[z.v1]; /* hold in case z.v1 = z.v2 */
|
||||
AssignV1(ZVal(frame[z.v2].ToVal(z.t), ZAM::any_base_type))
|
||||
frame[z.v1] = ZVal($1.ToVal(z.t), ZAM::any_base_type);
|
||||
ZVal::DeleteManagedType(orig_lhs);
|
||||
|
||||
unary-expr-op From-Any-Coerce
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue