]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve templating
authorfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 9 Oct 2019 00:50:08 +0000 (02:50 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Wed, 9 Oct 2019 00:50:08 +0000 (02:50 +0200)
src/emit/emit.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c
src/parse/template.c
src/parse/traverse.c

index a3b8b166ad071535c9455a2078e4727e1247015a..7d82d2aa0e7ef11c53f78f1178f931fff71ac9c6 100644 (file)
@@ -1249,6 +1249,7 @@ ANN static void emit_pop_stack(const Emitter emit, const m_uint index) {
   emit_pop_scope(emit);
 }
 
+// scope push problem
 ANN static m_bool emit_stmt_flow(const Emitter emit, const Stmt_Flow stmt) {
   const m_uint index = emit_code_size(emit);
   Instr op = NULL;
@@ -1268,6 +1269,7 @@ ANN static m_bool emit_stmt_flow(const Emitter emit, const Stmt_Flow stmt) {
   return GW_OK;
 }
 
+// scope push problem
 ANN static m_bool emit_stmt_for(const Emitter emit, const Stmt_For stmt) {
   emit_push_stack(emit);
   CHECK_BB(emit_stmt(emit, stmt->c1, 1))
@@ -1293,6 +1295,7 @@ ANN static Instr emit_stmt_autoptr_init(const Emitter emit, const Type type) {
   return emit_add_instr(emit, Reg2Mem);
 }
 
+// scope push problem
 ANN static m_bool emit_stmt_auto(const Emitter emit, const Stmt_Auto stmt) {
   CHECK_BB(emit_exp(emit, stmt->exp, 0))
   const Instr s1 = emit_add_instr(emit, MemSetImm);
@@ -1319,6 +1322,7 @@ ANN static m_bool emit_stmt_auto(const Emitter emit, const Stmt_Auto stmt) {
   return GW_OK;
 }
 
+// scope push problem
 ANN static m_bool emit_stmt_loop(const Emitter emit, const Stmt_Loop stmt) {
   emit_push_stack(emit);
   CHECK_BB(emit_exp_pop_next(emit, stmt->cond, 0))
@@ -1357,6 +1361,8 @@ ANN static m_bool emit_stmt_jump(const Emitter emit, const Stmt_Jump stmt) {
 }
 
 ANN static m_bool emit_type_def(const Emitter emit, const Type_Def tdef) {
+  if(SAFE_FLAG(tdef->type->e->def, emit))
+    return GW_OK;
   return tdef->type->e->def ? emit_class_def(emit, tdef->type->e->def) : 1;
 }
 
@@ -1864,7 +1870,7 @@ ANN Code* emit_class_code(const Emitter emit, const m_str name) {
 ANN static m_bool emit_parent(const Emitter emit, const Class_Def cdef) {
   const Type parent = cdef->base.type->e->parent;
   const Type base = parent->e->d.base_type;
-  if(base && !GET_FLAG(base, emit))
+  if(base && base->e->def && !GET_FLAG(base, emit))
     CHECK_BB(emit_cdef(emit, base->e->def))
   return !GET_FLAG(parent, emit) ? scanx_parent(parent, emit_cdef, emit) : GW_OK;
 }
@@ -1879,13 +1885,23 @@ ANN void emit_class_finish(const Emitter emit, const Nspc nspc) {
   SET_FLAG(nspc->pre_ctor, ctor);
 }
 
+ANN static m_bool cdef_parent(const Emitter emit, const Class_Def cdef) {
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    CHECK_BB(template_push_types(emit->env, cdef->base.tmpl))
+  const m_bool ret = scanx_parent(cdef->base.type, emit_parent, emit);
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    nspc_pop_type(emit->gwion->mp, emit->env->curr);
+  return ret;
+}
+
 ANN static m_bool emit_class_def(const Emitter emit, const Class_Def cdef) {
   if(tmpl_base(cdef->base.tmpl))
     return GW_OK;
+if(GET_FLAG(cdef->base.type, emit))return GW_OK;
   const Type type = cdef->base.type;
   const Nspc nspc = type->nspc;
-  if(cdef->base.ext && cdef->base.ext->types)
-    CHECK_BB(scanx_parent(cdef->base.type, emit_parent, emit))
+  if(cdef->base.ext && !GET_FLAG(cdef->base.type->e->parent, emit))
+    CHECK_BB(cdef_parent(emit, cdef))
   SET_FLAG(type, emit);
   nspc_allocdata(emit->gwion->mp, nspc);
   emit_class_code(emit, type->name);
index 3e6fa6f031f68fd0d7ef21ad47d4c5ef9ee723f8..87c5fc5a43b3eec52dd7be7e7ba0938d0142aa56 100644 (file)
@@ -1405,7 +1405,7 @@ ANN m_bool check_func_def(const Env env, const Func_Def fdef) {
 #define check_fptr_def dummy_func
 DECL_SECTION_FUNC(check)
 
-ANN static m_bool check_class_parent(const Env env, const Class_Def cdef) {
+ANN static m_bool check_parent(const Env env, const Class_Def cdef) {
   const Type parent = cdef->base.type->e->parent;
   const Type_Decl *td = cdef->base.ext;
   if(td->array)
@@ -1424,9 +1424,19 @@ ANN static inline void inherit(const Type t) {
     vector_copy2(&parent->info->vtable, &nspc->info->vtable);
 }
 
+ANN static m_bool cdef_parent(const Env env, const Class_Def cdef) {
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    CHECK_BB(template_push_types(env, cdef->base.tmpl))
+  const m_bool ret = scanx_parent(cdef->base.type, check_parent, env);
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    nspc_pop_type(env->gwion->mp, env->curr);
+  return ret;
+}
+
 ANN m_bool check_class_def(const Env env, const Class_Def cdef) {
   if(tmpl_base(cdef->base.tmpl))
     return GW_OK;
+if(GET_FLAG(cdef->base.type, checked))return GW_OK;
   const Type type = cdef->base.type;
   SET_FLAG(type, check);
   if(type->e->parent == env->gwion->type[et_undefined]) {
@@ -1434,7 +1444,7 @@ ANN m_bool check_class_def(const Env env, const Class_Def cdef) {
     return traverse_cdef(env, cdef);
   }
   if(cdef->base.ext)
-    CHECK_BB(scanx_parent(cdef->base.type, check_class_parent, env))
+    CHECK_BB(cdef_parent(env, cdef))
   assert(type->e->parent);
   inherit(type);
   if(cdef->body)
index 17d85f5f122b1a78da32e82bf9858a9a1e2790c7..7c96c8397e54ec47b6b3e55393723004aff581d2 100644 (file)
@@ -416,7 +416,8 @@ ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
 DECL_SECTION_FUNC(scan1)
 
 ANN static Type scan1_get_parent(const Env env, const Type_Def tdef) {
-  DECL_OO(const Type , parent, = tdef->type->e->parent = known_type(env, tdef->ext))
+  const Type parent = known_type(env, tdef->ext);
+  CHECK_OO((tdef->type->e->parent = parent));
   Type t = parent;
   do if(tdef->type == t)
       ERR_O(td_pos(tdef->ext), _("recursive (%s <= %s) class declaration."), tdef->type->name, t->name)
@@ -440,12 +441,22 @@ ANN static m_bool scan1_parent(const Env env, const Class_Def cdef) {
   return GW_OK;
 }
 
+ANN static m_bool cdef_parent(const Env env, const Class_Def cdef) {
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    CHECK_BB(template_push_types(env, cdef->base.tmpl))
+  const m_bool ret = scanx_parent(cdef->base.type, scan1_parent, env);
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    nspc_pop_type(env->gwion->mp, env->curr);
+  return ret;
+}
+
 ANN m_bool scan1_class_def(const Env env, const Class_Def cdef) {
   if(tmpl_base(cdef->base.tmpl))
     return GW_OK;
+  if(GET_FLAG(cdef->base.type, scan1))return GW_OK;
   SET_FLAG(cdef->base.type, scan1);
   if(cdef->base.ext)
-    CHECK_BB(scanx_parent(cdef->base.type, scan1_parent, env))
+    CHECK_BB(cdef_parent(env, cdef))
   if(cdef->body)
     CHECK_BB(env_body(env, cdef, scan1_section))
   SET_FLAG(cdef, scan1);
index 39ee67a2f4c1c1d352dc846ded112f4614f40a9f..f9ee49bdf8611074192f760eae6b7d298d388403 100644 (file)
@@ -519,7 +519,7 @@ ANN m_bool scan2_func_def(const Env env, const Func_Def f) {
 #define scan2_enum_def dummy_func
 DECL_SECTION_FUNC(scan2)
 
-ANN static m_bool scan2_class_parent(const Env env, const Class_Def cdef) {
+ANN static m_bool scan2_parent(const Env env, const Class_Def cdef) {
   const Type parent = cdef->base.type->e->parent;
   if(parent->e->def && !GET_FLAG(parent, scan2))
     CHECK_BB(scanx_parent(parent, scan2_cdef, env))
@@ -528,12 +528,22 @@ ANN static m_bool scan2_class_parent(const Env env, const Class_Def cdef) {
   return GW_OK;
 }
 
+ANN static m_bool cdef_parent(const Env env, const Class_Def cdef) {
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    CHECK_BB(template_push_types(env, cdef->base.tmpl))
+  const m_bool ret = scanx_parent(cdef->base.type, scan2_parent, env);
+  if(cdef->base.tmpl && cdef->base.tmpl->list)
+    nspc_pop_type(env->gwion->mp, env->curr);
+  return ret;
+}
+
 ANN m_bool scan2_class_def(const Env env, const Class_Def cdef) {
   if(tmpl_base(cdef->base.tmpl))
     return GW_OK;
+  if(GET_FLAG(cdef->base.type, scan2))return GW_OK;
   SET_FLAG(cdef->base.type, scan2);
   if(cdef->base.ext)
-    CHECK_BB(scanx_parent(cdef->base.type, scan2_class_parent, env))
+    CHECK_BB(cdef_parent(env, cdef))
   if(cdef->body)
     CHECK_BB(env_body(env, cdef, scan2_section))
   return GW_OK;
index 7c66afb8ca0c5d0c82dfa53e3411abe8e34c215a..82d7778d8bcf1f254ca384c9de93bc1064822102 100644 (file)
@@ -130,7 +130,7 @@ ANN static Class_Def template_class(const Env env, const Class_Def def, const Ty
   DECL_OO(const Symbol, name, = template_id(env, def, call))
   if(env->class_def && name == insert_symbol(env->class_def->name))
      return env->class_def->e->def;
-  const Type t = nspc_lookup_type0(env->curr, name);
+  const Type t = nspc_lookup_type1(env->curr, name);
   if(t)
     return t->e->def;
   const Class_Def c = cpy_class_def(env->gwion->mp, def);
index 9442b6a555fdb7a3cb24014ccea9b209be84e91c..dba8c910cef6b088c3061475e581f539e094aa0b 100644 (file)
@@ -59,5 +59,7 @@ ANN m_bool traverse_class_def(const Env env, const Class_Def def) {
     CHECK_BB(scan1_class_def(env, def))
   if(!GET_FLAG(def, scan2))
     CHECK_BB(scan2_class_def(env, def))
-  return check_class_def(env, def);
+  if(!GET_FLAG(def, checked))
+    return check_class_def(env, def);
+  return GW_OK;
 }