diff --git a/src/object.c b/src/object.c index e930f1f6d8f38a9d407cb741d0bd3bc823173b72..645cd56db6beefb3916e8778434d343e1a3962bc 100644 --- a/src/object.c +++ b/src/object.c @@ -1953,6 +1953,11 @@ PMOD_EXPORT int object_equal_p(struct object *a, struct object *b, struct proces IDENTIFIER_IS_ALIAS(i->identifier_flags)) continue; + /* Do we want to call getters and compare their return values? + * - arne + */ + if (i->run_time_type == PIKE_T_GET_SET) continue; + if(i->run_time_type == T_MIXED) { if(!low_is_equal((struct svalue *)LOW_GET_GLOBAL(a,e,i), diff --git a/src/testsuite.in b/src/testsuite.in index cf1bc945f0eb4cb42bfec4a30db05571420bece8..d488c3794522162ec13d331d39495ca7afaf7dc9 100644 --- a/src/testsuite.in +++ b/src/testsuite.in @@ -4085,6 +4085,16 @@ test_any([[ return Y(5)->x; ]], 7) +test_any([[ + // Triggered fatal since object_equal_p did not handle + // getter/setter identifier correctly + class A { + string `foo() { return "bar"; } + } + + return equal(A(), A()); +]], 1) + test_eval_error([[ // Triggered infinite recursion and core dump. // cf LysLysKOM 18719518/Pike mailinglist 12047.