From: nobuyoshi nakada Date: 2005-11-28T19:23:23+09:00 Subject: [ruby-dev:27863] Re: tail call and conservertive GC なかだです。 At Mon, 28 Nov 2005 18:45:12 +0900, Tanaka Akira wrote in [ruby-dev:27859]: > スタックに書き込んではいるようですが、yycompile の動作中には、 > > > 解決しません。ローカル変数は stack frame の中にあって、その > > stack frame は tail call の時点で消えてしまうのです。 > > というわけで存在しないも同じです。 yycompile()までVALUEで渡すとどうでしょうか。node.hのパッチは省略。 Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.425 diff -U2 -p -r1.425 parse.y --- parse.y 21 Nov 2005 13:51:48 -0000 1.425 +++ parse.y 28 Nov 2005 10:20:40 -0000 @@ -4547,10 +4547,13 @@ static void parser_prepare(struct parser #ifndef RIPPER static NODE* -yycompile(struct parser_params *parser, const char *f, int line) +yycompile(VALUE vparser, const char *f, int line) { int n; struct RVarmap *vp, *vars = ruby_dyna_vars; const char *kcode_save; + volatile VALUE parser_save = vparser; + struct parser_params *parser; + Data_Get_Struct(vparser, struct parser_params, parser); if (!compile_for_eval && rb_safe_level() == 0 && rb_const_defined(rb_cObject, rb_intern("SCRIPT_LINES__"))) { @@ -4643,5 +4646,5 @@ rb_compile_string(const char *f, VALUE s NODE* -rb_parser_compile_string(volatile VALUE vparser, const char *f, VALUE s, int line) +rb_parser_compile_string(VALUE vparser, const char *f, VALUE s, int line) { struct parser_params *parser; @@ -4654,5 +4657,5 @@ rb_parser_compile_string(volatile VALUE compile_for_eval = ruby_in_eval; - return yycompile(parser, f, line); + return yycompile(vparser, f, line); } @@ -4664,5 +4667,5 @@ rb_compile_cstr(const char *f, const cha NODE* -rb_parser_compile_cstr(volatile VALUE vparser, const char *f, const char *s, int len, int line) +rb_parser_compile_cstr(VALUE vparser, const char *f, const char *s, int len, int line) { return rb_parser_compile_string(vparser, f, rb_str_new(s, len), line); @@ -4684,5 +4687,5 @@ rb_compile_file(const char *f, VALUE fil NODE* -rb_parser_compile_file(volatile VALUE vparser, const char *f, VALUE file, int start) +rb_parser_compile_file(VALUE vparser, const char *f, VALUE file, int start) { struct parser_params *parser; @@ -4693,5 +4696,5 @@ rb_parser_compile_file(volatile VALUE vp lex_pbeg = lex_p = lex_pend = 0; - return yycompile(parser, f, start); + return yycompile(vparser, f, start); } #endif /* !RIPPER */ -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦