From: nobu.nakada@... Date: 2002-03-05T17:26:32+09:00 Subject: [ruby-dev:16215] Re: GC after load なかだです。 At Sun, 17 Feb 2002 00:27:06 +0900, Nobuyoshi-Nakada wrote: > > 激しく使い物にならなかったので、parse.yだけ再度。byaccでmake > > testとrubiconまでは一応確認済み。 > > やっぱりいろいろ間違ってました。なんでエラーにならんかなぁ。 というか、単にこれだけでよさそうな感じ。 Index: gc.c =================================================================== RCS file: /cvs/ruby/src/ruby/gc.c,v retrieving revision 1.88 diff -u -2 -p -r1.88 gc.c --- gc.c 2002/02/15 04:43:05 1.88 +++ gc.c 2002/02/15 14:11:34 @@ -829,4 +829,28 @@ static void obj_free _((VALUE)); static void +finalize_list(p) + RVALUE *p; +{ + while (p) { + RVALUE *tmp = p->as.free.next; + run_final((VALUE)p); + p->as.free.flags = 0; + p->as.free.next = freelist; + freelist = p; + p = tmp; + } +} + +void +rb_gc_finalize_deferred() +{ + RVALUE *p; + while (p = deferred_final_list) { + deferred_final_list = 0; + finalize_list(p); + } +} + +static void gc_sweep() { @@ -836,13 +860,5 @@ gc_sweep() if (ruby_in_compile) { - /* should not reclaim nodes during compilation */ - for (i = 0; i < used; i++) { - p = heaps[i]; pend = p + heaps_limits[i]; - while (p < pend) { - if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE) - rb_gc_mark((VALUE)p); - p++; - } - } + rb_gc_mark_parser(); } @@ -889,17 +905,9 @@ gc_sweep() /* clear finalization list */ if (final_list) { - RVALUE *tmp; - if (rb_prohibit_interrupt || ruby_in_compile) { deferred_final_list = final_list; - return; } - - for (p = final_list; p; p = tmp) { - tmp = p->as.free.next; - run_final((VALUE)p); - p->as.free.flags = 0; - p->as.free.next = freelist; - freelist = p; + else { + finalize_list(final_list); } } @@ -1419,12 +1427,6 @@ 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: intern.h =================================================================== RCS file: /cvs/ruby/src/ruby/intern.h,v retrieving revision 1.81 diff -u -2 -p -r1.81 intern.h --- intern.h 2002/02/20 06:33:24 1.81 +++ intern.h 2002/03/05 04:34:47 @@ -202,4 +202,5 @@ VALUE rb_find_file _((VALUE)); void rb_mark_tbl _((struct st_table*)); void rb_mark_hash _((struct st_table*)); +void rb_gc_finalize_deferred _((void)); void rb_gc_mark_maybe _((VALUE)); void rb_gc_mark _((VALUE)); @@ -284,4 +285,5 @@ EXTERN char *ruby_sourcefile; #define yydebug ruby_yydebug int yyparse _((void)); +void rb_gc_mark_parser _((void)); ID rb_id_attrset _((ID)); void rb_parser_append_print _((void)); Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.156 diff -u -2 -p -r1.156 parse.y --- parse.y 2002/02/20 04:31:50 1.156 +++ parse.y 2002/03/05 06:51:02 @@ -2091,4 +2091,16 @@ int ruby__end__seen; static VALUE ruby_debug_lines; +void +rb_gc_mark_parser() +{ + if (!ruby_in_compile) return; +#if !(defined YYBISON && defined HAVE_ALLOCA) + rb_gc_mark_locations((VALUE *)yyvs, (VALUE *)(yyvs + yystacksize - 1)); +#endif + rb_gc_mark_maybe(yylval.val); + rb_gc_mark((VALUE)ruby_eval_tree); + rb_gc_mark((VALUE)ruby_eval_tree_begin); +} + static NODE* yycompile(f, line) @@ -2139,4 +2151,6 @@ yycompile(f, line) if (n == 0) node = ruby_eval_tree; + rb_gc_finalize_deferred(); + return node; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦