]> Nishi Git Mirror - gwion.git/commitdiff
:fire: handle multiple passes
authorfennecdjay <fennecdjay@gmail.com>
Mon, 12 Feb 2024 23:41:44 +0000 (00:41 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Mon, 12 Feb 2024 23:41:44 +0000 (00:41 +0100)
src/parse/check.c
src/parse/scan1.c
src/pass.c

index 4fb877fa9ebb97f81894c96a0d4019df34b86201..35982546afec98f848b773555cbfb8dfa93b9d0c 100644 (file)
@@ -2306,7 +2306,11 @@ ANN static inline void check_unhandled(const Env env) {
 ANN static void check_extend(const Env env, Ast ast) {
   for(m_uint i = 0; i < ast->len; i++) {
     Section * section = mp_vector_at(ast, Section, i);
-    (void)check_section(env, section);
+    if(section->poison) continue;
+    if(!check_section(env, section)) {
+      section->poison = true;
+      continue;
+    }
     mp_vector_add(env->gwion->mp, &env->context->tree, Section, *section);
   }
   free_mp_vector(env->gwion->mp, Section, env->context->extend);
@@ -2315,15 +2319,19 @@ ANN static void check_extend(const Env env, Ast ast) {
 
 ANN bool check_ast(const Env env, Ast *ast) {
   Ast a = *ast;
+  bool ok = true;
   for(m_uint i = 0; i < a->len; i++) {
     Section * section = mp_vector_at(a, Section, i);
-    if(section->poison) return false;
+    if(section->poison) {
+      ok = false;
+      continue;
+    }
     if(!check_section(env, section)) {
       section->poison = true;
-      return false;
+      ok = false;
     }
   }
-  if(vector_size(&env->scope->effects)) check_unhandled(env);
   if(env->context->extend) check_extend(env, env->context->extend);
-  return true;
+  if(ok && vector_size(&env->scope->effects)) check_unhandled(env);
+  return ok;
 }
index 812c3452231bc934d210d186227abd3c706945b6..f929b5e873e6dd1da3b89c3a5a017aa71df09edd 100644 (file)
@@ -911,7 +911,6 @@ ANN bool scan1_ast(const Env env, Ast *ast) {
     if(!scan1_section(env, section)) {
       section->poison = true;
       ok = false;
-      return false;
     }
   }
   return ok;
index f050c0d1d7809a0b681111f3c5d5ca8bef53fd7a..fdde35a557ed614aa0d4e62b3a9548f621d462b4 100644 (file)
 
 static m_bool typecheck_ast(const Env env, Ast *ast) {
   env->scope->poison = false; // move me
-  CHECK_b(traverse_ast(env, ast));
+  scan0_ast(env, ast);
   if(env->scope->poison)env->context->error = true;
+  scan1_ast(env, ast);
+  if(env->scope->poison)env->context->error = true;
+  scan2_ast(env, ast);
+  if(env->scope->poison)env->context->error = true;
+    CHECK_b(check_ast(env, ast));
+  if(env->scope->poison)env->context->error = true;
+//  CHECK_b(traverse_ast(env, ast));
+//  if(env->scope->poison)env->context->error = true;
   if(env->context->error)return GW_ERROR;
   return GW_OK;
 }