|
|
|
@ -549,6 +549,7 @@ void codegen(ast *node)
|
|
|
|
|
int hasdefault; |
|
|
|
|
int i; |
|
|
|
|
int savedlineno; |
|
|
|
|
int ncallargs; |
|
|
|
|
|
|
|
|
|
union { |
|
|
|
|
int i; |
|
|
|
@ -616,9 +617,11 @@ void codegen(ast *node)
|
|
|
|
|
* Arguments on the stack directly above |
|
|
|
|
* local variables, and then return address |
|
|
|
|
*/ |
|
|
|
|
printf("(argument)\n"); |
|
|
|
|
emit_instr_imm_const(OP_LOAD, |
|
|
|
|
sp + 1 + nargs - var.addr, fnconst); |
|
|
|
|
} else { |
|
|
|
|
printf("(non-argument)\n"); |
|
|
|
|
emit_instr_imm_const(OP_LOAD, sp - var.addr - 1, fnconst); |
|
|
|
|
} |
|
|
|
|
sp++; |
|
|
|
@ -777,14 +780,14 @@ void codegen(ast *node)
|
|
|
|
|
|
|
|
|
|
// printf("savedsp = %d\n", savedsp);
|
|
|
|
|
|
|
|
|
|
nargs = 0; |
|
|
|
|
ncallargs = 0; |
|
|
|
|
|
|
|
|
|
/* Evaluate the arguments first */ |
|
|
|
|
for (ptr = |
|
|
|
|
node->info.node.head->next->elem->info.node.head; |
|
|
|
|
ptr; ptr = ptr->next) { |
|
|
|
|
codegen(ptr->elem); |
|
|
|
|
nargs++; |
|
|
|
|
ncallargs++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// printf("sp = %d\n", sp);
|
|
|
|
@ -800,7 +803,7 @@ void codegen(ast *node)
|
|
|
|
|
* This is something only supported for |
|
|
|
|
* builtin functions at present. |
|
|
|
|
*/ |
|
|
|
|
emit_instr_immediate(OP_PUSH, nargs); |
|
|
|
|
emit_instr_immediate(OP_PUSH, ncallargs); |
|
|
|
|
sp++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|