fix for cloning records with fields of type "any"

This commit is contained in:
Vern Paxson 2021-06-01 08:52:24 -07:00
parent cd8e16e090
commit 099dc99d2b
2 changed files with 8 additions and 5 deletions

View file

@ -2936,7 +2936,8 @@ void RecordVal::ResizeParseTimeRecords(RecordType* revised_rt)
if ( required_length > current_length ) if ( required_length > current_length )
{ {
for ( auto i = current_length; i < required_length; ++i ) for ( auto i = current_length; i < required_length; ++i )
rv->AppendField(revised_rt->FieldDefault(i)); rv->AppendField(revised_rt->FieldDefault(i),
revised_rt->GetFieldType(i));
} }
} }
} }
@ -3123,7 +3124,7 @@ ValPtr RecordVal::DoClone(CloneState* state)
{ {
auto f_i = GetField(i); auto f_i = GetField(i);
auto v = f_i ? f_i->Clone(state) : nullptr; auto v = f_i ? f_i->Clone(state) : nullptr;
rv->AppendField(std::move(v)); rv->AppendField(std::move(v), rt->GetFieldType(i));
} }
return rv; return rv;

View file

@ -1176,13 +1176,15 @@ public:
/** /**
* Appends a value to the record's fields. The caller is responsible * Appends a value to the record's fields. The caller is responsible
* for ensuring that fields are appended in the correct order and * for ensuring that fields are appended in the correct order and
* with the correct type. * with the correct type. The type needs to be passed in because
* it's unsafe to take it from v when the field's type is "any" while
* v is a concrete type.
* @param v The value to append. * @param v The value to append.
*/ */
void AppendField(ValPtr v) void AppendField(ValPtr v, const TypePtr& t)
{ {
if ( v ) if ( v )
record_val->emplace_back(ZVal(v, v->GetType())); record_val->emplace_back(ZVal(v, t));
else else
record_val->emplace_back(std::nullopt); record_val->emplace_back(std::nullopt);
} }