mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 08:38:20 +00:00
Fix record coercion for default inner record fields (addresses #973).
This commit is contained in:
parent
9a88dc500a
commit
7069f679c3
4 changed files with 88 additions and 9 deletions
21
src/Expr.cc
21
src/Expr.cc
|
@ -4026,7 +4026,26 @@ Val* RecordCoerceExpr::Fold(Val* v) const
|
|||
Type()->AsRecordType()->FieldDecl(i)->FindAttr(ATTR_DEFAULT);
|
||||
|
||||
if ( def )
|
||||
val->Assign(i, def->AttrExpr()->Eval(0));
|
||||
{
|
||||
Val* def_val = def->AttrExpr()->Eval(0);
|
||||
BroType* def_type = def_val->Type();
|
||||
BroType* field_type = Type()->AsRecordType()->FieldType(i);
|
||||
|
||||
if ( def_type->Tag() == TYPE_RECORD &&
|
||||
field_type->Tag() == TYPE_RECORD &&
|
||||
! same_type(def_type, field_type) )
|
||||
{
|
||||
Val* tmp = def_val->AsRecordVal()->CoerceTo(
|
||||
field_type->AsRecordType());
|
||||
if ( tmp )
|
||||
{
|
||||
Unref(def_val);
|
||||
def_val = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
val->Assign(i, def_val);
|
||||
}
|
||||
else
|
||||
val->Assign(i, 0);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue