@@ -774,13 +774,20 @@ gen_set_ivar(jitstate_t *jit, ctx_t *ctx, const int max_chain_depth, VALUE compt
774774 if (iv_index_tbl && rb_iv_index_tbl_lookup (iv_index_tbl , id , & ent )) {
775775 uint32_t ivar_index = ent -> index ;
776776
777- x86opnd_t val_to_write = ctx_stack_pop (ctx , 1 );
777+ val_type_t val_type = ctx_get_opnd_type (ctx , OPND_STACK (0 ));
778+ x86opnd_t val_to_write = ctx_stack_opnd (ctx , 0 );
778779 mov (cb , REG1 , val_to_write );
779780
780781 // Bail if the value to write is a heap object, because this needs a write barrier
781- ADD_COMMENT (cb , "guard value is immediate" );
782- test (cb , REG1 , imm_opnd (RUBY_IMMEDIATE_MASK ));
783- jz_ptr (cb , COUNTED_EXIT (side_exit , setivar_val_heapobject ));
782+ if (!val_type .is_imm ) {
783+ ADD_COMMENT (cb , "guard value is immediate" );
784+ test (cb , REG1 , imm_opnd (RUBY_IMMEDIATE_MASK ));
785+ jz_ptr (cb , COUNTED_EXIT (side_exit , setivar_val_heapobject ));
786+ ctx_set_opnd_type (ctx , OPND_STACK (0 ), TYPE_IMM );
787+ }
788+
789+ // Pop the value to write
790+ ctx_stack_pop (ctx , 1 );
784791
785792 // Bail if this object is frozen
786793 ADD_COMMENT (cb , "guard self is not frozen" );
0 commit comments