Exp arg = e->args;
if(arg)
CHECK_BB(emit_exp(emit, e->args, 0))
- const Instr pop = emit_add_instr(emit, RegPop);
+ const Instr instr = emit_add_instr(emit, PutArgsInMem);
while(arg) {
- pop->m_val += arg->type->size;
+ instr->m_val += arg->type->size;
arg = arg->next;
}
- for(m_uint i = 0; i < pop->m_val; i += SZ_INT) {
- const Instr cpy = emit_add_instr(emit, Reg2Mem);
- cpy->m_val = cpy->m_val2 = i;
- }
emit_add_instr(emit, Goto);
return GW_OK;
}
}
}
+#ifdef OPTIMIZE
+INSTR(PutArgsInMem) { GWDEBUG_EXE
+ POP_REG(shred, instr->m_val)
+ for(m_uint i = 0; i < instr->m_val; i += SZ_INT)
+ *(m_uint*)(shred->mem + i) = *(m_uint*)(shred->reg + i);
+}
+#endif
+
INSTR(PopArrayClass) { GWDEBUG_EXE
POP_REG(shred, SZ_INT);
const M_Object obj = *(M_Object*)REG(-SZ_INT);
env->func = func;
++env->scope->depth;
nspc_push_value(env->curr);
- if((f->arg_list && (ret = check_func_args(env, f->arg_list)) > 0) || !f->arg_list) {
- const Value variadic = GET_FLAG(f, variadic) ? set_variadic(env) : NULL;
- if(!GET_FLAG(f, builtin) && check_stmt_code(env, &f->d.code->d.stmt_code) < 0)
- ret = err_msg(f->td ? f->td->xid->pos : 0, "...in function '%s'",
- s_name(f->name));
- if(variadic)
- REM_REF(variadic)
- if(GET_FLAG(f, builtin))
- func->code->stack_depth = f->stack_depth;
- else if(GET_FLAG(f, op))
- operator_func(func);
+ if(!f->arg_list)
+ UNSET_FLAG(f->func, pure);
+ else
+ ret = check_func_args(env, f->arg_list);
+ if(ret > 0) {
+ const Value variadic = GET_FLAG(f, variadic) ? set_variadic(env) : NULL;
+ if(!GET_FLAG(f, builtin) && check_stmt_code(env, &f->d.code->d.stmt_code) < 0)
+ ret = err_msg(f->td ? f->td->xid->pos : 0, "...in function '%s'",
+ s_name(f->name));
+ if(variadic)
+ REM_REF(variadic)
+ if(GET_FLAG(f, builtin))
+ func->code->stack_depth = f->stack_depth;
+ else if(GET_FLAG(f, op))
+ operator_func(func);
}
nspc_pop_value(env->curr);
--env->scope->depth;