]> Nishi Git Mirror - gwion.git/commitdiff
:art: No arg function can't be pure
authorfennecdjay <astor.jeremie@wanadoo.fr>
Mon, 11 Mar 2019 09:15:21 +0000 (10:15 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Mon, 11 Mar 2019 09:15:21 +0000 (10:15 +0100)
include/instr.h
src/emit/emit.c
src/lib/instr.c
src/parse/check.c

index 6a39d7acc72b939d188a40dca64a628dc23b7c85..ec5baff37ff0295a1df7b9f623cf43dd74051adf 100644 (file)
@@ -77,5 +77,9 @@ struct dottmpl_ {
 };
 ANN void free_dottmpl(struct dottmpl_*);
 ANN m_bool traverse_dot_tmpl(const Emitter emit, const struct dottmpl_ *dt);
+// optimizations
+#ifdef OPTIMIZE
+INSTR(PutArgsInMem);
+#endif
 #include "opcode.h"
 #endif
index 0a66b706303c76d1e5a5f7e9916a3a907ef1a5ff..420e2b90a65d7a87eb08bbaface2959145e4df75 100644 (file)
@@ -1022,15 +1022,11 @@ ANN static m_bool optimize_taill_call(const Emitter emit, const Exp_Call* e) {
   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;
 }
index a1f0a8c0bec6e5eab7455873c4ac48f5f6fbf1d1..81cf6e992b1d3eb52a5468366c93a25791200e62 100644 (file)
@@ -68,6 +68,14 @@ INSTR(AutoLoopEnd) { GWDEBUG_EXE
   }
 }
 
+#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);
index f3e51c47b830ad13f5c67162a523e2cc54c64368..342aee79f3f48b0275d17580662c85d55bff3911 100644 (file)
@@ -1129,17 +1129,21 @@ ANN m_bool check_func_def(const Env env, const Func_Def f) { GWDEBUG_EXE
   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;