Allow Zeek function equality comparisons

Equality between two functions acts like a pointer comparison.
This commit is contained in:
Jon Siwek 2020-06-27 23:09:02 -07:00
parent 11949ce37a
commit 6e67a40d24
3 changed files with 28 additions and 0 deletions

View file

@ -1762,6 +1762,7 @@ EqExpr::EqExpr(BroExprTag arg_tag, ExprPtr arg_op1, ExprPtr arg_op2)
case zeek::TYPE_ADDR: case zeek::TYPE_ADDR:
case zeek::TYPE_SUBNET: case zeek::TYPE_SUBNET:
case zeek::TYPE_ERROR: case zeek::TYPE_ERROR:
case zeek::TYPE_FUNC:
break; break;
case zeek::TYPE_ENUM: case zeek::TYPE_ENUM:
@ -1814,6 +1815,11 @@ ValPtr EqExpr::Fold(Val* v1, Val* v2) const
else else
return zeek::val_mgr->Bool(! re->MatchExactly(s)); 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 else
return BinaryExpr::Fold(v1, v2); return BinaryExpr::Fold(v1, v2);

View file

@ -0,0 +1,4 @@
F
T
T
F

View file

@ -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;
}