From: Minero Aoki Date: 2002-09-06T06:33:27+09:00 Subject: [ruby-dev:18197] VALUEs in yacc stack (Re: autoload patch for ruby-1.7) あおきです。 Subject変え & スレッド切ります。 In mail "[ruby-dev:18195] Re: autoload patch for ruby-1.7" nobu.nakada@nifty.ne.jp wrote: > なかだです。 > > あ、すみません。話を混ぜてしまったのですが、これは malloc で > > yacc のスタックをとる場合です。 > > > > そのときは VALUE がヒープに置かれるので、それをカバーするために > > スイープフェイズに入ってから NODE は無条件にマークしていますよね。 > > でも String は NODE ではないのでそのままスイープされてしまうと > > 思うのです。 > > うーん、そうかも知れません。 > > > つまり malloc な yacc のことを考えるなら、セマンティックスタック > > には (NODE 以外の (ポインタである VALUE)) を入れてはいけないのでは > > ないでしょうか。具体的に問題になるのはこの三つです。 > > > > %token tINTEGER tFLOAT tSTRING_CONTENT > > NODE_LITやNODE_STRに入れて返すようにするってことですね。むしろ、 です。 > rb_gc_mark_parser()を導入するなら、セマンティックスタックもマー > クするようにしたいところですが。 できればそれが一番いいですけど……。インターフェイスが決まって ないので難しいですよね。中田さんの [ruby-dev:16215] では 変数の名前が違うとまずいし、その前の malloc 差し替えるのは ちょっと恐い感じ。 コンパイル中は rb_newobj() にフックをかけてレジストリに 入れておくのはどうだろう。ああでも生成全部フックするのは いくらなんでも遅いか。 あ、 void *yacc_stack = 0; %% program: DUMMY { yacc_stack = &$1; } とするのはどうでしょう?……長さがわからないからだめか。惜しい。 やっぱり全部 NODE を付けるのがシンプルでよさそうです。 とりあえずその方向でパッチ添付。 ------------------------------------------------------------------- 青木峰郎 Index: parse.y =================================================================== RCS file: /home/aamine/cvs/ruby/ruby/parse.y,v retrieving revision 1.209 diff -u -p -r1.209 parse.y --- parse.y 5 Sep 2002 20:00:52 -0000 1.209 +++ parse.y 5 Sep 2002 21:32:45 -0000 @@ -224,14 +224,14 @@ static void top_local_setup(); k__FILE__ %token tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR -%token tINTEGER tFLOAT tSTRING_CONTENT +%token tINTEGER tFLOAT tSTRING_CONTENT %token tNTH_REF tBACK_REF %token tREGEXP_END %type singleton strings string string1 xstring regexp %type string_contents xstring_contents string_content %type words qwords word_list qword_list word -%type literal numeric +%type literal numeric %type bodystmt compstmt stmts stmt expr arg primary command command_call method_call %type expr_value arg_value primary_value %type if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure @@ -1282,9 +1282,6 @@ mrhs_basic : args ',' arg_value ; primary : literal - { - $$ = NEW_LIT($1); - } | strings | xstring | regexp @@ -1738,7 +1735,7 @@ opt_ensure : kENSURE compstmt literal : numeric | symbol { - $$ = ID2SYM($1); + $$ = NEW_LIT(ID2SYM($1)); } ; @@ -1878,7 +1875,7 @@ qword_list : /* none */ } | qword_list tSTRING_CONTENT ' ' { - $$ = list_append($1, NEW_STR($2)); + $$ = list_append($1, $2); } ; @@ -1904,7 +1901,7 @@ xstring_contents: /* none */ } ; -string_content : tSTRING_CONTENT {$$ = NEW_STR($1);} +string_content : tSTRING_CONTENT | tSTRING_DVAR { $1 = lex_strnest; @@ -2917,7 +2914,7 @@ parse_string(quote) } tokfix(); - yylval.val = rb_str_new(tok(), toklen()); + yylval.node = NEW_STR(rb_str_new(tok(), toklen())); return tSTRING_CONTENT; } @@ -3070,7 +3067,7 @@ here_document(here) pushback(c); if ((c = tokadd_string(func, '\n', 0)) == -1) goto error; if (c != '\n') { - yylval.val = rb_str_new(tok(), toklen()); + yylval.node = NEW_STR(rb_str_new(tok(), toklen())); return tSTRING_CONTENT; } tokadd(nextc()); @@ -3080,7 +3077,7 @@ here_document(here) } heredoc_restore(lex_strterm); lex_strterm = NEW_STRTERM(-1, 0, 0); - yylval.val = str; + yylval.node = NEW_STR(str); return tSTRING_CONTENT; } @@ -3386,8 +3383,8 @@ yylex() c = read_escape(); } c &= 0xff; - yylval.val = INT2FIX(c); lex_state = EXPR_END; + yylval.node = NEW_LIT(INT2FIX(c)); return tINTEGER; case '&': @@ -3564,7 +3561,7 @@ yylex() yyerror("numeric literal without digits"); } else if (nondigit) goto trailing_uc; - yylval.val = rb_cstr_to_inum(tok(), 16, Qfalse); + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 16, Qfalse)); return tINTEGER; } if (c == 'b' || c == 'B') { @@ -3588,7 +3585,7 @@ yylex() yyerror("numeric literal without digits"); } else if (nondigit) goto trailing_uc; - yylval.val = rb_cstr_to_inum(tok(), 2, Qfalse); + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 2, Qfalse)); return tINTEGER; } if (c == 'd' || c == 'D') { @@ -3612,7 +3609,7 @@ yylex() yyerror("numeric literal without digits"); } else if (nondigit) goto trailing_uc; - yylval.val = rb_cstr_to_inum(tok(), 10, Qfalse); + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 10, Qfalse)); return tINTEGER; } if (c == '_') { @@ -3643,7 +3640,7 @@ yylex() pushback(c); tokfix(); if (nondigit) goto trailing_uc; - yylval.val = rb_cstr_to_inum(tok(), 8, Qfalse); + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 8, Qfalse)); return tINTEGER; } if (nondigit) { @@ -3659,7 +3656,7 @@ yylex() } else { pushback(c); - yylval.val = INT2FIX(0); + yylval.node = NEW_LIT(INT2FIX(0)); return tINTEGER; } } @@ -3738,10 +3735,10 @@ yylex() rb_warn("Float %s out of range", tok()); errno = 0; } - yylval.val = rb_float_new(d); + yylval.node = NEW_LIT(rb_float_new(d)); return tFLOAT; } - yylval.val = rb_cstr_to_inum(tok(), 10, Qfalse); + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 10, Qfalse)); return tINTEGER; }