summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChristopher Aue <[email protected]>2017-08-23 14:03:33 +0200
committerChristopher Aue <[email protected]>2017-08-23 18:15:38 +0200
commit4aca9ef98efc62f16d23ed1fb442e48ddbb7b51f (patch)
treec1fe7897149325082f47002f9364589ffcc6fc3b
parent1221f7676eda4e656f120a21fd0f354d242df457 (diff)
downloadmruby-4aca9ef98efc62f16d23ed1fb442e48ddbb7b51f.tar.gz
mruby-4aca9ef98efc62f16d23ed1fb442e48ddbb7b51f.zip
Refactored code around generation of OP_SEND in NODE_OP_ASGN
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c46
1 files changed, 17 insertions, 29 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 1e92fbd19..9d7392c2d 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -1815,6 +1815,8 @@ codegen(codegen_scope *s, node *tree, int val)
}
else if (nint(tree->car->car) == NODE_CALL) {
node *n = tree->car->cdr;
+ int base, i, nargs = 0;
+ callargs = 0;
if (val) {
vsp = cursp();
@@ -1822,36 +1824,25 @@ codegen(codegen_scope *s, node *tree, int val)
}
codegen(s, n->car, VAL); /* receiver */
idx = new_msym(s, nsym(n->cdr->car));
+ base = cursp()-1;
if (n->cdr->cdr->car) {
- int base = cursp()-1;
- int nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1);
-
- /* copy receiver and arguments */
+ nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1);
if (nargs >= 0) {
- int i;
-
- genop(s, MKOP_AB(OP_MOVE, cursp(), base));
- for (i=0; i<nargs; i++) {
- genop(s, MKOP_AB(OP_MOVE, cursp()+i+1, base+i+1));
- }
- push_n(nargs+1);
- pop_n(nargs+1);
callargs = nargs;
}
- else {
- /* varargs */
+ else { /* varargs */
push();
- genop(s, MKOP_AB(OP_MOVE, cursp(), base));
- genop(s, MKOP_AB(OP_MOVE, cursp()+1, base+1));
+ nargs = 1;
callargs = CALL_MAXARGS;
}
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
}
- else {
- genop(s, MKOP_AB(OP_MOVE, cursp(), cursp()-1));
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 0));
- callargs = 0;
+ /* copy receiver and arguments */
+ genop(s, MKOP_AB(OP_MOVE, cursp(), base));
+ for (i=0; i<nargs; i++) {
+ genop(s, MKOP_AB(OP_MOVE, cursp()+i+1, base+i+1));
}
+ push_n(nargs+1);pop_n(nargs+1);
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
push();
}
else {
@@ -1878,20 +1869,17 @@ codegen(codegen_scope *s, node *tree, int val)
genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
}
if (nint(tree->car->car) == NODE_CALL) {
- mrb_sym m = nsym(tree->car->cdr->cdr->car);
- mrb_sym m2 = attrsym(s, m);
-
- idx = new_msym(s, m2);
- pop();
if (callargs == CALL_MAXARGS) {
- genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
pop();
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
}
else {
pop_n(callargs);
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs+1));
+ callargs++;
}
+ pop();
+ idx = new_msym(s, attrsym(s, nsym(tree->car->cdr->cdr->car)));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
}
else {
gen_assignment(s, tree->car, cursp(), val);