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

ncd: NCDInterpProcess: store command name as a string ID

ambrop7 13 лет назад
Родитель
Сommit
de044df707
3 измененных файлов с 12 добавлено и 13 удалено
  1. 6 9
      ncd/NCDInterpProcess.c
  2. 2 2
      ncd/NCDInterpProcess.h
  3. 4 2
      ncd/NCDInterpreter.c

+ 6 - 9
ncd/NCDInterpProcess.c

@@ -203,7 +203,6 @@ int NCDInterpProcess_Init (NCDInterpProcess *o, NCDProcess *process, NCDStringIn
         struct NCDInterpProcess__stmt *e = &o->stmts[o->num_stmts];
         
         e->name = -1;
-        e->cmdname = NULL;
         e->objnames = NULL;
         e->num_objnames = 0;
         e->alloc_size = 0;
@@ -216,8 +215,9 @@ int NCDInterpProcess_Init (NCDInterpProcess *o, NCDProcess *process, NCDStringIn
             }
         }
         
-        if (!(e->cmdname = b_strdup(NCDStatement_RegCmdName(s)))) {
-            BLog(BLOG_ERROR, "b_strdup failed");
+        e->cmdname = NCDStringIndex_Get(string_index, NCDStatement_RegCmdName(s));
+        if (e->cmdname < 0) {
+            BLog(BLOG_ERROR, "NCDStringIndex_Get failed");
             goto loop_fail0;
         }
         
@@ -276,7 +276,6 @@ int NCDInterpProcess_Init (NCDInterpProcess *o, NCDProcess *process, NCDStringIn
     loop_fail1:
         NCDValReplaceProg_Free(&e->arg_prog);
     loop_fail0:
-        free(e->cmdname);
         goto fail3;
     }
     
@@ -291,7 +290,6 @@ fail3:
         BFree(e->objnames);
         BFree(e->arg_data);
         NCDValReplaceProg_Free(&e->arg_prog);
-        free(e->cmdname);
     }
     free(o->name);
 fail2:
@@ -311,7 +309,6 @@ void NCDInterpProcess_Free (NCDInterpProcess *o)
         BFree(e->objnames);
         BFree(e->arg_data);
         NCDValReplaceProg_Free(&e->arg_prog);
-        free(e->cmdname);
     }
     
     free(o->name);
@@ -343,14 +340,14 @@ int NCDInterpProcess_FindStatement (NCDInterpProcess *o, int from_index, NCD_str
     return -1;
 }
 
-const char * NCDInterpProcess_StatementCmdName (NCDInterpProcess *o, int i)
+const char * NCDInterpProcess_StatementCmdName (NCDInterpProcess *o, int i, NCDStringIndex *string_index)
 {
     DebugObject_Access(&o->d_obj);
     ASSERT(i >= 0)
     ASSERT(i < o->num_stmts)
-    ASSERT(o->stmts[i].cmdname)
+    ASSERT(string_index)
     
-    return o->stmts[i].cmdname;
+    return NCDStringIndex_Value(string_index, o->stmts[i].cmdname);
 }
 
 void NCDInterpProcess_StatementObjNames (NCDInterpProcess *o, int i, const NCD_string_id_t **out_objnames, size_t *out_num_objnames)

+ 2 - 2
ncd/NCDInterpProcess.h

@@ -44,7 +44,7 @@
 
 struct NCDInterpProcess__stmt {
     NCD_string_id_t name;
-    char *cmdname;
+    NCD_string_id_t cmdname;
     NCD_string_id_t *objnames;
     size_t num_objnames;
     union {
@@ -83,7 +83,7 @@ typedef struct {
 int NCDInterpProcess_Init (NCDInterpProcess *o, NCDProcess *process, NCDStringIndex *string_index, NCDPlaceholderDb *pdb, NCDModuleIndex *module_index, NCDMethodIndex *method_index) WARN_UNUSED;
 void NCDInterpProcess_Free (NCDInterpProcess *o);
 int NCDInterpProcess_FindStatement (NCDInterpProcess *o, int from_index, NCD_string_id_t name);
-const char * NCDInterpProcess_StatementCmdName (NCDInterpProcess *o, int i);
+const char * NCDInterpProcess_StatementCmdName (NCDInterpProcess *o, int i, NCDStringIndex *string_index);
 void NCDInterpProcess_StatementObjNames (NCDInterpProcess *o, int i, const NCD_string_id_t **out_objnames, size_t *out_num_objnames);
 const struct NCDModule * NCDInterpProcess_StatementGetSimpleModule (NCDInterpProcess *o, int i);
 const struct NCDModule * NCDInterpProcess_StatementGetMethodModule (NCDInterpProcess *o, int i, NCD_string_id_t obj_type, NCDMethodIndex *method_index);

+ 4 - 2
ncd/NCDInterpreter.c

@@ -827,7 +827,8 @@ void process_advance (struct process *p)
         module = NCDInterpProcess_StatementGetSimpleModule(p->iprocess, p->ap);
         
         if (!module) {
-            statement_log(ps, BLOG_ERROR, "unknown simple statement: %s", NCDInterpProcess_StatementCmdName(p->iprocess, p->ap));
+            const char *cmdname_str = NCDInterpProcess_StatementCmdName(p->iprocess, p->ap, &p->interp->string_index);
+            statement_log(ps, BLOG_ERROR, "unknown simple statement: %s", cmdname_str);
             goto fail0;
         }
     } else {
@@ -850,7 +851,8 @@ void process_advance (struct process *p)
         
         if (!module) {
             const char *type_str = NCDStringIndex_Value(&p->interp->string_index, object_type);
-            statement_log(ps, BLOG_ERROR, "unknown method statement: %s::%s", type_str, NCDInterpProcess_StatementCmdName(p->iprocess, p->ap));
+            const char *cmdname_str = NCDInterpProcess_StatementCmdName(p->iprocess, p->ap, &p->interp->string_index);
+            statement_log(ps, BLOG_ERROR, "unknown method statement: %s::%s", type_str, cmdname_str);
             goto fail0;
         }
     }