Skip to content

Commit fa3c23e

Browse files
authored
ZJIT: Prepare getglobal for non-leaf call (ruby#14387)
Depending on the user's warning level, getting certain global variables may lead to calling `Warning#warn`, which can be redefined by the user. This fixes another `bootstraptest/test_yjit.rb` failure.
1 parent b47ea34 commit fa3c23e

2 files changed

Lines changed: 26 additions & 2 deletions

File tree

test/ruby/test_zjit.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,27 @@ def test(n) = n
7878
}
7979
end
8080

81+
def test_getglobal_with_warning
82+
assert_compiles('"rescued"', %q{
83+
Warning[:deprecated] = true
84+
85+
module Warning
86+
def warn(message)
87+
raise
88+
end
89+
end
90+
91+
def test
92+
$=
93+
rescue
94+
"rescued"
95+
end
96+
97+
$VERBOSE = true
98+
test
99+
}, insns: [:getglobal])
100+
end
101+
81102
def test_setglobal
82103
assert_compiles '1', %q{
83104
def test

zjit/src/codegen.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio
384384
Insn::CCall { cfun, args, name: _, return_type: _, elidable: _ } => gen_ccall(asm, *cfun, opnds!(args)),
385385
Insn::GetIvar { self_val, id, state: _ } => gen_getivar(asm, opnd!(self_val), *id),
386386
Insn::SetGlobal { id, val, state } => no_output!(gen_setglobal(jit, asm, *id, opnd!(val), &function.frame_state(*state))),
387-
Insn::GetGlobal { id, state: _ } => gen_getglobal(asm, *id),
387+
Insn::GetGlobal { id, state } => gen_getglobal(jit, asm, *id, &function.frame_state(*state)),
388388
&Insn::GetLocal { ep_offset, level } => gen_getlocal_with_ep(asm, ep_offset, level),
389389
&Insn::SetLocal { val, ep_offset, level } => no_output!(gen_setlocal_with_ep(asm, opnd!(val), function.type_of(val), ep_offset, level)),
390390
Insn::GetConstantPath { ic, state } => gen_get_constant_path(jit, asm, *ic, &function.frame_state(*state)),
@@ -609,7 +609,10 @@ fn gen_setivar(asm: &mut Assembler, recv: Opnd, id: ID, val: Opnd) {
609609
}
610610

611611
/// Look up global variables
612-
fn gen_getglobal(asm: &mut Assembler, id: ID) -> Opnd {
612+
fn gen_getglobal(jit: &mut JITState, asm: &mut Assembler, id: ID, state: &FrameState) -> Opnd {
613+
// `Warning` module's method `warn` can be called when reading certain global variables
614+
gen_prepare_non_leaf_call(jit, asm, state);
615+
613616
asm_ccall!(asm, rb_gvar_get, id.0.into())
614617
}
615618

0 commit comments

Comments
 (0)