@@ -367,7 +367,7 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio
367367 Insn :: PatchPoint { invariant, state } => return gen_patch_point ( jit, asm, invariant, & function. frame_state ( * state) ) ,
368368 Insn :: CCall { cfun, args, name : _, return_type : _, elidable : _ } => gen_ccall ( asm, * cfun, opnds ! ( args) ) ?,
369369 Insn :: GetIvar { self_val, id, state : _ } => gen_getivar ( asm, opnd ! ( self_val) , * id) ,
370- Insn :: SetGlobal { id, val, state : _ } => return Some ( gen_setglobal ( asm, * id, opnd ! ( val) ) ) ,
370+ Insn :: SetGlobal { id, val, state } => return gen_setglobal ( jit , asm, * id, opnd ! ( val) , & function . frame_state ( * state ) ) ,
371371 Insn :: GetGlobal { id, state : _ } => gen_getglobal ( asm, * id) ,
372372 & Insn :: GetLocal { ep_offset, level } => gen_getlocal_with_ep ( asm, ep_offset, level) ?,
373373 Insn :: SetLocal { val, ep_offset, level } => return gen_setlocal_with_ep ( asm, opnd ! ( val) , * ep_offset, * level) ,
@@ -592,8 +592,12 @@ fn gen_getglobal(asm: &mut Assembler, id: ID) -> Opnd {
592592}
593593
594594/// Set global variables
595- fn gen_setglobal ( asm : & mut Assembler , id : ID , val : Opnd ) {
595+ fn gen_setglobal ( jit : & mut JITState , asm : & mut Assembler , id : ID , val : Opnd , state : & FrameState ) -> Option < ( ) > {
596+ // When trace_var is used, setting a global variable can cause exceptions
597+ gen_prepare_non_leaf_call ( jit, asm, state) ?;
598+
596599 asm_ccall ! ( asm, rb_gvar_set, id. 0 . into( ) , val) ;
600+ Some ( ( ) )
597601}
598602
599603/// Side-exit into the interpreter
0 commit comments