Skip to content

Commit 09b1185

Browse files
committed
mrb_gc_unregister() to remove one registration; close #3160
when multiple mrb_gc_register() were called for the same object
1 parent 44de80f commit 09b1185

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/gc.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
453453
mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME);
454454
mrb_value table = mrb_gv_get(mrb, root);
455455
struct RArray *a;
456-
mrb_int i, j;
456+
mrb_int i, len;
457457

458458
if (mrb_nil_p(table)) return;
459459
if (mrb_type(table) != MRB_TT_ARRAY) {
@@ -462,12 +462,14 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
462462
}
463463
a = mrb_ary_ptr(table);
464464
mrb_ary_modify(mrb, a);
465-
for (i=j=0; i<a->len; i++) {
466-
if (!mrb_obj_eq(mrb, a->ptr[i], obj)) {
467-
a->ptr[j++] = a->ptr[i];
465+
len = a->len-1;
466+
for (i=0; i<len; i++) {
467+
if (mrb_obj_eq(mrb, a->ptr[i], obj)) {
468+
memmove(&a->ptr[i], &a->ptr[i+1], len-i);
469+
break;
468470
}
469471
}
470-
a->len = j;
472+
a->len--;
471473
}
472474

473475
MRB_API struct RBasic*

0 commit comments

Comments
 (0)