@@ -22285,4 +22285,81 @@ mod hir_opt_tests {
2228522285 Return v46
2228622286 ");
2228722287 }
22288+
22289+ #[test]
22290+ fn test_opt_case_dispatch_integer_eqq_redefined_not_specialized() {
22291+ eval(r#"
22292+ class Integer
22293+ def ===(other) = other.to_s == "1"
22294+ end
22295+
22296+ def test(x)
22297+ case x
22298+ when 1 then :a
22299+ when 2 then :b
22300+ else :c
22301+ end
22302+ end
22303+
22304+ test(1)
22305+ test(1)
22306+ "#);
22307+ assert_snapshot!(hir_string("test"), @"
22308+ fn test@<compiled>:7:
22309+ bb1():
22310+ EntryPoint interpreter
22311+ v1:BasicObject = LoadSelf
22312+ v2:CPtr = LoadSP
22313+ v3:BasicObject = LoadField v2, :x@0x1000
22314+ Jump bb3(v1, v3)
22315+ bb2():
22316+ EntryPoint JIT(0)
22317+ v6:BasicObject = LoadArg :self@0
22318+ v7:BasicObject = LoadArg :x@1
22319+ Jump bb3(v6, v7)
22320+ bb3(v9:BasicObject, v10:BasicObject):
22321+ v17:Fixnum[1] = Const Value(1)
22322+ PatchPoint MethodRedefined(Integer@0x1008, ===@0x1010, cme:0x1018)
22323+ PushInlineFrame :===, v17 (0x1040), num_args=1
22324+ PatchPoint MethodRedefined(Integer@0x1008, to_s@0x1068, cme:0x1070)
22325+ v125:Fixnum = GuardType v10, Fixnum recompile
22326+ v126:StringExact = CCallVariadic v125, :Integer#to_s@0x1098
22327+ v88:StringExact[VALUE(0x10a0)] = Const Value(VALUE(0x10a0))
22328+ v89:StringExact = StringCopy v88
22329+ PatchPoint NoSingletonClass(String@0x10a8)
22330+ PatchPoint MethodRedefined(String@0x10a8, ==@0x10b0, cme:0x10b8)
22331+ v131:BoolExact = StringEqual v126, v89
22332+ CheckInterrupts
22333+ PopInlineFrame
22334+ v22:CBool = Test v131
22335+ CondBranch v22, bb5(), bb7()
22336+ bb5():
22337+ v44:StaticSymbol[:a] = Const Value(VALUE(0x10e0))
22338+ CheckInterrupts
22339+ Return v44
22340+ bb7():
22341+ v27:Fixnum[2] = Const Value(2)
22342+ PatchPoint MethodRedefined(Integer@0x1008, ===@0x1010, cme:0x1018)
22343+ PushInlineFrame :===, v27 (0x1040), num_args=1
22344+ PatchPoint MethodRedefined(Integer@0x1008, to_s@0x1068, cme:0x1070)
22345+ v135:StringExact = CCallVariadic v125, :Integer#to_s@0x1098
22346+ v110:StringExact[VALUE(0x10a0)] = Const Value(VALUE(0x10a0))
22347+ v111:StringExact = StringCopy v110
22348+ PatchPoint NoSingletonClass(String@0x10a8)
22349+ PatchPoint MethodRedefined(String@0x10a8, ==@0x10b0, cme:0x10b8)
22350+ v140:BoolExact = StringEqual v135, v111
22351+ CheckInterrupts
22352+ PopInlineFrame
22353+ v32:CBool = Test v140
22354+ CondBranch v32, bb6(), bb8()
22355+ bb6():
22356+ v56:StaticSymbol[:b] = Const Value(VALUE(0x10e8))
22357+ CheckInterrupts
22358+ Return v56
22359+ bb8():
22360+ v68:StaticSymbol[:c] = Const Value(VALUE(0x10f0))
22361+ CheckInterrupts
22362+ Return v68
22363+ ");
22364+ }
2228822365}
0 commit comments