Browse Source

ncd: allow resolving variables as long as the target statement is up, without any other restrictions

ambrop7 14 năm trước cách đây
mục cha
commit
806290507f
1 tập tin đã thay đổi với 14 bổ sung26 xóa
  1. 14 26
      ncd/ncd.c

+ 14 - 26
ncd/ncd.c

@@ -1223,7 +1223,7 @@ void process_wait_timer_handler (struct process *p)
 struct process_statement * process_find_statement (struct process *p, size_t pos, const char *name)
 {
     process_assert_pointers(p);
-    ASSERT(pos <= process_rap(p))
+    ASSERT(pos <= p->num_statements)
     
     for (size_t i = pos; i > 0; i--) {
         struct process_statement *ps = &p->statements[i - 1];
@@ -1238,7 +1238,7 @@ struct process_statement * process_find_statement (struct process *p, size_t pos
 int process_resolve_name (struct process *p, size_t pos, const char *name, struct process_statement **first_ps, const char **rest)
 {
     process_assert_pointers(p);
-    ASSERT(pos <= process_rap(p))
+    ASSERT(pos <= p->num_statements)
     ASSERT(name)
     
     char *dot = strstr(name, ".");
@@ -1267,7 +1267,7 @@ int process_resolve_name (struct process *p, size_t pos, const char *name, struc
 int process_resolve_variable (struct process *p, size_t pos, const char *varname, NCDValue *out)
 {
     process_assert_pointers(p);
-    ASSERT(pos <= process_rap(p))
+    ASSERT(pos <= p->num_statements)
     ASSERT(varname)
     
     // find referred statement and remaining name
@@ -1311,7 +1311,11 @@ int process_resolve_variable (struct process *p, size_t pos, const char *varname
         return 0;
     }
     
-    ASSERT(rps->state == SSTATE_ADULT)
+    // TODO allow resolving even if not up
+    if (rps->state != SSTATE_ADULT) {
+        process_log(p, BLOG_ERROR, "referred module is not up to resolve variable: %s", varname);
+        return 0;
+    }
     
     // resolve variable in referred statement
     if (!NCDModuleInst_GetVar(&rps->inst, (rest ? rest : ""), out)) {
@@ -1325,7 +1329,7 @@ int process_resolve_variable (struct process *p, size_t pos, const char *varname
 struct process_statement * process_resolve_object (struct process *p, size_t pos, const char *objname)
 {
     process_assert_pointers(p);
-    ASSERT(pos <= process_rap(p))
+    ASSERT(pos <= p->num_statements)
     ASSERT(objname)
     
     // find referred statement and remaining name
@@ -1350,7 +1354,11 @@ struct process_statement * process_resolve_object (struct process *p, size_t pos
         return NULL;
     }
     
-    ASSERT(rps->state == SSTATE_ADULT)
+    // TODO allow resolving even if not up
+    if (rps->state != SSTATE_ADULT) {
+        process_log(p, BLOG_ERROR, "referred module is not up to resolve object: %s", objname);
+        return NULL;
+    }
     
     // Resolve object in referred statement. If there is no rest, resolve empty string
     // instead, or use this statement if it fails. This allows a statement to forward method
@@ -1517,11 +1525,6 @@ int process_statement_instance_func_getvar (struct process_statement *ps, const
 {
     ASSERT(ps->state != SSTATE_FORGOTTEN)
     
-    if (ps->i > process_rap(ps->p)) {
-        process_statement_log(ps, BLOG_ERROR, "tried to resolve variable %s but it's dirty", varname);
-        return 0;
-    }
-    
     return process_resolve_variable(ps->p, ps->i, varname, out);
 }
 
@@ -1529,11 +1532,6 @@ NCDModuleInst * process_statement_instance_func_getobj (struct process_statement
 {
     ASSERT(ps->state != SSTATE_FORGOTTEN)
     
-    if (ps->i > process_rap(ps->p)) {
-        process_statement_log(ps, BLOG_ERROR, "tried to resolve object %s but it's dirty", objname);
-        return 0;
-    }
-    
     struct process_statement *rps = process_resolve_object(ps->p, ps->i, objname);
     if (!rps) {
         return NULL;
@@ -1612,11 +1610,6 @@ int process_moduleprocess_func_getvar (struct process *p, const char *name, NCDV
 {
     ASSERT(p->module_process)
     
-    if (p->num_statements > process_rap(p)) {
-        process_log(p, BLOG_ERROR, "module process tried to resolve variable %s but it's dirty", name);
-        return 0;
-    }
-    
     return process_resolve_variable(p, p->num_statements, name, out);
 }
 
@@ -1624,11 +1617,6 @@ NCDModuleInst * process_moduleprocess_func_getobj (struct process *p, const char
 {
     ASSERT(p->module_process)
     
-    if (p->num_statements > process_rap(p)) {
-        process_log(p, BLOG_ERROR, "module process tried to resolve object %s but it's dirty", name);
-        return NULL;
-    }
-    
     struct process_statement *rps = process_resolve_object(p, p->num_statements, name);
     if (!rps) {
         return NULL;