ZAM fixes for assignments involving "any" record fields

This commit is contained in:
Vern Paxson 2024-11-10 17:18:14 -08:00 committed by Arne Welzel
parent c7e5e5feea
commit 197d49773c
4 changed files with 28 additions and 1 deletions

View file

@ -1652,6 +1652,9 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt) {
StmtPtr lhs_stmt; StmtPtr lhs_stmt;
StmtPtr rhs_stmt; StmtPtr rhs_stmt;
if ( GetType()->Tag() == TYPE_ANY && op2->GetType()->Tag() != TYPE_ANY )
op2 = with_location_of(make_intrusive<CoerceToAnyExpr>(op2), op2);
auto lhs_e = field_e->Op()->Reduce(c, lhs_stmt); auto lhs_e = field_e->Op()->Reduce(c, lhs_stmt);
auto rhs_e = op2->ReduceToFieldAssignment(c, rhs_stmt); auto rhs_e = op2->ReduceToFieldAssignment(c, rhs_stmt);

View file

@ -77,9 +77,14 @@ macro AssignFromRec(rhs)
for ( size_t i = 0U; i < n; ++i ) for ( size_t i = 0U; i < n; ++i )
{ {
auto rhs_i = rhs->RawField(rhs_map[i]); auto rhs_i = rhs->RawField(rhs_map[i]);
auto& init_i = init_vals[lhs_map[i]];
if ( is_managed[i] ) if ( is_managed[i] )
{
zeek::Ref(rhs_i.ManagedVal()); 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 op Construct-Known-Record-From

View file

@ -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]

View file

@ -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;
}