]> Nishi Git Mirror - gwion.git/commitdiff
:art: Few fixes
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 9 Jun 2019 19:34:16 +0000 (21:34 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 9 Jun 2019 19:34:41 +0000 (21:34 +0200)
src/emit/emit.c
src/lib/func.c
src/lib/vararg.c
src/parse/func.c
src/parse/scan2.c

index 53d96f6f3af5d754a78dd0c58e7f67011674e919..259553c7f8541c97dce675dfdb3713f99abf803b 100644 (file)
@@ -863,7 +863,7 @@ ANN static Instr emit_call(const Emitter emit, const Func f) {
 
 ANN m_bool emit_exp_call1(const Emitter emit, const Func f) {
   if(!f->code || (GET_FLAG(f, ref) && !GET_FLAG(f, builtin))) {
-    if(GET_FLAG(f, template) && emit->env->func != f)
+    if(GET_FLAG(f, template) && emit->env->func != f && isa(actual_type(f->value_ref->type), t_fptr) < 0)
       CHECK_BB(emit_template_code(emit, f))
   } else if((f->value_ref->owner_class && is_special(f->value_ref->owner_class) > 0) ||
         !f->value_ref->owner_class || (GET_FLAG(f, template) &&
index 70efd95efb3d7309591330ba81b253252d040604..85a103f73776fdda35403a049d0988a8644ee0c9 100644 (file)
@@ -140,8 +140,10 @@ ANN static Type fptr_type(const Env env, struct FptrInfo *info) {
     if(fptr_tmpl_push(env, info) > 0 && fptr_rettype(env, info) > 0 &&
        fptr_arity(info) && fptr_args(env, base) > 0)
       type = info->lhs->value_ref->type;
-    if(info->rhs->def->base->tmpl)
+    if(info->rhs->def->base->tmpl) {
       nspc_pop_type(env->gwion->mp, env->curr);
+      nspc_pop_type(env->gwion->mp, env->curr);
+    }
   }
   return type;
 }
index 47b5dda8d31aaeefc83213c522d1f2e49d110855..9620ed23742b03349faacb40ffa7d2399efdbe19 100644 (file)
@@ -34,7 +34,7 @@ INSTR(VarargTop) {
 INSTR(VarargIni) {
   struct Vararg_* arg = mp_calloc(shred->info->mp, Vararg);
   POP_REG(shred,  instr->m_val - SZ_INT)
-  arg->d = (m_bit*)xmalloc(instr->m_val);
+  arg->d = (m_bit*)xmalloc(round2szint(instr->m_val));
   for(m_uint i = 0; i < instr->m_val; i += SZ_INT)
     *(m_uint*)(arg->d + i) = *(m_uint*)(shred->reg - SZ_INT + i);
   const Vector kinds = (Vector)instr->m_val2;
index 26a50eab33a7e920f8aec33b30e6ef46f50dc539..13127df2eff459164d5e7e276a9173620d66cb84 100644 (file)
@@ -8,9 +8,10 @@
 #include "type.h"
 #include "nspc.h"
 #include "func.h"
+#include "value.h"
 
 ANN static void free_func(Func a, Gwion gwion) {
-  if(GET_FLAG(a, template)) {
+  if(GET_FLAG(a, template) && isa(actual_type(a->value_ref->type), t_fptr) < 0) {
     free_tmpl(gwion->mp, a->def->base->tmpl);
     free_func_base(gwion->mp, a->def->base);
     free_loc(gwion->mp, a->def->pos);
index 7fba103e1ea5b40a2901269b9a5f6d3252711c7d..b9a4e5dc98daed5956f0397bae580f11d21a6211 100644 (file)
@@ -109,6 +109,8 @@ ANN m_bool scan2_stmt_fptr(const Env env, const Stmt_Fptr ptr) {
     }
     ptr->value->owner_class = env->class_def;
   }
+  if(ptr->base->tmpl)
+    SET_FLAG(ptr->base->func, template);
   nspc_add_value(env->curr, ptr->base->xid, ptr->value);
   nspc_add_func(ptr->type->e->owner, ptr->base->xid, ptr->base->func);
   return GW_OK;