mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +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 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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
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