Skip to content

Commit a46575f

Browse files
committed
ZJIT: Temporarily disable buggy defined? codegen
1 parent 8fae944 commit a46575f

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

test/ruby/test_zjit.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,14 @@ def test = return defined?(Foo), defined?(bar), defined?($ruby)
12451245
}, insns: [:defined]
12461246
end
12471247

1248+
def test_defined_with_method_call
1249+
assert_compiles '["method", nil]', %q{
1250+
def test = return defined?("x".reverse(1)), defined?("x".reverse(1).reverse)
1251+
1252+
test
1253+
}, insns: [:defined]
1254+
end
1255+
12481256
def test_defined_yield
12491257
assert_compiles "nil", "defined?(yield)"
12501258
assert_compiles '[nil, nil, "yield"]', %q{

zjit/src/hir.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ pub enum SideExitReason {
439439
CalleeSideExit,
440440
ObjToStringFallback,
441441
UnknownSpecialVariable(u64),
442+
UnhandledDefinedType(usize),
442443
}
443444

444445
impl std::fmt::Display for SideExitReason {
@@ -2957,6 +2958,11 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
29572958
let pushval = get_arg(pc, 2);
29582959
let v = state.stack_pop()?;
29592960
let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state });
2961+
if op_type == DEFINED_METHOD.try_into().unwrap() {
2962+
// TODO(Shopify/ruby#703): Fix codegen for defined?(method call expr)
2963+
fun.push_insn(block, Insn::SideExit { state: exit_id, reason: SideExitReason::UnhandledDefinedType(op_type)});
2964+
break; // End the block
2965+
}
29602966
state.stack_push(fun.push_insn(block, Insn::Defined { op_type, obj, pushval, v, state: exit_id }));
29612967
}
29622968
YARVINSN_definedivar => {

0 commit comments

Comments
 (0)