Right now the rb_shape_get_next shape caller need to first check if there is capacity left, and if not call rb_shape_transition_shape_capa before it can call rb_shape_get_next.
And on each of these it needs to checks if we got a TOO_COMPLEX back.
All this logic is duplicated in the interpreter, YJIT and RJIT.
Instead we can have rb_shape_get_next do the capacity transition when needed. The caller can compare the old and new shapes capacity to know if resizing is needed. It also can check for TOO_COMPLEX only once.
Refactor rb_shape_transition_shape_capa out
Right now the
rb_shape_get_nextshape caller need tofirst check if there is capacity left, and if not call
rb_shape_transition_shape_capabefore it can callrb_shape_get_next.And on each of these it needs to checks if we got a TOO_COMPLEX
back.
All this logic is duplicated in the interpreter, YJIT and RJIT.
Instead we can have
rb_shape_get_nextdo the capacity transitionwhen needed. The caller can compare the old and new shapes capacity
to know if resizing is needed. It also can check for TOO_COMPLEX
only once.