diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-12-21 18:43:09 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-12-21 18:54:15 +0900 |
| commit | 74f564b0bb2f886ffc1c7ccd2a8c49c4265ad9dd (patch) | |
| tree | ff5ffc1e9cc74c09fbe2a64a2bd4c4fcdc4377cb /mrbgems/mruby-compiler/core | |
| parent | 5cc595cb2a057deff4c123425c9384f8e59e5e34 (diff) | |
| download | mruby-74f564b0bb2f886ffc1c7ccd2a8c49c4265ad9dd.tar.gz mruby-74f564b0bb2f886ffc1c7ccd2a8c49c4265ad9dd.zip | |
`_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
```
Diffstat (limited to 'mrbgems/mruby-compiler/core')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 37 |
1 files changed, 15 insertions, 22 deletions
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: |
