@@ -274,6 +274,7 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio
274274 Insn :: GuardBitEquals { val, expected, state } => gen_guard_bit_equals ( jit, asm, opnd ! ( val) , * expected, & function. frame_state ( * state) ) ?,
275275 Insn :: PatchPoint ( _) => return Some ( ( ) ) , // For now, rb_zjit_bop_redefined() panics. TODO: leave a patch point and fix rb_zjit_bop_redefined()
276276 Insn :: CCall { cfun, args, name : _, return_type : _, elidable : _ } => gen_ccall ( jit, asm, * cfun, args) ?,
277+ Insn :: GetIvar { self_val, id, state : _ } => gen_getivar ( asm, opnd ! ( self_val) , * id) ,
277278 _ => {
278279 debug ! ( "ZJIT: gen_function: unexpected insn {:?}" , insn) ;
279280 return None ;
@@ -297,6 +298,15 @@ fn gen_ccall(jit: &mut JITState, asm: &mut Assembler, cfun: *const u8, args: &[I
297298 Some ( asm. ccall ( cfun, lir_args) )
298299}
299300
301+ /// Emit an uncached instance variable lookup
302+ fn gen_getivar ( asm : & mut Assembler , recv : Opnd , id : ID ) -> Opnd {
303+ asm_comment ! ( asm, "call rb_ivar_get" ) ;
304+ asm. ccall (
305+ rb_ivar_get as * const u8 ,
306+ vec ! [ recv, Opnd :: UImm ( id. 0 ) ] ,
307+ )
308+ }
309+
300310/// Compile an interpreter entry block to be inserted into an ISEQ
301311fn gen_entry_prologue ( asm : & mut Assembler , iseq : IseqPtr ) {
302312 asm_comment ! ( asm, "ZJIT entry point: {}" , iseq_get_location( iseq, 0 ) ) ;
0 commit comments