From 17957e0dfca25957556bdccd3590be9b9dee5923 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 16 Aug 2005 15:24:15 +0000 Subject: * eval.c (rb_add_method): preserve safe level in the environment where a method is defined . * eval.c (rb_call0): restore preserved safe level in the method execution. * parse.y (lambda): need separate block variable stack manipulation and lpar_beg maintenance. based on a patch found in [ruby-core:05551] from Mauricio Fernandez . * parse.y (parser_yylex): adjust lpar_beg after tLAMBEG and kDO_LAMBDA. [ruby-core:05551] * parse.y (yycompile): remove unreachable code. [yarv-dev:570] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8994 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index 1c5fb18f67..baf4db6e23 100644 --- a/parse.y +++ b/parse.y @@ -2606,8 +2606,7 @@ primary : literal $$ = dispatch2(iter_block, $1, $2); %*/ } - | tLAMBDA - lambda + | tLAMBDA lambda { $$ = $2; } @@ -3178,13 +3177,15 @@ bv_decl : tIDENTIFIER ; lambda : { - $$ = lpar_beg; - lpar_beg = ++paren_nest; /*%%%*/ $$ = dyna_push(); /*% %*/ - } + } + { + $$ = lpar_beg; + lpar_beg = ++paren_nest; + } f_larglist { $$ = ruby_dyna_vars; @@ -3192,11 +3193,12 @@ lambda : { lambda_body { /*%%%*/ - $$ = $2; - $$->nd_body = block_append($$->nd_body, $4); + $$ = $3; + $$->nd_body = block_append($$->nd_body, $5); dyna_pop($1); + lpar_beg = $2; /*% - $$ = dispatch2(lambda, $2, $4); + $$ = dispatch2(lambda, $3, $5); %*/ } ; @@ -3219,15 +3221,11 @@ f_larglist : '(' f_args opt_bv_decl rparen } ; -lambda_body : tLAMBEG - compstmt - '}' +lambda_body : tLAMBEG compstmt '}' { $$ = $2; } - | kDO_LAMBDA - compstmt - kEND + | kDO_LAMBDA compstmt kEND { $$ = $2; } @@ -4360,7 +4358,6 @@ none : /* none */ } ; %% - # undef parser # undef yylex # undef yylval @@ -4568,10 +4565,6 @@ yycompile(parser, f, line) else { return ruby_eval_tree; } - - if (n == 0) node = ruby_eval_tree; - else ruby_eval_tree_begin = 0; - return node; } #endif /* !RIPPER */ @@ -6485,6 +6478,8 @@ parser_yylex(parser) case '{': if (lpar_beg && lpar_beg == paren_nest) { lex_state = EXPR_BEG; + lpar_beg = 0; + --paren_nest; return tLAMBEG; } if (IS_ARG() || lex_state == EXPR_END || lex_state == EXPR_END2) @@ -6805,6 +6800,8 @@ parser_yylex(parser) } if (kw->id[0] == kDO) { if (lpar_beg && lpar_beg == paren_nest) { + lpar_beg = 0; + --paren_nest; return kDO_LAMBDA; } if (COND_P()) return kDO_COND; @@ -8722,6 +8719,8 @@ parser_initialize(parser) parser->parser_cond_stack = 0; parser->parser_cmdarg_stack = 0; parser->parser_class_nest = 0; + parser->parser_paren_nest = 0; + parser->parser_lpar_beg = 0; parser->parser_in_single = 0; parser->parser_in_def = 0; parser->parser_in_defined = 0; -- cgit v1.2.3