reduce OP_ARRAY in argument splat

parent 0e03a7f2
...@@ -780,16 +780,22 @@ gen_values(codegen_scope *s, node *t, int val) ...@@ -780,16 +780,22 @@ gen_values(codegen_scope *s, node *t, int val)
is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */ is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */
if (n >= 127 || is_splat) { if (n >= 127 || is_splat) {
if (val) { if (val) {
pop_n(n); if (is_splat && n == 0 && (intptr_t)t->car->cdr->car == NODE_ARRAY) {
genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n)); codegen(s, t->car->cdr, VAL);
push(); pop();
codegen(s, t->car, VAL);
pop(); pop();
if (is_splat) {
genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
} }
else { else {
genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1)); pop_n(n);
genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
push();
codegen(s, t->car, VAL);
pop(); pop();
if (is_splat) {
genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
}
else {
genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
}
} }
t = t->cdr; t = t->cdr;
while (t) { while (t) {
......
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