mirror of
https://github.com/zeek/zeek.git
synced 2025-10-16 05:28:20 +00:00
Adding a new RecordVal method LookupWithDefault().
The method honors a potential &default attribute, and refs the Val it returns.
This commit is contained in:
parent
ba2c6f6139
commit
d673c8c64c
2 changed files with 17 additions and 3 deletions
17
src/Val.cc
17
src/Val.cc
|
@ -1734,7 +1734,7 @@ void TableVal::CheckExpireAttr(attr_tag at)
|
|||
a->AttrExpr()->Error("value of timeout not fixed");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
expire_time = timeout->AsInterval();
|
||||
|
||||
if ( timer )
|
||||
|
@ -2893,6 +2893,19 @@ Val* RecordVal::Lookup(int field) const
|
|||
return (*AsRecord())[field];
|
||||
}
|
||||
|
||||
Val* RecordVal::LookupWithDefault(int field) const
|
||||
{
|
||||
Val* val = (*AsRecord())[field];
|
||||
|
||||
if ( val )
|
||||
return val->Ref();
|
||||
|
||||
// Check for &default.
|
||||
const Attr* def_attr = record_type->FieldDecl(field)->attrs->FindAttr(ATTR_DEFAULT);
|
||||
|
||||
return def_attr ? def_attr->AttrExpr()->Eval(0) : 0;
|
||||
}
|
||||
|
||||
RecordVal* RecordVal::CoerceTo(const RecordType* t, Val* aggr) const
|
||||
{
|
||||
if ( ! record_promotion_compatible(t->AsRecordType(), Type()->AsRecordType()) )
|
||||
|
@ -3348,7 +3361,7 @@ Val* check_and_promote(Val* v, const BroType* t, int is_init)
|
|||
|
||||
TypeTag t_tag = t->Tag();
|
||||
TypeTag v_tag = vt->Tag();
|
||||
|
||||
|
||||
// More thought definitely needs to go into this.
|
||||
if ( t_tag == TYPE_ANY || v_tag == TYPE_ANY )
|
||||
return v;
|
||||
|
|
|
@ -909,7 +909,8 @@ public:
|
|||
{ return new Val(record_type->NumFields(), TYPE_COUNT); }
|
||||
|
||||
void Assign(int field, Val* new_val, Opcode op = OP_ASSIGN);
|
||||
Val* Lookup(int field) const;
|
||||
Val* Lookup(int field) const; // does not Ref() value.
|
||||
Val* LookupWithDefault(int field) const; // does Ref() value.
|
||||
|
||||
void Describe(ODesc* d) const;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue