]> Nishi Git Mirror - gwion.git/commitdiff
:art: More on Fptr
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 9 Jun 2019 20:53:46 +0000 (22:53 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 9 Jun 2019 20:53:57 +0000 (22:53 +0200)
include/type.h
src/emit/emit.c
src/parse/check.c
src/parse/func.c
src/parse/scan2.c

index 02b4c8314e4b87210e9b6af18b062cfebbefaae9..a1c11a737db6b7b84c582ffaecd19a530ddffe77 100644 (file)
@@ -47,5 +47,9 @@ static inline Type actual_type(const Type t) {
   return isa(t, t_class) > 0 ? t->e->d.base_type : t;
 }
 ANN static inline m_uint env_push_type(const Env env, const Type type) { return env_push(env, type, type->nspc); }
+ANN static inline m_bool is_fptr(const Type t) {
+  return isa(actual_type(t), t_fptr) > 0;
+}
+
 #endif
 
index 644a85465e5fc6114d1406973b597586c993ed08..0497ef8f7383c185a340eef8b0b089ec9cf6dc85 100644 (file)
@@ -689,7 +689,7 @@ ANN static m_bool prepare_call(const Emitter emit, const Exp_Call* exp_call) {
 ANN static inline m_int push_tmpl_func(const Emitter emit, const Func f) {
   const Value v = f->value_ref;
   if(isa(v->type, t_class) > 0 &&
-      isa(actual_type(v->type), t_fptr) > 0)
+      is_fptr(v->type))
     return emit->env->scope->depth;
   const m_uint scope = emit_push(emit, v->owner_class, v->owner);
   CHECK_BB(traverse_func_template(emit->env, f->def))
@@ -702,7 +702,8 @@ ANN static m_bool emit_exp_call_template(const Emitter emit, const Exp_Call* exp
   exp_call->m_func->def->base->tmpl->call = exp_call->tmpl->call;
   DECL_BB(const m_int,scope, = push_tmpl_func(emit, exp_call->m_func))
   CHECK_BB(prepare_call(emit, exp_call))
-  emit_pop_type(emit);
+  if(!is_fptr(exp_call->m_func->value_ref->type))
+    emit_pop_type(emit);
   emit_pop(emit, (m_uint)scope);
   UNSET_FLAG(exp_call->m_func, checked);
   return GW_OK;
@@ -863,7 +864,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 && isa(actual_type(f->value_ref->type), t_fptr) < 0)
+    if(GET_FLAG(f, template) && emit->env->func != f && !is_fptr(f->value_ref->type))
       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) &&
@@ -875,7 +876,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f) {
       back->m_val = f->vt_index;
   }
   if(vector_size(&emit->code->instr) && GET_FLAG(f, member) &&
-        isa(actual_type(f->value_ref->type), t_fptr) > 0) {
+        is_fptr(f->value_ref->type)) {
     const Instr back = (Instr)vector_back(&emit->code->instr);
     m_bit exec = back->opcode;
     m_uint val = back->m_val;
@@ -970,7 +971,7 @@ ANN m_bool emit_exp_spork(const Emitter emit, const Exp_Unary* unary) {
     const Instr spork = emit_add_instr(emit, is_spork ? SporkExp : ForkEnd);
     spork->m_val = emit->code->stack_depth;
   } else {
-    if(GET_FLAG(f, member) && isa(actual_type(f->value_ref->type), t_fptr) > 0) {
+    if(GET_FLAG(f, member) && is_fptr(f->value_ref->type)) {
       const m_uint depth = f->def->stack_depth;
       regpop(emit, depth);
       emit_add_instr(emit, RegPushMem);
index b4d55755142a9f9c22dd0f46e8bbe75ad506cdf0..511e6f6d0318e17c75543bbbd9a5e57aa0a72d44 100644 (file)
@@ -442,7 +442,7 @@ ANN static Func _find_template_match(const Env env, const Value v, const Exp_Cal
   Func m_func = NULL, former = env->func;
   const m_str tmpl_name = tl2str(env, types);
   const m_uint scope = env_push(env, v->owner_class, v->owner);
-  if(isa(actual_type(v->type), t_fptr) > 0) {
+  if(is_fptr(v->type)) {
   const Symbol sym = func_symbol(env, v->owner->name, v->name, tmpl_name, 0);
   const Value value = nspc_lookup_value1(v->owner, sym);
   Func_Def base = v->d.func_ref->def;
@@ -462,10 +462,9 @@ ANN static Func _find_template_match(const Env env, const Value v, const Exp_Cal
   if(exp->args)
     CHECK_OO(check_exp(env, exp->args))
   const Func func = find_func_match(env, fbase->func, exp->args);
-  //  nspc_pop_type(env->gwion->mp, env->curr);
-  //  env_pop(env, scope);
   if(!value)
     map_set(&v->owner->info->type->map, (vtype)sym, (vtype)actual_type(func->value_ref->type));
+  nspc_pop_type(env->gwion->mp, env->curr);
   xfree(tmpl_name);
   env->func = former;
   return func;
index 13127df2eff459164d5e7e276a9173620d66cb84..ec76499e0969509c4cae2635784ae88203f40661 100644 (file)
@@ -11,7 +11,7 @@
 #include "value.h"
 
 ANN static void free_func(Func a, Gwion gwion) {
-  if(GET_FLAG(a, template) && isa(actual_type(a->value_ref->type), t_fptr) < 0) {
+  if(GET_FLAG(a, template) && !is_fptr(a->value_ref->type)) {
     free_tmpl(gwion->mp, a->def->base->tmpl);
     free_func_base(gwion->mp, a->def->base);
     free_loc(gwion->mp, a->def->pos);
index 02af3dbfd9188e90faa4d9965efb52bea564e311..b5b6e8904601ab0fb6978e877ba22f0cbdf0aab3 100644 (file)
@@ -110,7 +110,7 @@ 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);
+    SET_FLAG(ptr->type, func);
   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;