Skip to content

Commit 443ed45

Browse files
committed
Refactor rewrite_cref
1 parent 7c3bbfc commit 443ed45

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

class.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,8 +877,7 @@ static void
877877
clone_method(VALUE old_klass, VALUE new_klass, ID mid, const rb_method_entry_t *me)
878878
{
879879
if (me->def->type == VM_METHOD_TYPE_ISEQ) {
880-
rb_cref_t *new_cref;
881-
rb_vm_rewrite_cref(me->def->body.iseq.cref, old_klass, new_klass, &new_cref);
880+
rb_cref_t *new_cref = rb_vm_rewrite_cref(me->def->body.iseq.cref, old_klass, new_klass);
882881
rb_add_method_iseq(new_klass, mid, me->def->body.iseq.iseqptr, new_cref, METHOD_ENTRY_VISI(me));
883882
}
884883
else {

vm_core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1922,7 +1922,7 @@ void rb_vm_register_special_exception_str(enum ruby_special_exceptions sp, VALUE
19221922

19231923
void rb_gc_mark_machine_context(const rb_execution_context_t *ec);
19241924

1925-
void rb_vm_rewrite_cref(rb_cref_t *node, VALUE old_klass, VALUE new_klass, rb_cref_t **new_cref_ptr);
1925+
rb_cref_t *rb_vm_rewrite_cref(rb_cref_t *node, VALUE old_klass, VALUE new_klass);
19261926

19271927
const rb_callable_method_entry_t *rb_vm_frame_method_entry(const rb_control_frame_t *cfp);
19281928

vm_insnhelper.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -967,23 +967,36 @@ vm_get_const_key_cref(const VALUE *ep)
967967
return NULL;
968968
}
969969

970-
void
971-
rb_vm_rewrite_cref(rb_cref_t *cref, VALUE old_klass, VALUE new_klass, rb_cref_t **new_cref_ptr)
970+
rb_cref_t *
971+
rb_vm_rewrite_cref(rb_cref_t *cref, VALUE old_klass, VALUE new_klass)
972972
{
973-
rb_cref_t *new_cref;
973+
rb_cref_t *new_cref_head = NULL;
974+
rb_cref_t *new_cref_tail = NULL;
975+
976+
#define ADD_NEW_CREF(new_cref) \
977+
if (new_cref_tail) { \
978+
new_cref_tail->next = new_cref; \
979+
} else { \
980+
new_cref_head = new_cref; \
981+
} \
982+
new_cref_tail = new_cref;
974983

975984
while (cref) {
985+
rb_cref_t *new_cref;
976986
if (CREF_CLASS(cref) == old_klass) {
977987
new_cref = vm_cref_new_use_prev(new_klass, METHOD_VISI_UNDEF, FALSE, cref, FALSE);
978-
*new_cref_ptr = new_cref;
979-
return;
988+
ADD_NEW_CREF(new_cref);
989+
return new_cref_head;
980990
}
981991
new_cref = vm_cref_new_use_prev(CREF_CLASS(cref), METHOD_VISI_UNDEF, FALSE, cref, FALSE);
982992
cref = CREF_NEXT(cref);
983-
*new_cref_ptr = new_cref;
984-
new_cref_ptr = &new_cref->next;
993+
ADD_NEW_CREF(new_cref);
985994
}
986-
*new_cref_ptr = NULL;
995+
996+
#undef ADD_NEW_CREF
997+
998+
// Could we just reuse the original cref?
999+
return new_cref_head;
9871000
}
9881001

9891002
static rb_cref_t *

0 commit comments

Comments
 (0)