diff --git a/template/Makefile.in b/template/Makefile.in index 1a454fb9db0bb3..7d4b798a838170 100644 --- a/template/Makefile.in +++ b/template/Makefile.in @@ -215,7 +215,9 @@ DTRACE_DEPENDENT_OBJS = array.$(OBJEXT) \ parse.$(OBJEXT) \ string.$(OBJEXT) \ symbol.$(OBJEXT) \ + thread.$(OBJEXT) \ vm.$(OBJEXT) \ + vm_sync.$(OBJEXT) \ $(YJIT_OBJ) \ $(ZJIT_OBJ) diff --git a/thread.c b/thread.c index 22f0fe8e0f73de..2e75c2081e2ab4 100644 --- a/thread.c +++ b/thread.c @@ -6106,6 +6106,7 @@ rb_reset_coverages(void) rb_clear_coverages(); rb_iseq_remove_coverage_all(); GET_VM()->coverages = Qfalse; + GET_VM()->me2counter = Qnil; } VALUE diff --git a/zjit/src/codegen_tests.rs b/zjit/src/codegen_tests.rs index 53cd1061375fc7..705691577601b4 100644 --- a/zjit/src/codegen_tests.rs +++ b/zjit/src/codegen_tests.rs @@ -2043,6 +2043,28 @@ fn test_invokebuiltin_delegate() { "), @"[[], true]"); } +#[test] +fn test_kernel_integer_exception_false_returns_nil() { + with_inlining(|| { + assert_snapshot!(assert_inlines_allowing_exits(" + def test = Integer('x', exception: false) ? 1 : 0; + test + test + "), @"0"); + }); +} + +#[test] +fn test_kernel_float_exception_false_returns_nil() { + with_inlining(|| { + assert_snapshot!(assert_inlines_allowing_exits(" + def test = Float('x', exception: false) ? 1 : 0; + test + test + "), @"0"); + }); +} + #[test] fn test_opt_plus_const() { assert_snapshot!(inspect(" diff --git a/zjit/src/cruby_methods.rs b/zjit/src/cruby_methods.rs index 3608bba453486c..3e4e9ed3768fed 100644 --- a/zjit/src/cruby_methods.rs +++ b/zjit/src/cruby_methods.rs @@ -286,8 +286,8 @@ pub fn init() -> Annotations { annotate_builtin!(rb_cFloat, "zero?", types::BoolExact); annotate_builtin!(rb_cFloat, "positive?", types::BoolExact); annotate_builtin!(rb_cFloat, "negative?", types::BoolExact); - annotate_builtin!(rb_mKernel, "Float", types::Float); - annotate_builtin!(rb_mKernel, "Integer", types::Integer); + annotate_builtin!(rb_mKernel, "Float", types::Float.union(types::NilClass)); + annotate_builtin!(rb_mKernel, "Integer", types::Integer.union(types::NilClass)); annotate_builtin!(rb_mKernel, "class", inline_kernel_class, types::Class, leaf); annotate_builtin!(rb_mKernel, "frozen?", types::BoolExact); annotate_builtin!(rb_cSymbol, "name", types::StringExact); diff --git a/zjit/src/hir/tests.rs b/zjit/src/hir/tests.rs index 41506143853119..a61aa4c11bb7a3 100644 --- a/zjit/src/hir/tests.rs +++ b/zjit/src/hir/tests.rs @@ -5016,7 +5016,7 @@ pub(crate) mod hir_build_tests { } #[test] - fn test_invokebuiltin_delegate_annotated() { + fn test_invokebuiltin_delegate_annotated_float() { assert_contains_opcode("Float", YARVINSN_opt_invokebuiltin_delegate_leave); assert_snapshot!(hir_string("Float"), @" fn Float@: @@ -5037,14 +5037,63 @@ pub(crate) mod hir_build_tests { v12:BasicObject = LoadField v11, :@0x1003 Jump bb3(v8, v9, v10, v12) bb3(v14:BasicObject, v15:BasicObject, v16:BasicObject, v17:BasicObject): - v21:Float = InvokeBuiltin rb_f_float, v14, v15, v16 + v21:NilClass|Float = InvokeBuiltin rb_f_float, v14, v15, v16 Jump bb4(v14, v15, v16, v17, v21) - bb4(v23:BasicObject, v24:BasicObject, v25:BasicObject, v26:BasicObject, v27:Float): + bb4(v23:BasicObject, v24:BasicObject, v25:BasicObject, v26:BasicObject, v27:NilClass|Float): CheckInterrupts Return v27 "); } + #[test] + fn test_invokebuiltin_delegate_annotated_integer() { + assert_contains_opcode("Integer", YARVINSN_opt_invokebuiltin_delegate_leave); + assert_snapshot!(hir_string("Integer"), @" + fn Integer@: + bb1(): + EntryPoint interpreter + v1:BasicObject = LoadSelf + v2:CPtr = LoadSP + v3:BasicObject = LoadField v2, :arg@0x1000 + v4:BasicObject = LoadField v2, :base@0x1001 + v5:BasicObject = LoadField v2, :exception@0x1002 + v6:BasicObject = LoadField v2, :@0x1003 + v7:CPtr = LoadPC + v8:CPtr[CPtr(0x1004)] = Const CPtr(0x1004) + v9:CBool = IsBitEqual v7, v8 + CondBranch v9, bb3(v1, v3, v4, v5, v6), bb7() + bb7(): + Jump bb5(v1, v3, v4, v5, v6) + bb2(): + EntryPoint JIT(0) + v13:BasicObject = LoadArg :self@0 + v14:BasicObject = LoadArg :arg@1 + v15:NilClass = Const Value(nil) + v16:BasicObject = LoadArg :exception@2 + v17:CPtr = GetEP 0 + v18:BasicObject = LoadField v17, :@0x1005 + Jump bb3(v13, v14, v15, v16, v18) + bb3(v28:BasicObject, v29:BasicObject, v30:BasicObject, v31:BasicObject, v32:BasicObject): + v35:Fixnum[0] = Const Value(0) + Jump bb5(v28, v29, v35, v31, v32) + bb4(): + EntryPoint JIT(1) + v21:BasicObject = LoadArg :self@0 + v22:BasicObject = LoadArg :arg@1 + v23:BasicObject = LoadArg :base@2 + v24:BasicObject = LoadArg :exception@3 + v25:CPtr = GetEP 0 + v26:BasicObject = LoadField v25, :@0x1005 + Jump bb5(v21, v22, v23, v24, v26) + bb5(v38:BasicObject, v39:BasicObject, v40:BasicObject, v41:BasicObject, v42:BasicObject): + v46:NilClass|Integer = InvokeBuiltin rb_f_integer, v38, v39, v40, v41 + Jump bb6(v38, v39, v40, v41, v42, v46) + bb6(v48:BasicObject, v49:BasicObject, v50:BasicObject, v51:BasicObject, v52:BasicObject, v53:NilClass|Integer): + CheckInterrupts + Return v53 + "); + } + #[test] fn test_invokebuiltin_cexpr_annotated() { assert_contains_opcode("class", YARVINSN_opt_invokebuiltin_delegate_leave);