summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2021-09-11 23:29:24 -0700
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:40 -0400
commit5092d6129a9f1d57752a29f4808fe74e1c6a666b (patch)
treec264ff22042eebf00ed06c4e8754eaac3846c87d
parent554d76afb4ca5cf623fb76bde90fce6f87971be8 (diff)
Fix opt_eq for overridden equality
-rw-r--r--bootstraptest/test_yjit.rb26
-rw-r--r--yjit_codegen.c8
2 files changed, 28 insertions, 6 deletions
diff --git a/bootstraptest/test_yjit.rb b/bootstraptest/test_yjit.rb
index 8ddff90050..1ff6b13f5c 100644
--- a/bootstraptest/test_yjit.rb
+++ b/bootstraptest/test_yjit.rb
@@ -1965,7 +1965,7 @@ assert_equal '[true, false, false, false]', %q{
]
}
-# Redefined eq
+# Redefined String eq
assert_equal 'true', %q{
class String
def ==(other)
@@ -1973,6 +1973,26 @@ assert_equal 'true', %q{
end
end
- "foo" == "bar"
- "foo" == "bar"
+ def eq(a, b)
+ a == b
+ end
+
+ eq("foo", "bar")
+ eq("foo", "bar")
+}
+
+# Redefined Integer eq
+assert_equal 'true', %q{
+ class Integer
+ def ==(other)
+ true
+ end
+ end
+
+ def eq(a, b)
+ a == b
+ end
+
+ eq(1, 2)
+ eq(1, 2)
}
diff --git a/yjit_codegen.c b/yjit_codegen.c
index 2e6613510f..83e6785a97 100644
--- a/yjit_codegen.c
+++ b/yjit_codegen.c
@@ -2048,7 +2048,8 @@ gen_equality_specialized(jitstate_t* jit, ctx_t* ctx, uint8_t *side_exit)
if (FIXNUM_P(comptime_a) && FIXNUM_P(comptime_b)) {
if (!assume_bop_not_redefined(jit->block, INTEGER_REDEFINED_OP_FLAG, BOP_EQ)) {
- return YJIT_CANT_COMPILE;
+ // if overridden, emit the generic version
+ return false;
}
guard_two_fixnums(ctx, side_exit);
@@ -2067,9 +2068,10 @@ gen_equality_specialized(jitstate_t* jit, ctx_t* ctx, uint8_t *side_exit)
return true;
} else if (CLASS_OF(comptime_a) == rb_cString &&
- CLASS_OF(comptime_b) == rb_cString) {
+ CLASS_OF(comptime_b) == rb_cString) {
if (!assume_bop_not_redefined(jit->block, STRING_REDEFINED_OP_FLAG, BOP_EQ)) {
- return YJIT_CANT_COMPILE;
+ // if overridden, emit the generic version
+ return false;
}
// Load a and b in preparation for call later