Unverified Commit fee3c1c2 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #4889 from shuujii/_0-is-not-numbered-parameter

`_0` is not numbered parameter
parents 5cc595cb 74f564b0
...@@ -74,8 +74,6 @@ typedef unsigned int stack_type; ...@@ -74,8 +74,6 @@ typedef unsigned int stack_type;
#define NUM_SUFFIX_R (1<<0) #define NUM_SUFFIX_R (1<<0)
#define NUM_SUFFIX_I (1<<1) #define NUM_SUFFIX_I (1<<1)
#define NUMPARAM_MAX 9
static inline mrb_sym static inline mrb_sym
intern_cstr_gen(parser_state *p, const char *s) intern_cstr_gen(parser_state *p, const char *s)
{ {
...@@ -5954,6 +5952,8 @@ parser_yylex(parser_state *p) ...@@ -5954,6 +5952,8 @@ parser_yylex(parser_state *p)
case '_': case '_':
if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) { if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) {
int n = tok(p)[1] - '0'; int n = tok(p)[1] - '0';
if (n > 0) {
node *nvars = p->nvars->car; node *nvars = p->nvars->car;
while (nvars) { while (nvars) {
...@@ -5967,18 +5967,11 @@ parser_yylex(parser_state *p) ...@@ -5967,18 +5967,11 @@ parser_yylex(parser_state *p)
if (intn(p->nvars->cdr) < 0) { if (intn(p->nvars->cdr) < 0) {
yywarning(p, "numbered parameter in nested block"); 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; pylval.num = n;
p->lstate = EXPR_END; p->lstate = EXPR_END;
return tNUMPARAM; return tNUMPARAM;
} }
}
/* fall through */ /* fall through */
default: default:
if (toklast(p) == '!' || toklast(p) == '?') { if (toklast(p) == '!' || toklast(p) == '?') {
......
...@@ -672,7 +672,6 @@ assert 'keyword arguments' do ...@@ -672,7 +672,6 @@ assert 'keyword arguments' do
assert_equal([:a, nil, :c], m(a: :a, c: :c)) assert_equal([:a, nil, :c], m(a: :a, c: :c))
end end
assert('numbered parameters') do assert('numbered parameters') do
assert_equal(15, [1,2,3,4,5].reduce {_1+_2}) assert_equal(15, [1,2,3,4,5].reduce {_1+_2})
assert_equal(3, ->{_1+_2}.call(1,2)) assert_equal(3, ->{_1+_2}.call(1,2))
...@@ -680,3 +679,8 @@ assert('numbered parameters') do ...@@ -680,3 +679,8 @@ assert('numbered parameters') do
assert_equal(5, -> a: ->{_1} {a}.call.call(5)) assert_equal(5, -> a: ->{_1} {a}.call.call(5))
assert_equal(45, Proc.new do _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 end.call(*[1, 2, 3, 4, 5, 6, 7, 8, 9])) assert_equal(45, Proc.new do _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 end.call(*[1, 2, 3, 4, 5, 6, 7, 8, 9]))
end end
assert('_0 is not numbered parameter') do
_0 = :l
assert_equal(:l, ->{_0}.call)
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment