Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions template/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
1 change: 1 addition & 0 deletions thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 22 additions & 0 deletions zjit/src/codegen_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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("
Expand Down
4 changes: 2 additions & 2 deletions zjit/src/cruby_methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
55 changes: 52 additions & 3 deletions zjit/src/hir/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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@<internal:kernel>:
Expand All @@ -5037,14 +5037,63 @@ pub(crate) mod hir_build_tests {
v12:BasicObject = LoadField v11, :<empty>@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@<internal:kernel>:
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, :<empty>@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, :<empty>@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, :<empty>@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);
Expand Down