From 197d49773cfb352182ba6eb6b515d947c7dfa19b Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Sun, 10 Nov 2024 17:18:14 -0800 Subject: [PATCH] ZAM fixes for assignments involving "any" record fields --- src/script_opt/Expr.cc | 3 +++ src/script_opt/ZAM/OPs/constructors.op | 7 ++++++- testing/btest/Baseline/opt.regress-any/output | 3 +++ testing/btest/opt/regress-any.zeek | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 testing/btest/Baseline/opt.regress-any/output create mode 100644 testing/btest/opt/regress-any.zeek diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 5a04a3bef1..861468b91d 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -1652,6 +1652,9 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt) { StmtPtr lhs_stmt; StmtPtr rhs_stmt; + if ( GetType()->Tag() == TYPE_ANY && op2->GetType()->Tag() != TYPE_ANY ) + op2 = with_location_of(make_intrusive(op2), op2); + auto lhs_e = field_e->Op()->Reduce(c, lhs_stmt); auto rhs_e = op2->ReduceToFieldAssignment(c, rhs_stmt); diff --git a/src/script_opt/ZAM/OPs/constructors.op b/src/script_opt/ZAM/OPs/constructors.op index 6220784a42..700daa3312 100644 --- a/src/script_opt/ZAM/OPs/constructors.op +++ b/src/script_opt/ZAM/OPs/constructors.op @@ -77,9 +77,14 @@ macro AssignFromRec(rhs) for ( size_t i = 0U; i < n; ++i ) { auto rhs_i = rhs->RawField(rhs_map[i]); + auto& init_i = init_vals[lhs_map[i]]; if ( is_managed[i] ) + { zeek::Ref(rhs_i.ManagedVal()); - init_vals[lhs_map[i]] = rhs_i; + if ( init_i ) + ZVal::DeleteManagedType(*init_i); + } + init_i = rhs_i; } op Construct-Known-Record-From diff --git a/testing/btest/Baseline/opt.regress-any/output b/testing/btest/Baseline/opt.regress-any/output new file mode 100644 index 0000000000..9627885028 --- /dev/null +++ b/testing/btest/Baseline/opt.regress-any/output @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +[a=123, b=[abc]] +[a=123, b=1] diff --git a/testing/btest/opt/regress-any.zeek b/testing/btest/opt/regress-any.zeek new file mode 100644 index 0000000000..98c4116392 --- /dev/null +++ b/testing/btest/opt/regress-any.zeek @@ -0,0 +1,16 @@ +# @TEST-DOC: Regression test for reassigning an "any" field +# @TEST-EXEC: zeek -b -O ZAM %INPUT >output +# @TEST-EXEC: btest-diff output + +type X: record { + a: string; + b: any; +}; + +event zeek_init() + { + local x = X($a="123", $b=vector("abc")); + print x; + x$b = 1; + print x; + }