]> Nishi Git Mirror - gwion.git/commitdiff
:fire: more on poisoning
authorfennecdjay <fennecdjay@gmail.com>
Mon, 26 Feb 2024 20:10:10 +0000 (21:10 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Mon, 26 Feb 2024 20:10:10 +0000 (21:10 +0100)
include/parse.h
src/parse/check.c
src/parse/scan0.c
src/parse/scan1.c
src/parse/scan2.c
src/parse/scanx.c

index 3fc734a57c1d8ed4eb20d8c78ede9b953e85b7d7..4edcfb7986ac795adbf7212437f48e068c04efed 100644 (file)
     (node)-> poison = true;                                                    \
   } while(false)
 
+#define POISON_SECTION(ok, env, node)                                          \
+  do {                                                                         \
+    if(node->section_type != ae_section_stmt)                                  \
+      POISON_NODE(ok, env, node);                                              \
+    else                                                                       \
+      env->context->error = true;                                              \
+} while(false)
+
 #define ERR_OK_NODE(ok, a, b, c, ...)                                          \
   do {                                                                         \
     env_err(env, (b), (c), ##__VA_ARGS__);                                     \
index 3daceb3f12f69fdf385cb37864d9d653dda11b3c..28c7daafb3df376c381f0422e2a8d5ce4e2a5974 100644 (file)
@@ -1354,7 +1354,7 @@ ANN Type check_exp(const Env env, Exp* exp) {
   env_weight(env, 1);
   do {
     if(curr->type) continue;
-    if(curr->poison) continue;
+    if(curr->poison) { ok = false; continue;}
     if(!(curr->type = check_exp_func[curr->exp_type](env, &curr->d)) || curr->type->error) {
       POISON_NODE(ok, env, curr);
       continue;
@@ -1750,6 +1750,7 @@ ANN bool check_stmt_list(const Env env, Stmt_List l) {
   bool ok = true;
   for(m_uint i = 0; i < l->len; i++) {
     Stmt* stmt = mp_vector_at(l, Stmt, i);
+    if(stmt->poison) { ok = false; continue;}
     if(!check_stmt(env, stmt))
       POISON_NODE(ok, env, stmt);
   }
@@ -2303,18 +2304,20 @@ ANN static inline void check_unhandled(const Env env) {
   vector_pop(v);
 }
 
-ANN static void check_extend(const Env env, Ast ast) {
+ANN static bool check_extend(const Env env, Ast ast) {
+  bool ok = true;
   for(m_uint i = 0; i < ast->len; i++) {
     Section * section = mp_vector_at(ast, Section, i);
     if(section->poison) continue;
     if(!check_section(env, section)) {
-      section->poison = true;
+      POISON_SECTION(ok, env, section);
       continue;
     }
     mp_vector_add(env->gwion->mp, &env->context->tree, Section, *section);
   }
   free_mp_vector(env->gwion->mp, Section, env->context->extend);
   env->context->extend = NULL;
+  return ok;
 }
 
 ANN bool check_ast(const Env env, Ast *ast) {
@@ -2322,9 +2325,9 @@ ANN bool check_ast(const Env env, Ast *ast) {
   bool ok = true;
   for(m_uint i = 0; i < a->len; i++) {
     Section * section = mp_vector_at(a, Section, i);
-    if(section->poison) continue;
+    if(section->poison) { ok = false; continue;} 
     if(!check_section(env, section))
-      POISON_NODE(ok, env, section);
+      POISON_SECTION(ok, env, section);
   }
   if(env->context->extend) check_extend(env, env->context->extend);
   if(ok && vector_size(&env->scope->effects)) check_unhandled(env);
index fa1dc569fc47001a227f15fc949b22feae81ef70..d1dede595b90e53c27b6bb7101a842111a5c6594 100644 (file)
@@ -409,6 +409,7 @@ ANN static bool scan0_stmt_list(const Env env, Stmt_List l) {
   bool ok = true;
   for(m_uint i = 0; i < l->len; i++) {
     Stmt* stmt = mp_vector_at(l, Stmt, i);
+    if(stmt->poison) { ok = false; continue; }
     if (stmt->stmt_type == ae_stmt_pp) {
       if (stmt->d.stmt_pp.pp_type == ae_pp_include)
         env->name = stmt->d.stmt_pp.data;
@@ -481,6 +482,7 @@ ANN static bool _scan0_trait_def(const Env env, const Trait_Def pdef) {
   bool ok = true;
   for(m_uint i = 0; i < ast->len; i++) {
     Section *section = mp_vector_at(ast, Section, i);
+    if(section->poison) { ok = false; continue; }
     if (section->section_type == ae_section_func) {
       const Func_Def fdef = section->d.func_def;
       if (fdef->base->flag != ae_flag_none &&
@@ -492,6 +494,7 @@ ANN static bool _scan0_trait_def(const Env env, const Trait_Def pdef) {
       Stmt_List list = section->d.stmt_list;
       for(uint32_t i = 0; i < list->len; i++) {
         Stmt* stmt = mp_vector_at(list, Stmt, i);
+        if(stmt->poison) { ok = false; continue;}
         if(stmt->d.stmt_exp.val->exp_type != ae_exp_decl)
           ERR_OK(ok, stmt->loc, "trait can only contains variable requests and functions");
       }
@@ -567,8 +570,9 @@ ANN bool scan0_ast(const Env env, Ast *ast) {
   bool ok = true;
   for(m_uint i = 0; i < a->len; i++) {
     Section * section = mp_vector_at(a, Section, i);
+    if(section->poison) { ok = false; continue;}
     if(!scan0_section(env, section))
-      POISON_NODE(ok, env, section);
+      POISON_SECTION(ok, env, section);
   }
   return ok;
 }
index 8a1d6cf98fa835956269415177d0ec2aea4572ca..6474f9366911bdc0c8d4dd806dd5a28f9be14263 100644 (file)
@@ -645,6 +645,7 @@ ANN static bool scan1_stmt_list(const Env env, Stmt_List l) {
   bool ok = true;
   for(i = 0; i < l->len; i++) {
     Stmt* stmt = mp_vector_at(l, Stmt, i);
+    if(stmt->poison) { ok = false; continue;}
     if(!scan1_stmt(env, stmt)) {
       POISON_NODE(ok, env, stmt);
       continue;
@@ -845,10 +846,12 @@ ANN static bool scan1_class_def_body(const Env env, const Class_Def cdef) {
     Ast body = new_mp_vector(mp, Section, 1); // room for ctor
     for(uint32_t i = 0; i < base->len; i++) {
       Section section = *mp_vector_at(base, Section, i);
+      if(section.poison) continue;
       if(section.section_type == ae_section_stmt) {
         Stmt_List list = section.d.stmt_list;
         for(uint32_t j = 0; j < list->len; j++) {
           Stmt* stmt = mp_vector_at(list, Stmt, j);
+          if(stmt->poison) continue;
           mp_vector_add(mp, &ctor, Stmt, *stmt);
         }
       } else mp_vector_add(mp, &body, Section, section);
@@ -911,9 +914,9 @@ ANN bool scan1_ast(const Env env, Ast *ast) {
   bool ok = true;
   for(m_uint i = 0; i < a->len; i++) {
     Section *section = mp_vector_at(a, Section, i);
-    if(section->poison) continue;
+    if(section->poison) { ok = false; continue;}
     if(!scan1_section(env, section))
-      POISON_NODE(ok, env, section);
+      POISON_SECTION(ok, env, section);
   }
   return ok;
 }
index 211fdfe7ca101ae41ff2452c71060e4864d9989e..b69d6a31bc59589ae78bc95626c3e0f58c3fe0e7 100644 (file)
@@ -275,6 +275,7 @@ ANN static bool scan2_stmt_list(const Env env, Stmt_List l) {
   bool ok = true;
   for(m_uint i = 0; i < l->len; i++) {
     Stmt* stmt = mp_vector_at(l, Stmt, i);
+    if(stmt->poison) { ok = false; continue; }
     if(!scan2_stmt(env, stmt))
       POISON_NODE(ok, env, stmt);
   }
@@ -634,9 +635,9 @@ ANN bool scan2_ast(const Env env, Ast *ast) {
   bool ok = true;
   for(m_uint i = 0; i < a->len; i++) {
     Section *section = mp_vector_at(a, Section, i);
-    if(section->poison) continue;
+    if(section->poison) { ok = false; continue;}
     if(!scan2_section(env, section)) {
-      POISON_NODE(ok, env, section);
+      POISON_SECTION(ok, env, section);
       continue;
     }
     if (section->section_type == ae_section_func &&
index 2d1629b8995cd27bf9aef59005b50b78a53ce2c7..ccafa9e82a27152f4af3a9f40d767ccf1a1f99a3 100644 (file)
@@ -10,9 +10,9 @@ ANN static inline bool _body(const Env env, Ast ast, const _envset_func f) {
   bool ok = true;
   for(m_uint i = 0; i < ast->len; i++) {
     Section *section = mp_vector_at(ast, Section, i);
-    if(section->poison) continue;
+    if(section->poison) { ok = false; continue; }
     if(!f(env, section))
-      POISON_NODE(ok, env, section);
+      POISON_SECTION(ok, env, section);
   }
   return ok;
 }