From 6e67a40d24fce6b47ae66c68c7ae436404db16c8 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Sat, 27 Jun 2020 23:09:02 -0700 Subject: [PATCH] Allow Zeek function equality comparisons Equality between two functions acts like a pointer comparison. --- src/Expr.cc | 6 ++++++ .../btest/Baseline/language.func-equality/out | 4 ++++ testing/btest/language/func-equality.zeek | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 testing/btest/Baseline/language.func-equality/out create mode 100644 testing/btest/language/func-equality.zeek diff --git a/src/Expr.cc b/src/Expr.cc index 2742232357..b64f457865 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -1762,6 +1762,7 @@ EqExpr::EqExpr(BroExprTag arg_tag, ExprPtr arg_op1, ExprPtr arg_op2) case zeek::TYPE_ADDR: case zeek::TYPE_SUBNET: case zeek::TYPE_ERROR: + case zeek::TYPE_FUNC: break; case zeek::TYPE_ENUM: @@ -1814,6 +1815,11 @@ ValPtr EqExpr::Fold(Val* v1, Val* v2) const else return zeek::val_mgr->Bool(! re->MatchExactly(s)); } + else if ( op1->GetType()->Tag() == zeek::TYPE_FUNC ) + { + auto res = v1->AsFunc() == v2->AsFunc(); + return val_mgr->Bool(tag == EXPR_EQ ? res : ! res); + } else return BinaryExpr::Fold(v1, v2); diff --git a/testing/btest/Baseline/language.func-equality/out b/testing/btest/Baseline/language.func-equality/out new file mode 100644 index 0000000000..bdaa94f0ea --- /dev/null +++ b/testing/btest/Baseline/language.func-equality/out @@ -0,0 +1,4 @@ +F +T +T +F diff --git a/testing/btest/language/func-equality.zeek b/testing/btest/language/func-equality.zeek new file mode 100644 index 0000000000..5672b9b16f --- /dev/null +++ b/testing/btest/language/func-equality.zeek @@ -0,0 +1,18 @@ +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out + +function foo() + { print "foo"; } + +function bar() + { print "bar"; } + +global baz = bar; + +event zeek_init() + { + print foo == bar; + print foo != bar; + print bar == baz; + print bar != baz; + }