@@ -367,7 +367,7 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio
367
367
Insn :: PatchPoint { invariant, state } => return gen_patch_point ( jit, asm, invariant, & function. frame_state ( * state) ) ,
368
368
Insn :: CCall { cfun, args, name : _, return_type : _, elidable : _ } => gen_ccall ( asm, * cfun, opnds ! ( args) ) ?,
369
369
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 ) ) ,
371
371
Insn :: GetGlobal { id, state : _ } => gen_getglobal ( asm, * id) ,
372
372
& Insn :: GetLocal { ep_offset, level } => gen_getlocal_with_ep ( asm, ep_offset, level) ?,
373
373
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 {
592
592
}
593
593
594
594
/// 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
+
596
599
asm_ccall ! ( asm, rb_gvar_set, id. 0 . into( ) , val) ;
600
+ Some ( ( ) )
597
601
}
598
602
599
603
/// Side-exit into the interpreter
0 commit comments