diff --git a/shape.c b/shape.c index db9e331378..7dba1015a0 100644 --- a/shape.c +++ b/shape.c @@ -306,6 +306,12 @@ rb_shape_id_num_bits(void) return SHAPE_ID_NUM_BITS; } +int32_t +rb_shape_id_offset(void) +{ + return 8 - rb_shape_id_num_bits() / 8; +} + uint8_t rb_shape_flag_shift(void) { diff --git a/shape.h b/shape.h index 4ae7c25638..ad8b4ec23d 100644 --- a/shape.h +++ b/shape.h @@ -124,6 +124,7 @@ static inline shape_id_t RCLASS_SHAPE_ID(VALUE obj) bool rb_shape_root_shape_p(rb_shape_t* shape); rb_shape_t * rb_shape_get_root_shape(void); uint8_t rb_shape_id_num_bits(void); +int32_t rb_shape_id_offset(void); uint64_t rb_shape_flag_mask(void); uint8_t rb_shape_flag_shift(void); diff --git a/yjit/bindgen/src/main.rs b/yjit/bindgen/src/main.rs index 0fa2c72d66..5244c84da2 100644 --- a/yjit/bindgen/src/main.rs +++ b/yjit/bindgen/src/main.rs @@ -86,6 +86,7 @@ fn main() { .allowlist_function("rb_shape_get_shape_id") .allowlist_function("rb_shape_get_shape_by_id") .allowlist_function("rb_shape_id_num_bits") + .allowlist_function("rb_shape_id_offset") .allowlist_function("rb_shape_get_iv_index") .allowlist_function("rb_shape_get_next") .allowlist_function("rb_shape_id") diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 14ce15a54e..f904c7e0e1 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -2046,8 +2046,8 @@ fn gen_get_ivar( let expected_shape = unsafe { rb_shape_get_shape_id(comptime_receiver) }; let shape_bit_size = unsafe { rb_shape_id_num_bits() }; // either 16 or 32 depending on RUBY_DEBUG - let shape_byte_size = shape_bit_size / 8; - let shape_opnd = Opnd::mem(shape_bit_size, recv, RUBY_OFFSET_RBASIC_FLAGS + (8 - shape_byte_size as i32)); + let shape_id_offset = unsafe { rb_shape_id_offset() }; + let shape_opnd = Opnd::mem(shape_bit_size, recv, shape_id_offset); asm.comment("guard shape"); asm.cmp(shape_opnd, Opnd::UImm(expected_shape as u64)); @@ -2270,8 +2270,8 @@ fn gen_setinstancevariable( let expected_shape = unsafe { rb_shape_get_shape_id(comptime_receiver) }; let shape_bit_size = unsafe { rb_shape_id_num_bits() }; // either 16 or 32 depending on RUBY_DEBUG - let shape_byte_size = shape_bit_size / 8; - let shape_opnd = Opnd::mem(shape_bit_size, recv, RUBY_OFFSET_RBASIC_FLAGS + (8 - shape_byte_size as i32)); + let shape_id_offset = unsafe { rb_shape_id_offset() }; + let shape_opnd = Opnd::mem(shape_bit_size, recv, shape_id_offset); asm.comment("guard shape"); asm.cmp(shape_opnd, Opnd::UImm(expected_shape as u64)); @@ -2335,8 +2335,8 @@ fn gen_setinstancevariable( asm.comment("write shape"); let shape_bit_size = unsafe { rb_shape_id_num_bits() }; // either 16 or 32 depending on RUBY_DEBUG - let shape_byte_size = shape_bit_size / 8; - let shape_opnd = Opnd::mem(shape_bit_size, recv, RUBY_OFFSET_RBASIC_FLAGS + (8 - shape_byte_size as i32)); + let shape_id_offset = unsafe { rb_shape_id_offset() }; + let shape_opnd = Opnd::mem(shape_bit_size, recv, shape_id_offset); // Store the new shape asm.store(shape_opnd, Opnd::UImm(new_shape_id as u64)); diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index d2ad67e802..6f99a4441d 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -443,6 +443,9 @@ pub type rb_shape_t = rb_shape; extern "C" { pub fn rb_shape_id_num_bits() -> u8; } +extern "C" { + pub fn rb_shape_id_offset() -> i32; +} extern "C" { pub fn rb_shape_flag_mask() -> u64; }