From a72112accaceb43636375bb7ae8da7fdc5e8a165 Mon Sep 17 00:00:00 2001 From: Johanna Amann Date: Mon, 13 Jun 2016 16:02:06 -0700 Subject: [PATCH] Fix precedence of hook The precedence is now lower than the precedence of &&/|| so that expressions like hook a() && doSomething() work. Addresses BIT-1619 --- src/parse.y | 2 +- testing/btest/Baseline/language.hook/out | 4 ++++ testing/btest/language/hook.bro | 25 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index f9eb7cbe9b..facd7e55ed 100644 --- a/src/parse.y +++ b/src/parse.y @@ -31,12 +31,12 @@ %token TOK_NO_TEST -%nonassoc TOK_HOOK %left ',' '|' %right '=' TOK_ADD_TO TOK_REMOVE_FROM %right '?' ':' %left TOK_OR %left TOK_AND +%nonassoc TOK_HOOK %nonassoc '<' '>' TOK_LE TOK_GE TOK_EQ TOK_NE %left TOK_IN TOK_NOT_IN %left '+' '-' diff --git a/testing/btest/Baseline/language.hook/out b/testing/btest/Baseline/language.hook/out index d4f367f875..28543d5320 100644 --- a/testing/btest/Baseline/language.hook/out +++ b/testing/btest/Baseline/language.hook/out @@ -17,3 +17,7 @@ myhook return F myhook return T myhook, &priority=5, [a=37, b=goobye world] F +myhook5, test +second part ran +myhook5 ran +myhook6, test diff --git a/testing/btest/language/hook.bro b/testing/btest/language/hook.bro index 9c9ab30c18..3edfd9556c 100644 --- a/testing/btest/language/hook.bro +++ b/testing/btest/language/hook.bro @@ -10,6 +10,8 @@ global myhook: hook(r: rec); global myhook2: hook(s: string); # a hook doesn't have to take any arguments global myhook4: hook(); +global myhook5: hook(s: string); +global myhook6: hook(s: string); hook myhook(r: rec) &priority=5 { @@ -72,6 +74,23 @@ hook myhook4() &priority=2 print "myhook4", 2; } +hook myhook5(s: string) + { + print "myhook5", s; + } + +hook myhook6(s: string) + { + print "myhook6", s; + break; + } + +function printMe(s: string): bool + { + print s; + return T; + } + event bro_init() { print hook myhook([$a=1156, $b="hello world"]); @@ -90,4 +109,10 @@ event bro_init() # invoked directly by name. local h = myhook; print hook h([$a=2, $b="it works"]); + + if ( hook myhook5("test") && printMe("second part ran") ) + print "myhook5 ran"; + + if ( ( hook myhook6("test") ) && printMe("second part ran") ) + print "myhook6 ran"; }