diff --git a/src/Type.cc b/src/Type.cc index 770d15d48e..64a26b12fe 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -824,6 +824,39 @@ void RecordType::DescribeReST(ODesc* d, bool roles_only) const d->PopType(this); } +static string container_type_name(const BroType* ft) + { + string s; + if ( ft->Tag() == TYPE_RECORD ) + s = "record " + ft->GetName(); + else if ( ft->Tag() == TYPE_VECTOR ) + s = "vector of " + container_type_name(ft->YieldType()); + else if ( ft->Tag() == TYPE_TABLE ) + { + if ( ft->IsSet() ) + s = "set["; + else + s = "table["; + const type_list* tl = ((const IndexType*) ft)->IndexTypes(); + loop_over_list(*tl, i) + { + if ( i > 0 ) + s += ","; + s += container_type_name((*tl)[i]); + } + s += "]"; + if ( ft->YieldType() ) + { + s += " of "; + s += container_type_name(ft->YieldType()); + } + } + else + s = type_name(ft->Tag()); + return s; + } + + TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const { auto rval = new TableVal(internal_type("record_field_table")->AsTableType()); @@ -844,42 +877,11 @@ TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const RecordVal* nr = new RecordVal(internal_type("record_field")->AsRecordType()); - if ( ft->Tag() == TYPE_RECORD ) - nr->Assign(0, new StringVal("record " + ft->GetName())); - else if ( ft->Tag() == TYPE_VECTOR ) - { - string s = fmt("vector of %s", ft->YieldType()->Tag()); - nr->Assign(0, new StringVal(s)); - } - else if ( ft->Tag() == TYPE_TABLE ) - { - string s; - if ( ft->IsSet() ) - s = "set["; - else - s = "table["; - const type_list* tl = ((const IndexType*) ft)->IndexTypes(); - loop_over_list(*tl, i) - { - if ( i > 0 ) - s += ","; - s += type_name((*tl)[i]->Tag()); - } - s += "]"; - if ( ft->YieldType() ) - { - s += " of "; - s += type_name(ft->YieldType()->Tag()); - } - nr->Assign(0, new StringVal(s)); - } - else - nr->Assign(0, new StringVal(type_name(ft->Tag()))); - + string s = container_type_name(ft); + nr->Assign(0, new StringVal(s)); nr->Assign(1, val_mgr->GetBool(logged)); nr->Assign(2, fv); nr->Assign(3, FieldDefault(i)); - Val* field_name = new StringVal(FieldName(i)); rval->Assign(field_name, nr); Unref(field_name); diff --git a/testing/btest/Baseline/bifs.records_fields/out b/testing/btest/Baseline/bifs.records_fields/out index 2a90d4a56c..68dcba16fc 100644 --- a/testing/btest/Baseline/bifs.records_fields/out +++ b/testing/btest/Baseline/bifs.records_fields/out @@ -49,8 +49,9 @@ F [d] = [type_name=string, log=T, value=, default_val=] } { -[a] = [type_name=set[double], log=F, value=, default_val=], [b] = [type_name=set[double,string], log=F, value=, default_val=], -[c] = [type_name=table[double,string] of string, log=F, value=, default_val=], -[d] = [type_name=vector[string], log=F, value=, default_val=] +[c] = [type_name=set[double,record r], log=F, value=, default_val=], +[e] = [type_name=vector of vector of string, log=F, value=, default_val=], +[a] = [type_name=set[double], log=F, value=, default_val=], +[d] = [type_name=table[double,string] of table[string] of vector of string, log=F, value=, default_val=] } diff --git a/testing/btest/bifs/records_fields.zeek b/testing/btest/bifs/records_fields.zeek index c4d98ab521..d8b8f488bc 100644 --- a/testing/btest/bifs/records_fields.zeek +++ b/testing/btest/bifs/records_fields.zeek @@ -27,8 +27,9 @@ type mystring: string; type cr: record { a: set[double]; b: set[double, string]; - c: table[double, string] of string; - d: vector of string; + c: set[double, r]; + d: table[double, string] of table[string] of vector of string; + e: vector of vector of string; }; event zeek_init()