diff options
Diffstat (limited to 'mrbgems/mruby-compiler/core/parse.y')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 8ebf7dd81..cf5f5230f 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -326,7 +326,7 @@ nvars_nest(parser_state *p) static void nvars_block(parser_state *p) { - p->nvars = cons(p->nvars, nint(-1)); + p->nvars = cons(p->nvars, nint(-2)); } static void @@ -673,7 +673,7 @@ new_cvar(parser_state *p, mrb_sym sym) static node* new_nvar(parser_state *p, int num) { - if (!p->nvars || intn(p->nvars->cdr) < 0) { + if (!p->nvars || intn(p->nvars->cdr) < -1) { yyerror(p, "numbered parameter outside block"); } else { int nvars = intn(p->nvars->cdr); @@ -5954,6 +5954,19 @@ parser_yylex(parser_state *p) case '_': if (toklen(p) == 2 && ISDIGIT(tok(p)[1])) { int n = tok(p)[1] - '0'; + node *nvars = p->nvars->car; + + while (nvars) { + if (intn(nvars->cdr) > 0) { + yywarning(p, "numbered parameter in nested block"); + break; + } + nvars->cdr = nint(-1); + nvars = nvars->car; + } + if (intn(p->nvars->cdr) < 0) { + yywarning(p, "numbered parameter in nested block"); + } if (n == 0) { yyerror(p, "_0 is not available"); return 0; |
