summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-09-03 08:32:57 +0900
committerYukihiro Matsumoto <[email protected]>2012-09-03 08:32:57 +0900
commit5340126443609265d63159e4c391049cb722f828 (patch)
treee16713c062c707a11dd92c42842d7e49e9550fe5 /src/codegen.c
parent8fb23fe67d4af8ac5046223c0ef54095f8ef0a20 (diff)
downloadmruby-5340126443609265d63159e4c391049cb722f828.tar.gz
mruby-5340126443609265d63159e4c391049cb722f828.zip
remove OP_LOADNIL before OP_SEND by introducing OP_SENDB (send with block)
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/src/codegen.c b/src/codegen.c
index d7cb0861c..2c8089b23 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -517,7 +517,7 @@ for_body(codegen_scope *s, node *tree)
genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx - base, OP_L_BLOCK));
pop();
idx = new_msym(s, mrb_intern(s->mrb, "each"));
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 0));
+ genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
}
static int
@@ -766,11 +766,13 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
}
else {
- if (blk > 0) { /* no block */
- genop(s, MKOP_A(OP_LOADNIL, blk));
- }
if (sendv) n = CALL_MAXARGS;
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n));
+ if (blk > 0) { /* no block */
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n));
+ }
+ else {
+ genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, n));
+ }
}
}
if (val) {
@@ -987,9 +989,7 @@ codegen(codegen_scope *s, node *tree, int val)
push();
}
genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
- push();
- genop(s, MKOP_A(OP_LOADNIL, cursp()));
- pop(); pop();
+ pop();
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1));
tmp = new_label(s);
genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
@@ -1179,9 +1179,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen(s, n->car, VAL);
if (head) {
genop(s, MKOP_AB(OP_MOVE, cursp(), head));
- push();
- genop(s, MKOP_A(OP_LOADNIL, cursp()));
- pop(); pop();
+ pop();
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1));
}
tmp = new_label(s);
@@ -1376,7 +1374,7 @@ codegen(codegen_scope *s, node *tree, int val)
mrb_sym sym = (mrb_sym)tree->cdr->car;
int len;
const char *name = mrb_sym2name_len(s->mrb, sym, &len);
- int idx, blk = 0;
+ int idx;
codegen(s, tree->car, VAL);
if (len == 2 &&
@@ -1394,7 +1392,6 @@ codegen(codegen_scope *s, node *tree, int val)
break;
}
codegen(s, tree->cdr->cdr->car, VAL);
- blk = cursp();
pop(); pop();
idx = new_msym(s, sym);
@@ -1417,10 +1414,7 @@ codegen(codegen_scope *s, node *tree, int val)
genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1));
}
else {
- if (blk > 0) {
- genop(s, MKOP_A(OP_LOADNIL, blk));
- }
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
}
}
gen_assignment(s, tree->car, cursp(), val);
@@ -1511,7 +1505,6 @@ codegen(codegen_scope *s, node *tree, int val)
push();
}
}
- genop(s, MKOP_A(OP_LOADNIL, cursp()));
pop_n(n+1);
if (sendv) n = CALL_MAXARGS;
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "call")), n));
@@ -2279,6 +2272,11 @@ codedump(mrb_state *mrb, int n)
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
GETARG_C(c));
break;
+ case OP_SENDB:
+ printf("OP_SENDB\tR%d\t:%s\t%d\n", GETARG_A(c),
+ mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+ GETARG_C(c));
+ break;
case OP_TAILCALL:
printf("OP_TAILCALL\tR%d\t:%s\t%d\n", GETARG_A(c),
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),