Refactor rb_shape_get_next
to return an ID
Also rename it, and change parameters to be consistent with other transition functions.
This commit is contained in:
parent
e0200cfba0
commit
c9b08882b7
Notes:
git
2025-05-09 08:23:08 +00:00
12
shape.c
12
shape.c
@ -857,16 +857,16 @@ shape_get_next(rb_shape_t *shape, VALUE obj, ID id, bool emit_warnings)
|
||||
return new_shape;
|
||||
}
|
||||
|
||||
rb_shape_t *
|
||||
rb_shape_get_next(rb_shape_t *shape, VALUE obj, ID id)
|
||||
shape_id_t
|
||||
rb_shape_transition_add_ivar(VALUE obj, ID id)
|
||||
{
|
||||
return shape_get_next(shape, obj, id, true);
|
||||
return rb_shape_id(shape_get_next(rb_shape_get_shape(obj), obj, id, true));
|
||||
}
|
||||
|
||||
rb_shape_t *
|
||||
rb_shape_get_next_no_warnings(rb_shape_t *shape, VALUE obj, ID id)
|
||||
shape_id_t
|
||||
rb_shape_transition_add_ivar_no_warnings(VALUE obj, ID id)
|
||||
{
|
||||
return shape_get_next(shape, obj, id, false);
|
||||
return rb_shape_id(shape_get_next(rb_shape_get_shape(obj), obj, id, false));
|
||||
}
|
||||
|
||||
// Same as rb_shape_get_iv_index, but uses a provided valid shape id and index
|
||||
|
5
shape.h
5
shape.h
@ -168,8 +168,9 @@ bool rb_shape_frozen_shape_p(rb_shape_t *shape);
|
||||
shape_id_t rb_shape_transition_frozen(VALUE obj);
|
||||
shape_id_t rb_shape_transition_complex(VALUE obj);
|
||||
bool rb_shape_transition_remove_ivar(VALUE obj, ID id, VALUE *removed);
|
||||
rb_shape_t *rb_shape_get_next(rb_shape_t *shape, VALUE obj, ID id);
|
||||
rb_shape_t *rb_shape_get_next_no_warnings(rb_shape_t *shape, VALUE obj, ID id);
|
||||
shape_id_t rb_shape_transition_add_ivar(VALUE obj, ID id);
|
||||
shape_id_t rb_shape_transition_add_ivar_no_warnings(VALUE obj, ID id);
|
||||
|
||||
rb_shape_t *rb_shape_object_id_shape(VALUE obj);
|
||||
bool rb_shape_has_object_id(rb_shape_t *shape);
|
||||
attr_index_t rb_shape_object_id_index(rb_shape_t *shape);
|
||||
|
@ -1639,7 +1639,8 @@ general_ivar_set(VALUE obj, ID id, VALUE val, void *data,
|
||||
rb_raise(rb_eArgError, "too many instance variables");
|
||||
}
|
||||
|
||||
rb_shape_t *next_shape = rb_shape_get_next(current_shape, obj, id);
|
||||
shape_id_t next_shape_id = rb_shape_transition_add_ivar(obj, id);
|
||||
rb_shape_t *next_shape = RSHAPE(next_shape_id);
|
||||
if (UNLIKELY(rb_shape_too_complex_p(next_shape))) {
|
||||
transition_too_complex_func(obj, data);
|
||||
goto too_complex;
|
||||
|
@ -98,7 +98,7 @@ fn main() {
|
||||
.allowlist_function("RSHAPE")
|
||||
.allowlist_function("rb_shape_id_offset")
|
||||
.allowlist_function("rb_shape_get_iv_index")
|
||||
.allowlist_function("rb_shape_get_next_no_warnings")
|
||||
.allowlist_function("rb_shape_transition_add_ivar_no_warnings")
|
||||
.allowlist_function("rb_shape_id")
|
||||
.allowlist_function("rb_shape_obj_too_complex_p")
|
||||
.allowlist_function("rb_shape_too_complex_p")
|
||||
|
@ -3112,8 +3112,8 @@ fn gen_set_ivar(
|
||||
let mut new_shape_too_complex = false;
|
||||
let new_shape = if !shape_too_complex && receiver_t_object && ivar_index.is_none() {
|
||||
let current_shape = comptime_receiver.shape_of();
|
||||
let next_shape = unsafe { rb_shape_get_next_no_warnings(current_shape, comptime_receiver, ivar_name) };
|
||||
let next_shape_id = unsafe { rb_shape_id(next_shape) };
|
||||
let next_shape_id = unsafe { rb_shape_transition_add_ivar_no_warnings(comptime_receiver, ivar_name) };
|
||||
let next_shape = unsafe { RSHAPE(next_shape_id) };
|
||||
|
||||
// If the VM ran out of shapes, or this class generated too many leaf,
|
||||
// it may be de-optimized into OBJ_TOO_COMPLEX_SHAPE (hash-table).
|
||||
|
6
yjit/src/cruby_bindings.inc.rs
generated
6
yjit/src/cruby_bindings.inc.rs
generated
@ -1093,11 +1093,7 @@ extern "C" {
|
||||
pub fn rb_shape_get_iv_index(shape: *mut rb_shape_t, id: ID, value: *mut attr_index_t) -> bool;
|
||||
pub fn rb_shape_obj_too_complex_p(obj: VALUE) -> bool;
|
||||
pub fn rb_shape_too_complex_p(shape: *mut rb_shape_t) -> bool;
|
||||
pub fn rb_shape_get_next_no_warnings(
|
||||
shape: *mut rb_shape_t,
|
||||
obj: VALUE,
|
||||
id: ID,
|
||||
) -> *mut rb_shape_t;
|
||||
pub fn rb_shape_transition_add_ivar_no_warnings(obj: VALUE, id: ID) -> shape_id_t;
|
||||
pub fn rb_shape_id(shape: *mut rb_shape_t) -> shape_id_t;
|
||||
pub fn rb_gvar_get(arg1: ID) -> VALUE;
|
||||
pub fn rb_gvar_set(arg1: ID, arg2: VALUE) -> VALUE;
|
||||
|
@ -111,7 +111,7 @@ fn main() {
|
||||
.allowlist_function("RSHAPE")
|
||||
.allowlist_function("rb_shape_id_offset")
|
||||
.allowlist_function("rb_shape_get_iv_index")
|
||||
.allowlist_function("rb_shape_get_next_no_warnings")
|
||||
.allowlist_function("rb_shape_transition_add_ivar_no_warnings")
|
||||
.allowlist_function("rb_shape_id")
|
||||
.allowlist_function("rb_shape_obj_too_complex_p")
|
||||
.allowlist_var("SHAPE_ID_NUM_BITS")
|
||||
|
6
zjit/src/cruby_bindings.inc.rs
generated
6
zjit/src/cruby_bindings.inc.rs
generated
@ -872,11 +872,7 @@ unsafe extern "C" {
|
||||
pub fn rb_shape_get_shape_id(obj: VALUE) -> shape_id_t;
|
||||
pub fn rb_shape_get_iv_index(shape: *mut rb_shape_t, id: ID, value: *mut attr_index_t) -> bool;
|
||||
pub fn rb_shape_obj_too_complex_p(obj: VALUE) -> bool;
|
||||
pub fn rb_shape_get_next_no_warnings(
|
||||
shape: *mut rb_shape_t,
|
||||
obj: VALUE,
|
||||
id: ID,
|
||||
) -> *mut rb_shape_t;
|
||||
pub fn rb_shape_transition_add_ivar_no_warnings(obj: VALUE, id: ID) -> shape_id_t;
|
||||
pub fn rb_shape_id(shape: *mut rb_shape_t) -> shape_id_t;
|
||||
pub fn rb_gvar_get(arg1: ID) -> VALUE;
|
||||
pub fn rb_gvar_set(arg1: ID, arg2: VALUE) -> VALUE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user