eliminate unused array expression more aggresively

parent 0d0b1d1b
...@@ -674,12 +674,13 @@ attrsym(codegen_scope *s, mrb_sym a) ...@@ -674,12 +674,13 @@ attrsym(codegen_scope *s, mrb_sym a)
} }
static int static int
gen_values(codegen_scope *s, node *t) gen_values(codegen_scope *s, node *t, int val)
{ {
int n = 0; int n = 0;
while (t) { while (t) {
if ((intptr_t)t->car->car == NODE_SPLAT) { // splat mode if ((intptr_t)t->car->car == NODE_SPLAT) { // splat mode
if (val) {
pop_n(n); pop_n(n);
genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n)); genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
push(); push();
...@@ -699,10 +700,19 @@ gen_values(codegen_scope *s, node *t) ...@@ -699,10 +700,19 @@ gen_values(codegen_scope *s, node *t)
} }
t = t->cdr; t = t->cdr;
} }
}
else {
codegen(s, t->car->cdr, NOVAL);
t = t->cdr;
while (t) {
codegen(s, t->car, NOVAL);
t = t->cdr;
}
}
return -1; return -1;
} }
// normal (no splat) mode // normal (no splat) mode
codegen(s, t->car, VAL); codegen(s, t->car, val);
n++; n++;
t = t->cdr; t = t->cdr;
} }
...@@ -722,7 +732,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) ...@@ -722,7 +732,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
idx = new_msym(s, sym); idx = new_msym(s, sym);
tree = tree->cdr->cdr->car; tree = tree->cdr->cdr->car;
if (tree) { if (tree) {
n = gen_values(s, tree->car); n = gen_values(s, tree->car, VAL);
if (n < 0) { if (n < 0) {
n = noop = sendv = 1; n = noop = sendv = 1;
push(); push();
...@@ -1298,10 +1308,10 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1298,10 +1308,10 @@ codegen(codegen_scope *s, node *tree, int val)
{ {
int n; int n;
n = gen_values(s, tree); n = gen_values(s, tree, val);
if (n >= 0) { if (n >= 0) {
pop_n(n);
if (val) { if (val) {
pop_n(n);
genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n)); genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
push(); push();
} }
...@@ -1463,7 +1473,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1463,7 +1473,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (tree) { if (tree) {
node *args = tree->car; node *args = tree->car;
if (args) { if (args) {
n = gen_values(s, args); n = gen_values(s, args, VAL);
if (n < 0) { if (n < 0) {
n = noop = sendv = 1; n = noop = sendv = 1;
push(); push();
...@@ -1535,7 +1545,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1535,7 +1545,7 @@ codegen(codegen_scope *s, node *tree, int val)
genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf))); genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
push(); push();
if (tree) { if (tree) {
n = gen_values(s, tree); n = gen_values(s, tree, VAL);
if (n < 0) { if (n < 0) {
n = sendv = 1; n = sendv = 1;
push(); push();
......
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