diff --git a/CHANGES b/CHANGES index f7396017ea..3b25054ddc 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +3.1.0-dev.263 | 2019-11-13 13:43:16 -0800 + + * Improve record_fields() BIF to recursively give full container type names (Henri DF) + 3.1.0-dev.257 | 2019-11-11 13:40:11 -0800 * Update embedded CAF to 0.17.3 (Jon Siwek, Corelight) diff --git a/VERSION b/VERSION index 3b5f0925f7..65551215b5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.1.0-dev.257 +3.1.0-dev.263 diff --git a/src/Type.cc b/src/Type.cc index 48f40296f3..c3e12f5a29 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -824,6 +824,38 @@ 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,15 +876,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 - 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 0bcc001b8e..68dcba16fc 100644 --- a/testing/btest/Baseline/bifs.records_fields/out +++ b/testing/btest/Baseline/bifs.records_fields/out @@ -48,3 +48,10 @@ F [a] = [type_name=count, log=F, value=, default_val=], [d] = [type_name=string, log=T, value=, default_val=] } +{ +[b] = [type_name=set[double,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 a6d09d737d..d8b8f488bc 100644 --- a/testing/btest/bifs/records_fields.zeek +++ b/testing/btest/bifs/records_fields.zeek @@ -24,6 +24,14 @@ type r: record { type mystring: string; +type cr: record { + a: set[double]; + b: set[double, 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() { local x: r = [$a=42, $d="Bar", $e=tt]; @@ -47,4 +55,6 @@ event zeek_init() print record_fields("myrec"); print record_fields("tt"); print record_fields("r"); + + print record_fields("cr"); }