summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-12-21 18:43:09 +0900
committerKOBAYASHI Shuji <[email protected]>2019-12-21 18:54:15 +0900
commit74f564b0bb2f886ffc1c7ccd2a8c49c4265ad9dd (patch)
treeff5ffc1e9cc74c09fbe2a64a2bd4c4fcdc4377cb /mrbgems/mruby-compiler/core
parent5cc595cb2a057deff4c123425c9384f8e59e5e34 (diff)
downloadmruby-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.y37
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: