summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorKazuho Oku <[email protected]>2016-12-08 10:22:14 +0900
committerKazuho Oku <[email protected]>2016-12-08 10:27:07 +0900
commitc2e749f878049204239ad63ac9546253aeb6ceeb (patch)
tree104ffc77c0f4f9ed3c01b95877abb30b32226841 /src
parent5930a6ebc7a5ebf0c9b2dfe1d250935e6ddaeceb (diff)
downloadmruby-c2e749f878049204239ad63ac9546253aeb6ceeb.tar.gz
mruby-c2e749f878049204239ad63ac9546253aeb6ceeb.zip
fix issues of mrb_gc_unregister introduced in 09b1185
* fixes partial copy of objects in GC root array (due to missing `* sizeof(mrb_value)`) * restores the behavior that permitted an unregistered object to be used as an argument
Diffstat (limited to 'src')
-rw-r--r--src/gc.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/gc.c b/src/gc.c
index 470fffc5f..f928cc49b 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -453,7 +453,7 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME);
mrb_value table = mrb_gv_get(mrb, root);
struct RArray *a;
- mrb_int i, len;
+ mrb_int i;
if (mrb_nil_p(table)) return;
if (mrb_type(table) != MRB_TT_ARRAY) {
@@ -462,14 +462,13 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
}
a = mrb_ary_ptr(table);
mrb_ary_modify(mrb, a);
- len = a->len-1;
- for (i=0; i<len; i++) {
+ for (i = 0; i < a->len; i++) {
if (mrb_obj_eq(mrb, a->ptr[i], obj)) {
- memmove(&a->ptr[i], &a->ptr[i+1], len-i);
+ a->len--;
+ memmove(&a->ptr[i], &a->ptr[i + 1], (a->len - i) * sizeof(a->ptr[i]));
break;
}
}
- a->len--;
}
MRB_API struct RBasic*