From 74f564b0bb2f886ffc1c7ccd2a8c49c4265ad9dd Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Sat, 21 Dec 2019 18:43:09 +0900 Subject: `_0` is not numbered parameter #### Before this patch: ```console $ bin/mruby rb -e '_0=:l; p ->{_0}.()' -e:1:13: _0 is not available -e:1:13: syntax error, unexpected $end, expecting '}' ``` #### After this patch (same as Ruby): ```console $ bin/mruby rb -e '_0=:l; p ->{_0}.()' :l ``` --- mrbgems/mruby-compiler/core/parse.y | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) (limited to 'mrbgems/mruby-compiler') diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 50bd01ba2..2580b7ba5 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -74,8 +74,6 @@ typedef unsigned int stack_type; #define NUM_SUFFIX_R (1<<0) #define NUM_SUFFIX_I (1<<1) -#define NUMPARAM_MAX 9 - static inline mrb_sym intern_cstr_gen(parser_state *p, const char *s) { @@ -5954,30 +5952,25 @@ parser_yylex(parser_state *p) case '_': if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) { int n = tok(p)[1] - '0'; - node *nvars = p->nvars->car; - while (nvars) { - if (intn(nvars->cdr) > 0) { + if (n > 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"); - 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; - } - if (n > NUMPARAM_MAX) { - yyerror(p, "too large numbered parameter"); - return 0; + pylval.num = n; + p->lstate = EXPR_END; + return tNUMPARAM; } - pylval.num = n; - p->lstate = EXPR_END; - return tNUMPARAM; } /* fall through */ default: -- cgit v1.2.3