diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-12-09 11:56:54 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-12-09 11:56:54 +0900 |
| commit | 092dd4a667175a123ef9b628e7008be6398d7e0e (patch) | |
| tree | 6a7ef006e884da9622509620295a061d777d2b00 /mrbgems/mruby-compiler/core/parse.y | |
| parent | 2e9b8f0d9bf835093338dec197c8003651705a21 (diff) | |
| download | mruby-092dd4a667175a123ef9b628e7008be6398d7e0e.tar.gz mruby-092dd4a667175a123ef9b628e7008be6398d7e0e.zip | |
Argument forwarding with `...` now supports leading arguments.
```ruby
def method_missing(meth, ...)
send(:"do_#{meth}", ...)
end
```
Diffstat (limited to 'mrbgems/mruby-compiler/core/parse.y')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index b740d0ed2..62fff304e 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -2397,6 +2397,22 @@ paren_args : '(' opt_call_args ')' { $$ = $2; } + | '(' args comma tBDOT3 rparen + { +#if 1 + mrb_sym r = MRB_OPSYM(mul); + mrb_sym b = MRB_OPSYM(and); + $$ = cons(push($2, new_splat(p, new_lvar(p, r))), + new_block_arg(p, new_lvar(p, b))); +#else + mrb_sym r = MRB_OPSYM(mul); + mrb_sym k = MRB_OPSYM(pow); + mrb_sym b = MRB_OPSYM(and); + $$ = cons(list2(push($2, new_splat(p, new_lvar(p, r))), + new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))), + new_block_arg(p, new_lvar(p, b))); +#endif + } | '(' tBDOT3 rparen { #if 1 @@ -3493,6 +3509,24 @@ f_arglist_paren : '(' f_args rparen p->lstate = EXPR_BEG; p->cmd_start = TRUE; } + | '(' f_arg ',' tBDOT3 rparen + { +#if 1 + /* til real keyword args implemented */ + mrb_sym r = MRB_OPSYM(mul); + mrb_sym b = MRB_OPSYM(and); + local_add_f(p, r); + $$ = new_args(p, $2, 0, r, 0, + new_args_tail(p, 0, 0, b)); +#else + mrb_sym r = MRB_OPSYM(mul); + mrb_sym k = MRB_OPSYM(pow); + mrb_sym b = MRB_OPSYM(and); + local_add_f(p, r); local_add_f(p, k); + $$ = new_args(p, $2, 0, r, 0, + new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b)); +#endif + } | '(' tBDOT3 rparen { #if 1 |
