From: nobu.nakada@... Date: 2003-09-26T18:46:01+09:00 Subject: [ruby-dev:21414] deferred finalizers なかだです。 bisonを使っている、つまり!ruby_parser_stack_on_heap()の場合、パー ズ中にもオブジェクトが回収されることがありますが、finalizerが定 義されていても(次のGCまで)実行されません。 * gc.c (rb_gc_finalize_deferred): run deferred finalizers. * ruby.c (load_file): run deferred finalizers for collected objects while compiling. Index: gc.c =================================================================== RCS file: /cvs/ruby/src/ruby/gc.c,v retrieving revision 1.156 diff -u -2 -p -r1.156 gc.c --- gc.c 22 Aug 2003 08:09:57 -0000 1.156 +++ gc.c 12 Sep 2003 07:24:50 -0000 @@ -1569,4 +1569,24 @@ run_final(obj) } +static void +finalize_list(p) + RVALUE **p; +{ + while (*p) { + RVALUE *tmp = p; + p = p->as.free.next; + run_final((VALUE)tmp); + } +} + +void +rb_gc_finalize_deferred() +{ + RVALUE *p = deferred_final_list; + + deferred_final_list = 0; + if (p) finalize_list(p); +} + void rb_gc_call_finalizer_at_exit() @@ -1577,12 +1597,5 @@ rb_gc_call_finalizer_at_exit() /* run finalizers */ if (need_call_final) { - if (deferred_final_list) { - p = deferred_final_list; - while (p) { - RVALUE *tmp = p; - p = p->as.free.next; - run_final((VALUE)tmp); - } - } + finalize_list(deferred_final_list); for (i = 0; i < heaps_used; i++) { p = heaps[i]; pend = p + heaps_limits[i]; Index: ruby.c =================================================================== RCS file: /cvs/ruby/src/ruby/ruby.c,v retrieving revision 1.82 diff -u -2 -p -r1.82 ruby.c --- ruby.c 30 Jul 2003 07:08:55 -0000 1.82 +++ ruby.c 15 Aug 2003 02:45:40 -0000 @@ -909,4 +909,7 @@ load_file(fname, script) rb_gc(); } + else { + rb_gc_finalize_deferred(); + } } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦