From 924ba057ad76f14fb39d17ffe4ffbedeb182f9bd Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 21 Sep 2007 05:51:43 +0000 Subject: * gc.c (gc_mark_rest): copy just used part. * gc.c (gc_mark_children): mark u1 and u2 of NODE_ARGSCAT. * gc.c (os_obj_of): hide T_VALUES too. [ruby-dev:31804] * gc.c (run_final): freeze temporary argument array. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@13479 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ gc.c | 21 ++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8b8dd22f6..129f42a81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Fri Sep 21 14:51:40 2007 Nobuyoshi Nakada + + * gc.c (gc_mark_rest): copy just used part. + + * gc.c (gc_mark_children): mark u1 and u2 of NODE_ARGSCAT. + + * gc.c (os_obj_of): hide T_VALUES too. [ruby-dev:31804] + + * gc.c (run_final): freeze temporary argument array. + Fri Sep 21 04:58:39 2007 Nobuyoshi Nakada * misc/ruby-style.el (ruby-style-label-indent): fix for function top diff --git a/gc.c b/gc.c index c107c4e95..83eb75cb8 100644 --- a/gc.c +++ b/gc.c @@ -712,10 +712,10 @@ gc_mark_rest(void) VALUE *p; p = (mark_stack_ptr - mark_stack) + tmp_arry; - MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX); + MEMCPY(tmp_arry, mark_stack, VALUE, p - tmp_arry); init_mark_stack(); - while(p != tmp_arry){ + while (p != tmp_arry) { p--; gc_mark_children(*p, 0); } @@ -924,6 +924,7 @@ gc_mark_children(VALUE ptr, int lev) case NODE_MODULE: case NODE_ALIAS: case NODE_VALIAS: + case NODE_ARGSCAT: gc_mark((VALUE)obj->as.node.u1.node, lev); /* fall through */ case NODE_FBODY: /* 2 */ @@ -1736,6 +1737,7 @@ os_obj_of(VALUE of) switch (TYPE(p)) { case T_ICLASS: case T_NODE: + case T_VALUES: continue; case T_CLASS: if (FL_TEST(p, FL_SINGLETON)) continue; @@ -1921,8 +1923,9 @@ rb_gc_copy_finalizer(VALUE dest, VALUE obj) } static VALUE -run_single_final(VALUE *args) +run_single_final(VALUE arg) { + VALUE *args = (VALUE *)arg; rb_eval_cmd(args[0], args[1], (int)args[2]); return Qnil; } @@ -1937,19 +1940,23 @@ run_final(VALUE obj) objid = rb_obj_id(obj); /* make obj into id */ rb_thread_critical = Qtrue; args[1] = 0; + if (RARRAY_LEN(finalizers) > 0) { + args[1] = rb_obj_freeze(rb_ary_new3(1, objid)); + } args[2] = (VALUE)rb_safe_level(); for (i=0; i 0) { + args[1] = rb_obj_freeze(rb_ary_new3(1, objid)); + } for (i=0; i