mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 08:38:20 +00:00
Two small infrastructure extensions for passing information into the
logging framework. - To enable passing a type into a bif, there's now a new BroType-derived class TypeType and a corresponding TYPE_TYPE tag. With that, a Val can now have a type as its value. This is experimental for now. - RecordVal's get a new method CoerceTo() to coerce their value into a another record type with the usual semantics. Most of the code in there was previously in RecordContructorExpr::InitVal(), which is now calling the new CoerceTo() method.
This commit is contained in:
parent
ffa494e428
commit
9d407d882c
5 changed files with 119 additions and 40 deletions
44
src/Expr.cc
44
src/Expr.cc
|
@ -284,7 +284,7 @@ Val* NameExpr::Eval(Frame* f) const
|
|||
Val* v;
|
||||
|
||||
if ( id->AsType() )
|
||||
RunTime("cannot evaluate type name");
|
||||
return new Val(id->AsType(), true);
|
||||
|
||||
if ( id->IsGlobal() )
|
||||
v = id->ID_Val();
|
||||
|
@ -3309,48 +3309,12 @@ RecordConstructorExpr::RecordConstructorExpr(ListExpr* constructor_list)
|
|||
|
||||
Val* RecordConstructorExpr::InitVal(const BroType* t, Val* aggr) const
|
||||
{
|
||||
if ( ! aggr )
|
||||
aggr = new RecordVal(const_cast<RecordType*>(t->AsRecordType()));
|
||||
RecordVal* rv = Eval(0)->AsRecordVal();
|
||||
RecordVal* ar = rv->CoerceTo(t->AsRecordType(), aggr);
|
||||
|
||||
if ( record_promotion_compatible(t->AsRecordType(), Type()->AsRecordType()) )
|
||||
if ( ar )
|
||||
{
|
||||
RecordVal* ar = aggr->AsRecordVal();
|
||||
RecordType* ar_t = aggr->Type()->AsRecordType();
|
||||
|
||||
RecordVal* rv = Eval(0)->AsRecordVal();
|
||||
RecordType* rv_t = rv->Type()->AsRecordType();
|
||||
|
||||
int i;
|
||||
for ( i = 0; i < rv_t->NumFields(); ++i )
|
||||
{
|
||||
int t_i = ar_t->FieldOffset(rv_t->FieldName(i));
|
||||
|
||||
if ( t_i < 0 )
|
||||
{
|
||||
char buf[512];
|
||||
safe_snprintf(buf, sizeof(buf),
|
||||
"orphan field \"%s\" in initialization",
|
||||
rv_t->FieldName(i));
|
||||
Error(buf);
|
||||
break;
|
||||
}
|
||||
|
||||
else
|
||||
ar->Assign(t_i, rv->Lookup(i)->Ref());
|
||||
}
|
||||
|
||||
for ( i = 0; i < ar_t->NumFields(); ++i )
|
||||
if ( ! ar->Lookup(i) &&
|
||||
! ar_t->FieldDecl(i)->FindAttr(ATTR_OPTIONAL) )
|
||||
{
|
||||
char buf[512];
|
||||
safe_snprintf(buf, sizeof(buf),
|
||||
"non-optional field \"%s\" missing in initialization", ar_t->FieldName(i));
|
||||
Error(buf);
|
||||
}
|
||||
|
||||
Unref(rv);
|
||||
|
||||
return ar;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue