diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-06-12 12:14:59 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-06-12 12:14:59 +0900 |
| commit | 3403f19cb55b8474abc213d52293ff1b69d2a455 (patch) | |
| tree | 2ddab0c8902f0c59b637299d3825009f26b1c750 /src | |
| parent | debf296843ff21324d710163a0e49a074c85d4b3 (diff) | |
| download | mruby-3403f19cb55b8474abc213d52293ff1b69d2a455.tar.gz mruby-3403f19cb55b8474abc213d52293ff1b69d2a455.zip | |
should handle splat in super arguments
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/codegen.c b/src/codegen.c index 105a27cef..b8500292e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1278,16 +1278,18 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_SUPER: { - int n = 0; + int n = 0, noop = 0, sendv = 0; push(); /* room for receiver */ if (tree) { node *args = tree->car; - while (args) { - codegen(s, args->car, VAL); - n++; - args = args->cdr; - } + if (args) { + n = gen_values(s, args); + if (n < 0) { + n = noop = sendv = 1; + push(); + } + } } if (tree && tree->cdr) { codegen(s, tree->cdr, VAL); @@ -1297,6 +1299,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_A(OP_LOADNIL, cursp())); } pop_n(n+1); + if (sendv) n = CALL_MAXARGS; genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, n)); if (val) push(); } |
