Просмотр исходного кода

ncd: NCDModule, NCDInterpreter: report module errors to interpreter as a separate event, not by setting a flag

ambrop7 13 лет назад
Родитель
Сommit
b4252374bb
3 измененных файлов с 27 добавлено и 20 удалено
  1. 25 14
      ncd/NCDInterpreter.c
  2. 1 5
      ncd/NCDModule.c
  3. 1 1
      ncd/NCDModule.h

+ 25 - 14
ncd/NCDInterpreter.c

@@ -848,13 +848,7 @@ again:
     
     
     // optimize for statements which can be destroyed immediately
     // optimize for statements which can be destroyed immediately
     if (NCDModuleInst_TryFree(&ps->inst)) {
     if (NCDModuleInst_TryFree(&ps->inst)) {
-        if (BLog_WouldLog(BLOG_INFO, BLOG_CURRENT_CHANNEL)) {
-            if (ps->inst.is_error) {
-                statement_log(ps, BLOG_ERROR, "died with error");
-            } else {
-                statement_log(ps, BLOG_INFO, "died");
-            }
-        }
+        statement_log(ps, BLOG_INFO, "died");
         
         
         // free arguments memory
         // free arguments memory
         NCDValMem_Free(&ps->args_mem);
         NCDValMem_Free(&ps->args_mem);
@@ -1224,13 +1218,30 @@ void statement_instance_func_event (NCDModuleInst *inst, int event)
         } break;
         } break;
         
         
         case NCDMODULE_EVENT_DEAD: {
         case NCDMODULE_EVENT_DEAD: {
-            if (BLog_WouldLog(BLOG_INFO, BLOG_CURRENT_CHANNEL)) {
-                if (ps->inst.is_error) {
-                    statement_log(ps, BLOG_ERROR, "died with error");
-                } else {
-                    statement_log(ps, BLOG_INFO, "died");
-                }
+            statement_log(ps, BLOG_INFO, "died");
+            
+            // free instance
+            NCDModuleInst_Free(&ps->inst);
+            
+            // free arguments memory
+            NCDValMem_Free(&ps->args_mem);
+            
+            // set state FORGOTTEN
+            ps->inst.istate = SSTATE_FORGOTTEN;
+            
+            // update AP
+            if (p->ap > ps->i) {
+                p->ap = ps->i;
+            }
+            
+            // update FP
+            while (p->fp > 0 && p->statements[p->fp - 1].inst.istate == SSTATE_FORGOTTEN) {
+                p->fp--;
             }
             }
+        } break;
+        
+        case NCDMODULE_EVENT_DEADERROR: {
+            statement_log(ps, BLOG_ERROR, "died with error");
             
             
             // free instance
             // free instance
             NCDModuleInst_Free(&ps->inst);
             NCDModuleInst_Free(&ps->inst);
@@ -1242,7 +1253,7 @@ void statement_instance_func_event (NCDModuleInst *inst, int event)
             ps->inst.istate = SSTATE_FORGOTTEN;
             ps->inst.istate = SSTATE_FORGOTTEN;
             
             
             // set error
             // set error
-            if (ps->inst.is_error && ps->i < p->ap) {
+            if (ps->i < p->ap) {
                 p->error = 1;
                 p->error = 1;
             }
             }
             
             

+ 1 - 5
ncd/NCDModule.c

@@ -98,9 +98,6 @@ void NCDModuleInst_Init (NCDModuleInst *n, const struct NCDModule *m, void *meth
     // set initial state
     // set initial state
     n->state = STATE_DOWN_CLEAN;
     n->state = STATE_DOWN_CLEAN;
     
     
-    // clear error flag
-    n->is_error = 0;
-    
     // give NCDModuleInst to methods, not mem
     // give NCDModuleInst to methods, not mem
     n->pass_mem_to_methods = 0;
     n->pass_mem_to_methods = 0;
     
     
@@ -292,9 +289,8 @@ void NCDModuleInst_Backend_DeadError (NCDModuleInst *n)
            n->state == STATE_UP || n->state == STATE_DYING)
            n->state == STATE_UP || n->state == STATE_DYING)
     
     
     n->state = STATE_DEAD;
     n->state = STATE_DEAD;
-    n->is_error = 1;
     
     
-    frontend_event(n, NCDMODULE_EVENT_DEAD);
+    frontend_event(n, NCDMODULE_EVENT_DEADERROR);
     return;
     return;
 }
 }
 
 

+ 1 - 1
ncd/NCDModule.h

@@ -52,6 +52,7 @@
 #define NCDMODULE_EVENT_DOWN 2
 #define NCDMODULE_EVENT_DOWN 2
 #define NCDMODULE_EVENT_DOWNUP 3
 #define NCDMODULE_EVENT_DOWNUP 3
 #define NCDMODULE_EVENT_DEAD 4
 #define NCDMODULE_EVENT_DEAD 4
+#define NCDMODULE_EVENT_DEADERROR 5
 
 
 struct NCDModuleInst_s;
 struct NCDModuleInst_s;
 struct NCDModuleProcess_s;
 struct NCDModuleProcess_s;
@@ -355,7 +356,6 @@ typedef struct NCDModuleInst_s {
     const struct NCDModuleInst_params *params;
     const struct NCDModuleInst_params *params;
     void *mem; // not modified by NCDModuleInst (but passed to module)
     void *mem; // not modified by NCDModuleInst (but passed to module)
     unsigned int state:3;
     unsigned int state:3;
-    unsigned int is_error:1;
     unsigned int pass_mem_to_methods:1;
     unsigned int pass_mem_to_methods:1;
     unsigned int istate:3; // untouched by NCDModuleInst
     unsigned int istate:3; // untouched by NCDModuleInst
     DebugObject d_obj;
     DebugObject d_obj;