summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-12 12:14:59 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-12 12:14:59 +0900
commit3403f19cb55b8474abc213d52293ff1b69d2a455 (patch)
tree2ddab0c8902f0c59b637299d3825009f26b1c750 /src
parentdebf296843ff21324d710163a0e49a074c85d4b3 (diff)
downloadmruby-3403f19cb55b8474abc213d52293ff1b69d2a455.tar.gz
mruby-3403f19cb55b8474abc213d52293ff1b69d2a455.zip
should handle splat in super arguments
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c15
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();
}