From 26633eb7272c932ec680cdc216402494dfb6e221 Mon Sep 17 00:00:00 2001 From: Henri DF Date: Tue, 12 Nov 2019 13:16:38 +0100 Subject: [PATCH 1/4] Print full container types in record_fields() --- src/Type.cc | 33 +++++++++++++++++-- .../btest/Baseline/bifs.records_fields/out | 6 ++++ testing/btest/bifs/records_fields.zeek | 9 +++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Type.cc b/src/Type.cc index 48f40296f3..4ee5422b43 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -846,8 +846,37 @@ TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const if ( ft->Tag() == TYPE_RECORD ) nr->Assign(0, new StringVal("record " + ft->GetName())); - else - nr->Assign(0, new StringVal(type_name(ft->Tag()))); + else if ( ft->Tag() == TYPE_VECTOR ) + { + string s = "vector["; + s += type_name(ft->YieldType()->Tag()); + s += "]"; + 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()))); nr->Assign(1, val_mgr->GetBool(logged)); nr->Assign(2, fv); diff --git a/testing/btest/Baseline/bifs.records_fields/out b/testing/btest/Baseline/bifs.records_fields/out index 0bcc001b8e..2a90d4a56c 100644 --- a/testing/btest/Baseline/bifs.records_fields/out +++ b/testing/btest/Baseline/bifs.records_fields/out @@ -48,3 +48,9 @@ F [a] = [type_name=count, log=F, value=, default_val=], [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=] +} diff --git a/testing/btest/bifs/records_fields.zeek b/testing/btest/bifs/records_fields.zeek index a6d09d737d..c4d98ab521 100644 --- a/testing/btest/bifs/records_fields.zeek +++ b/testing/btest/bifs/records_fields.zeek @@ -24,6 +24,13 @@ type r: record { type mystring: string; +type cr: record { + a: set[double]; + b: set[double, string]; + c: table[double, string] of string; + d: vector of string; +}; + event zeek_init() { local x: r = [$a=42, $d="Bar", $e=tt]; @@ -47,4 +54,6 @@ event zeek_init() print record_fields("myrec"); print record_fields("tt"); print record_fields("r"); + + print record_fields("cr"); } From a0fa5758a671378dc5e1fc9de11073fbd0d01f63 Mon Sep 17 00:00:00 2001 From: Henri DF Date: Wed, 13 Nov 2019 13:49:06 +0100 Subject: [PATCH 2/4] Apply suggestions from code review Co-Authored-By: Jon Siwek --- src/Type.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Type.cc b/src/Type.cc index 4ee5422b43..c9b92784b3 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -863,12 +863,12 @@ TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const const type_list* tl = ((const IndexType*) ft)->IndexTypes(); loop_over_list(*tl, i) { - if (i > 0) + if ( i > 0 ) s += ","; s += type_name((*tl)[i]->Tag()); } s += "]"; - if (ft->YieldType()) + if ( ft->YieldType() ) { s += " of "; s += type_name(ft->YieldType()->Tag()); From bb8d6bca67809c18ab7d7b9c6b4bd3f88193c7f5 Mon Sep 17 00:00:00 2001 From: Henri DF Date: Wed, 13 Nov 2019 14:06:47 +0100 Subject: [PATCH 3/4] tabify --- src/Type.cc | 56 ++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/Type.cc b/src/Type.cc index c9b92784b3..770d15d48e 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -847,36 +847,34 @@ TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const if ( ft->Tag() == TYPE_RECORD ) nr->Assign(0, new StringVal("record " + ft->GetName())); else if ( ft->Tag() == TYPE_VECTOR ) - { - string s = "vector["; - s += type_name(ft->YieldType()->Tag()); - s += "]"; - nr->Assign(0, new StringVal(s)); - } + { + 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; + 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()))); nr->Assign(1, val_mgr->GetBool(logged)); nr->Assign(2, fv); From a645e38b788a27cd51d6dec9db2b7b41f3bc64b6 Mon Sep 17 00:00:00 2001 From: Henri DF Date: Wed, 13 Nov 2019 15:24:13 +0100 Subject: [PATCH 4/4] Recursively handle into container types in record_fields() --- src/Type.cc | 68 ++++++++++--------- .../btest/Baseline/bifs.records_fields/out | 7 +- testing/btest/bifs/records_fields.zeek | 5 +- 3 files changed, 42 insertions(+), 38 deletions(-) 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()