]> Nishi Git Mirror - gwion.git/commitdiff
:art: Use PushStaticCode for recursive templates
authorfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 19 Jul 2019 13:04:37 +0000 (15:04 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 19 Jul 2019 13:04:37 +0000 (15:04 +0200)
src/emit/emit.c
src/parse/check.c
src/parse/template.c

index e50b6d130d85df73648bc8e4f44993977db0cace..3a0228fa1cc58b193c47760ff7e9d5f475744a75 100644 (file)
@@ -864,8 +864,14 @@ 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 && !is_fptr(f->value_ref->type))
-      CHECK_BB(emit_template_code(emit, f))
+    if(GET_FLAG(f, template) && !is_fptr(f->value_ref->type)) {
+      if(emit->env->func != f)
+        CHECK_BB(emit_template_code(emit, f))
+      else {
+        const Instr back = (Instr)vector_back(&emit->code->instr);
+        back->opcode = ePushStaticCode;
+      }
+    }
   } else if((f->value_ref->owner_class && is_special(f->value_ref->owner_class) > 0) ||
         !f->value_ref->owner_class || (GET_FLAG(f, template) &&
         isa(f->value_ref->type, t_fptr) < 0))
index ee81952f49ad8f52554e186bc0d8d5dfec21967b..c141924c97ef00fbca249c98e3f979f053b0f818 100644 (file)
@@ -482,7 +482,7 @@ ANN static Func _find_template_match(const Env env, const Value v, const Exp_Cal
 CHECK_BO(check_call(env, exp))
   const Type_List types = exp->tmpl->call;
   Func m_func = NULL, former = env->func;
-  const m_str tmpl_name = tl2str(env, types);
+  DECL_OO(const m_str, tmpl_name, = tl2str(env, types))
   const m_uint scope = env_push(env, v->owner_class, v->owner);
   if(is_fptr(v->type)) {
   const Symbol sym = func_symbol(env, v->owner->name, v->name, tmpl_name, 0);
index f0a07c4e02ef784ed9dafb0d609a7da04bda905f..5cfbeba017635ca0270c60b50baa1921dab0caa0 100644 (file)
@@ -190,7 +190,8 @@ ANN Type scan_type(const Env env, const Type t, const Type_Decl* type) {
     return a->base.type;
   } else if(type->types) { // TODO: clean me
     if(isa(t, t_function) > 0 && t->e->d.func->def->base->tmpl) {
-      const m_str tl_name = tl2str(env, type->types);
+      DECL_OO(const m_str, tl_name, = tl2str(env, type->types))
+// err_msg here ?
       const Symbol sym = func_symbol(env, t->e->owner->name, t->e->d.func->name, tl_name, 0);
       free_mstr(env->gwion->mp, tl_name);
       const Type base_type = nspc_lookup_type1(t->e->owner, sym);