mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #6429 from hoshiumiarata/fix_num_params_as_hash_key
This commit is contained in:
@@ -713,6 +713,25 @@ new_cvar(parser_state *p, mrb_sym sym)
|
||||
static node*
|
||||
new_nvar(parser_state *p, int num)
|
||||
{
|
||||
int nvar;
|
||||
node *nvars = p->nvars->cdr;
|
||||
while (nvars) {
|
||||
nvar = intn(nvars->car);
|
||||
if (nvar == -2) break; /* top of the scope */
|
||||
if (nvar > 0) {
|
||||
yyerror(NULL, p, "numbered parameter used in outer block");
|
||||
break;
|
||||
}
|
||||
nvars->car = nint(-1);
|
||||
nvars = nvars->cdr;
|
||||
}
|
||||
nvar = intn(p->nvars->car);
|
||||
if (nvar == -1) {
|
||||
yyerror(NULL, p, "numbered parameter used in inner block");
|
||||
}
|
||||
else {
|
||||
p->nvars->car = nint(nvar > num ? nvar : num);
|
||||
}
|
||||
return cons((node*)NODE_NVAR, nint(num));
|
||||
}
|
||||
|
||||
@@ -6446,26 +6465,8 @@ parser_yylex(parser_state *p)
|
||||
int nvar;
|
||||
|
||||
if (n > 0) {
|
||||
node *nvars = p->nvars->cdr;
|
||||
|
||||
while (nvars) {
|
||||
nvar = intn(nvars->car);
|
||||
if (nvar == -2) break; /* top of the scope */
|
||||
if (nvar > 0) {
|
||||
yywarning(p, "numbered parameter used in outer block");
|
||||
break;
|
||||
}
|
||||
nvars->car = nint(-1);
|
||||
nvars = nvars->cdr;
|
||||
}
|
||||
nvar = intn(p->nvars->car);
|
||||
if (nvar != -2) { /* numbered parameters never appear on toplevel */
|
||||
if (nvar == -1) {
|
||||
yywarning(p, "numbered parameter used in inner block");
|
||||
}
|
||||
else {
|
||||
p->nvars->car = nint(nvar > n ? nvar : n);
|
||||
}
|
||||
pylval.num = n;
|
||||
p->lstate = EXPR_END;
|
||||
return tNUMPARAM;
|
||||
|
||||
@@ -723,6 +723,12 @@ assert('numbered parameters in symbol name (https://github.com/mruby/mruby/issue
|
||||
assert_equal([:_1], Array.new(1) {:_1})
|
||||
end
|
||||
|
||||
assert('numbered parameters as hash key') do
|
||||
h = {_1: 3}
|
||||
assert_equal(3, h[:_1])
|
||||
assert_equal(7, -> { _1 }.call(7))
|
||||
end
|
||||
|
||||
assert('numbered parameters as singleton') do
|
||||
o = Object.new
|
||||
lambda { def _1.a(b) = "a#{b}" }.call(o)
|
||||
|
||||
Reference in New Issue
Block a user