summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shape.c6
-rw-r--r--shape.h1
-rw-r--r--yjit/bindgen/src/main.rs1
-rw-r--r--yjit/src/codegen.rs12
-rw-r--r--yjit/src/cruby_bindings.inc.rs3
5 files changed, 17 insertions, 6 deletions
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
@@ -444,6 +444,9 @@ 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;
}
extern "C" {