summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-08-01 02:33:55 +0900
committerYukihiro Matsumoto <[email protected]>2012-08-01 02:33:55 +0900
commit0220953efe0c4dba5ce4af5057faa2d56fda6553 (patch)
tree2a1f7958f7043c652bc7797b24bff831ebab4281 /src
parent1a541208697a80cdff52c7dbd0b0fc1e0a754b90 (diff)
downloadmruby-0220953efe0c4dba5ce4af5057faa2d56fda6553.tar.gz
mruby-0220953efe0c4dba5ce4af5057faa2d56fda6553.zip
no OP_LOADNIL for operators (OP_ADD, etc)
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c28
-rw-r--r--src/vm.c4
2 files changed, 20 insertions, 12 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 69ad744fd..5cfd6d3f2 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -606,7 +606,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
{
mrb_sym sym = name ? name : (mrb_sym)tree->cdr->car;
int idx;
- int n = 0, noop = 0, sendv = 0;
+ int n = 0, noop = 0, sendv = 0, blk = 0;
codegen(s, tree->car, VAL); /* receiver */
idx = new_msym(s, sym);
@@ -636,40 +636,44 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
pop();
}
else {
- genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ blk = cursp();
}
pop_n(n+1);
{
- const char *name = mrb_sym2name(s->mrb, sym);
+ int len;
+ const char *name = mrb_sym2name_len(s->mrb, sym, &len);
- if (!noop && name[0] == '+' && name[1] == '\0') {
+ if (!noop && len == 1 && name[0] == '+') {
genop(s, MKOP_ABC(OP_ADD, cursp(), idx, n));
}
- else if (!noop && name[0] == '-' && name[1] == '\0') {
+ else if (!noop && len == 1 && name[0] == '-') {
genop(s, MKOP_ABC(OP_SUB, cursp(), idx, n));
}
- else if (!noop && name[0] == '*' && name[1] == '\0') {
+ else if (!noop && len == 1 && name[0] == '*') {
genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
}
- else if (!noop && name[0] == '/' && name[1] == '\0') {
+ else if (!noop && len == 1 && name[0] == '/') {
genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n));
}
- else if (!noop && name[0] == '<' && name[1] == '\0') {
+ else if (!noop && len == 1 && name[0] == '<') {
genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
}
- else if (!noop && name[0] == '<' && name[1] == '=' && name[2] == '\0') {
+ else if (!noop && len == 2 && name[0] == '<' && name[1] == '=') {
genop(s, MKOP_ABC(OP_LE, cursp(), idx, n));
}
- else if (!noop && name[0] == '>' && name[1] == '\0') {
+ else if (!noop && len == 1 && name[0] == '>') {
genop(s, MKOP_ABC(OP_GT, cursp(), idx, n));
}
- else if (!noop && name[0] == '>' && name[1] == '=' && name[2] == '\0') {
+ else if (!noop && len == 2 && name[0] == '>' && name[1] == '=') {
genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
}
- else if (!noop && name[0] == '=' && name[1] == '=' && name[2] == '\0') {
+ else if (!noop && len == 2 && name[0] == '=' && name[1] == '=') {
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));
}
diff --git a/src/vm.c b/src/vm.c
index b646ced77..3e7dd2084 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1211,6 +1211,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
break;\
s\
default:\
+ SET_NIL_VALUE(regs[a+2]);\
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));\
goto L_SEND;\
}\
@@ -1257,6 +1258,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
regs[a].value.f += GETARG_C(i);
break;
default:
+ SET_NIL_VALUE(regs[a+2]);
SET_INT_VALUE(regs[a+1], GETARG_C(i));
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
goto L_SEND;
@@ -1277,6 +1279,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
regs[a].value.f -= GETARG_C(i);
break;
default:
+ SET_NIL_VALUE(regs[a+2]);
SET_INT_VALUE(regs[a+1], GETARG_C(i));
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
goto L_SEND;
@@ -1310,6 +1313,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
OP_CMP_BODY(op,f,f);\
break;\
default:\
+ SET_NIL_VALUE(regs[a+2]);\
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));\
goto L_SEND;\
}\