]> Nishi Git Mirror - gwion.git/commitdiff
:art: use npsc_allocdata in type checking
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 29 Jul 2021 16:27:24 +0000 (18:27 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 29 Jul 2021 16:27:24 +0000 (18:27 +0200)
plug
src/emit/emit.c
src/import/import_cdef.c
src/lib/opfunc.c
src/parse/check.c
src/parse/scan0.c

diff --git a/plug b/plug
index 5bbcb7bd4c570fe76b0b868e8b1fbdf6dfa8b5f9..6dc4bc7ca452a1a44168135c7e8dcf9ebdba94f7 160000 (submodule)
--- a/plug
+++ b/plug
@@ -1 +1 @@
-Subproject commit 5bbcb7bd4c570fe76b0b868e8b1fbdf6dfa8b5f9
+Subproject commit 6dc4bc7ca452a1a44168135c7e8dcf9ebdba94f7
index 5a215ba92c70d19a772234955fda430ffa185e76..c84c5b3ca0e27bededc9ce893b949a8ac1b667be 100644 (file)
@@ -1342,7 +1342,7 @@ ANN static Instr get_prelude(const Emitter emit, const Func f,
   if (is_fptr(emit->gwion, t)) {
     if (f->def->base->tmpl) tmpl_prelude(emit, f);
   }
-  if (fp || f != emit->env->func || !is_static ||
+  if (fp || f != emit->env->func || (!is_static && strcmp(s_name(f->def->base->xid), "new"))||
       strstr(emit->code->name, "ork~")) {
     const Instr instr = emit_add_instr(emit, SetCode);
     instr->udata.one  = 1;
@@ -2217,9 +2217,10 @@ ANN static m_bool emit_enum_def(const Emitter emit, const Enum_Def edef) {
       v->from->offset = emit_local(emit, emit->gwion->type[et_int]);
       v->d.num        = i;
     } else
-      *(m_bit *)(emit->env->class_def->nspc->info->class_data +
+      *(m_uint *)(emit->env->class_def->nspc->info->class_data +
                  v->from->offset) = i;
   }
+  set_tflag(edef->t, tflag_emit);
   return GW_OK;
 }
 
@@ -2736,15 +2737,14 @@ ANN static m_bool cdef_parent(const Emitter emit, const Class_Def cdef) {
 ANN static m_bool emit_class_def(const Emitter emit, const Class_Def cdef) {
   if (tmpl_base(cdef->base.tmpl)) return GW_OK;
   const Type      t = cdef->base.type;
-  const Class_Def c = t->info->cdef;
   if (tflag(t, tflag_emit)) return GW_OK;
   set_tflag(t, tflag_emit);
+  const Class_Def c = t->info->cdef;
   const Type owner = t->info->value->from->owner_class;
   if (owner) CHECK_BB(ensure_emit(emit, owner));
   if (c->base.ext && t->info->parent->info->cdef &&
       !tflag(t->info->parent, tflag_emit)) // ?????
     CHECK_BB(cdef_parent(emit, c));
-  nspc_allocdata(emit->gwion->mp, t->nspc);
   if (c->body) {
     emit_class_code(emit, t->name);
     if (scanx_body(emit->env, c, (_exp_func)emit_section, emit) > 0)
index ee5a1dad57bdf31a57a78bb40d34226980e02e31..8a0058a125763c936a3e70c4fd2a0a7e333eb3d6 100644 (file)
@@ -129,7 +129,6 @@ ANN m_int gwi_class_end(const Gwi gwi) {
   }
   if (!gwi->gwion->env->class_def)
     GWI_ERR_B(_("import: too many class_end called."))
-  nspc_allocdata(gwi->gwion->mp, gwi->gwion->env->class_def->nspc);
   const Type t = gwi->gwion->env->class_def;
   if (tflag(t, tflag_tmpl)) {
     --gwi->tmpls;
index 79b6c0919a0c073ae162fc82f695cffb72d3c80a..4bef3204571151018f4de27d823d2058f3a60245 100644 (file)
@@ -114,7 +114,7 @@ base->type = t;
     self->d.exp_call.func = func;
     self->d.exp_call.args = args;
     self->d.exp_call.tmpl = NULL;
-    self->d.exp_call.allow_curry = 0;
+    self->d.exp_call.allow_curry = false;
     self->exp_type = ae_exp_call;
     CHECK_BN(traverse_exp(env, self));
     return self->type;
index c8f294200bcb28ddc6e5036d1c38334fe812f1be..dc5098638b72c4ce04966463bde7e7200821bb11 100644 (file)
@@ -31,6 +31,7 @@ ANN static Type check_internal(const Env env, const Symbol sym, const Exp e,
 
 ANN m_bool check_implicit(const Env env, const Exp e, const Type t) {
   if (e->type == t) return GW_OK;
+  if (isa(e->type, t) > 0) return GW_OK;
   const Symbol sym = insert_symbol("@implicit");
   return (e->cast_to = check_internal(env, sym, e, t)) ? GW_OK : GW_ERROR;
 }
@@ -820,7 +821,6 @@ ANN Type check_exp_call1(const Env env, Exp_Call *const exp) {
   if (func) {
     if (!is_fptr(env->gwion, func->value_ref->type)) // skip function pointers
       if (func != env->func && func->def && !fflag(func, fflag_valid)) {
-        //  if(!fflag(func, fflag_valid)) {
         struct EnvSet es = {.env   = env,
                             .data  = env,
                             .func  = (_exp_func)check_cdef,
@@ -830,6 +830,7 @@ ANN Type check_exp_call1(const Env env, Exp_Call *const exp) {
         CHECK_BO(check_func_def(env, func->def));
         if (es.run) envset_pop(&es, func->value_ref->from->owner_class);
       }
+
     exp->func->type = func->value_ref->type;
     call_add_effect(env, func, exp->func->pos);
     if (func == env->func) set_fflag(env->func, fflag_recurs);
@@ -1815,6 +1816,7 @@ ANN static m_bool _check_class_def(const Env env, const Class_Def cdef) {
       }
     }
   }
+  nspc_allocdata(env->gwion->mp, t->nspc);
   return GW_OK;
 }
 
index 54a8fb824957b79299555dbb1ec1e2de4f54af94..d05038eff8abf4d05025c2eae4bb7fec13edc5e1 100644 (file)
@@ -218,7 +218,8 @@ ANN static Type enum_type(const Env env, const Enum_Def edef) {
   add_type(env, env->curr, t);
   mk_class(env, t, edef->pos);
   if (global) env_pop(env, 0);
-  //  scan0_implicit_similar(env, t, env->gwion->type[et_int]);
+//  scan0_implicit_similar(env, t, env->gwion->type[et_int]);
+//  scan0_implicit_similar(env, env->gwion->type[et_int], t);
   return t;
 }