mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
ZAM fixes for assignments involving "any" record fields
This commit is contained in:
parent
c7e5e5feea
commit
197d49773c
4 changed files with 28 additions and 1 deletions
|
@ -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<CoerceToAnyExpr>(op2), op2);
|
||||
|
||||
auto lhs_e = field_e->Op()->Reduce(c, lhs_stmt);
|
||||
auto rhs_e = op2->ReduceToFieldAssignment(c, rhs_stmt);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
3
testing/btest/Baseline/opt.regress-any/output
Normal file
3
testing/btest/Baseline/opt.regress-any/output
Normal 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]
|
16
testing/btest/opt/regress-any.zeek
Normal file
16
testing/btest/opt/regress-any.zeek
Normal 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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue