diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-08-16 15:24:15 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-08-16 15:24:15 +0000 |
commit | 17957e0dfca25957556bdccd3590be9b9dee5923 (patch) | |
tree | b85cb6965607683d81965135886dbff708911b3c /parse.y | |
parent | e6a104131a39fd051c1a5ab7111dc67b266a1851 (diff) | |
download | ruby-17957e0dfca25957556bdccd3590be9b9dee5923.tar.gz |
* 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 <mfp@acm.org>.
* 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
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 37 |
1 files changed, 18 insertions, 19 deletions
@@ -2606,8 +2606,7 @@ primary : literal $$ = dispatch2(iter_block, $1, $2); %*/ } - | tLAMBDA - lambda + | tLAMBDA lambda { $$ = $2; } @@ -3178,13 +3177,15 @@ bv_decl : tIDENTIFIER ; lambda : { - $<num>$ = lpar_beg; - lpar_beg = ++paren_nest; /*%%%*/ $<vars>$ = dyna_push(); /*% %*/ - } + } + { + $<num>$ = lpar_beg; + lpar_beg = ++paren_nest; + } f_larglist { $<vars>$ = 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($<vars>1); + lpar_beg = $<num>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; |