From bf3c3887fd14eaa46b81b93e5c6f4d43f69b9f01 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Thu, 20 Mar 2014 16:47:20 -0500 Subject: [PATCH] Fix parsing of "local" named table constructors. --- src/parse.y | 20 +++++++++++++++++-- .../Baseline/language.named-table-ctors/out | 4 ++++ testing/btest/language/named-table-ctors.bro | 16 ++++++++++----- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/parse.y b/src/parse.y index 04e41ac158..aa01171a24 100644 --- a/src/parse.y +++ b/src/parse.y @@ -207,6 +207,22 @@ static void extend_record(ID* id, type_decl_list* fields, attr_list* attrs) } } } + +static bool expr_is_table_type_name(const Expr* expr) + { + if ( expr->Tag() != EXPR_NAME ) + return false; + + BroType* type = expr->Type(); + + if ( type->IsTable() ) + return true; + + if ( type->Tag() == TYPE_TYPE ) + return type->AsTypeType()->Type()->IsTable(); + + return false; + } %} %union { @@ -538,13 +554,13 @@ expr: | expr '(' { - if ( $1->Tag() == EXPR_NAME && $1->Type()->IsTable() ) + if ( expr_is_table_type_name($1) ) ++in_init; } opt_expr_list { - if ( $1->Tag() == EXPR_NAME && $1->Type()->IsTable() ) + if ( expr_is_table_type_name($1) ) --in_init; } diff --git a/testing/btest/Baseline/language.named-table-ctors/out b/testing/btest/Baseline/language.named-table-ctors/out index 23554d10f6..273afdd205 100644 --- a/testing/btest/Baseline/language.named-table-ctors/out +++ b/testing/btest/Baseline/language.named-table-ctors/out @@ -17,3 +17,7 @@ [three] = 3.0 } 0 +{ +[42] = forty-two, +[37] = thirty-seven +} diff --git a/testing/btest/language/named-table-ctors.bro b/testing/btest/language/named-table-ctors.bro index 83500488f1..1fad56e30f 100644 --- a/testing/btest/language/named-table-ctors.bro +++ b/testing/btest/language/named-table-ctors.bro @@ -17,8 +17,14 @@ global mytablecomp: FooTableComp = FooTableComp(["test", 1] = "test1", ["cool", 2] = "cool2"); global mytabley: FooTableY = FooTableY(["one"] = 1, ["two"] = 2, ["three"] = 3) &default=0; -print mytable; -print mytablerec; -print mytablecomp; -print mytabley; -print mytabley["test"]; +event bro_init() + { + print mytable; + print mytablerec; + print mytablecomp; + print mytabley; + print mytabley["test"]; + + local loctable = FooTable([42] = "forty-two", [37] = "thirty-seven"); + print loctable; + }