Sfoglia il codice sorgente

feat: af_ErrorBacktracking添加note字段

SongZihuan 3 anni fa
parent
commit
58cadb2dda
4 ha cambiato i file con 84 aggiunte e 11 eliminazioni
  1. 2 2
      include/env.h
  2. 1 0
      src/core/__env.h
  3. 15 9
      src/core/env.c
  4. 66 0
      src/main.c

+ 2 - 2
include/env.h

@@ -70,13 +70,13 @@ bool changeTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Envi
 bool pushLiteralRegex(char *pattern, char *func, bool in_protect, af_Environment *env);
 
 /* ErrorInfo 创建与释放 */
-af_ErrorInfo *makeErrorInfo(char *type, char *error, FileLine line, FilePath path);
+af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line, FilePath path);
 void freeErrorInfo(af_ErrorInfo *ei);
 
 /* ErrorInfo 操作函数 */
 void fprintfErrorInfo(FILE *file, af_ErrorInfo *ei);
 
 /* ErrorBacktracking 操作函数 */
-void pushErrorBacktracking(FileLine line, FilePath file, af_ErrorInfo *ei);
+void pushErrorBacktracking(FileLine line, FilePath file, char *note, af_ErrorInfo *ei);
 
 #endif //AFUN__ENV_H_PUBLIC

+ 1 - 0
src/core/__env.h

@@ -166,6 +166,7 @@ struct af_LiteralRegex {
 struct af_ErrorBacktracking {
     FilePath file;
     FileLine line;
+    char *note;  // 备注信息
     struct af_ErrorBacktracking *next;
 };
 

+ 15 - 9
src/core/env.c

@@ -44,7 +44,7 @@ static af_LiteralRegex *freeLiteralRegex(af_LiteralRegex *lr);
 static void freeAllLiteralRegex(af_LiteralRegex *lr);
 
 /* af_ErrorBacktracking 创建与释放 */
-static af_ErrorBacktracking *makeErrorBacktracking(FileLine line, FilePath file);
+static af_ErrorBacktracking *makeErrorBacktracking(FileLine line, FilePath file, char *note);
 static af_ErrorBacktracking *freeErrorBacktracking(af_ErrorBacktracking *ebt);
 static void freeAllErrorBacktracking(af_ErrorBacktracking *ebt);
 
@@ -401,9 +401,9 @@ af_Message *makeNORMALMessage(af_Object *obj) {
 }
 
 af_Message *makeERRORMessage(char *type, char *error, af_Environment *env) {
-    af_ErrorInfo *ei = makeErrorInfo(type, error, env->activity->line, env->activity->file);
+    af_ErrorInfo *ei = makeErrorInfo(type, error, NULL, env->activity->line, env->activity->file);
     for (af_Activity *activity = env->activity->prev; activity != NULL; activity = activity->prev)
-        pushErrorBacktracking(activity->line, activity->file, ei);
+        pushErrorBacktracking(activity->line, activity->file, NULL, ei);
 
     af_Message *msg = makeMessage("ERROR", sizeof(af_ErrorInfo *));
     *(af_ErrorInfo **)msg->msg = ei;
@@ -1069,11 +1069,11 @@ bool checkLiteralCode(char *literal, char **func, bool *in_protect, af_Environme
     return false;
 }
 
-af_ErrorInfo *makeErrorInfo(char *type, char *error, FileLine line, FilePath path) {
+af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line, FilePath path) {
     af_ErrorInfo *ei = calloc(1, sizeof(af_ErrorInfo));
     ei->error_type = strCopy(type);
     ei->error = strCopy(error);
-    pushErrorBacktracking(line, path, ei);
+    pushErrorBacktracking(line, path, note, ei);
     return ei;
 }
 
@@ -1088,24 +1088,30 @@ void freeErrorInfo(af_ErrorInfo *ei) {
 
 void fprintfErrorInfo(FILE *file, af_ErrorInfo *ei) {
     fprintf(file, "Error Traceback (most recent call last):\n");
-    for (af_ErrorBacktracking *ebt = ei->track; ebt != NULL; ebt = ebt->next)
+    for (af_ErrorBacktracking *ebt = ei->track; ebt != NULL; ebt = ebt->next) {
         fprintf(file, "  File \"%s\", line %d\n", ebt->file, ebt->line);
+        if (ebt->note != NULL)
+            fprintf(file, "   #note: %s", ebt->note);
+    }
     fprintf(file, "%s: \"%s\"\n", ei->error_type, ei->error);
     fflush(file);
 }
 
-static af_ErrorBacktracking *makeErrorBacktracking(FileLine line, FilePath file) {
+static af_ErrorBacktracking *makeErrorBacktracking(FileLine line, FilePath file, char *note) {
     af_ErrorBacktracking *ebt = calloc(1, sizeof(af_ErrorBacktracking));
     ebt->line = line;
     if (file == NULL)
         ebt->file = strCopy("unknown.af.sys");
     else
         ebt->file = strCopy(file);
+    if (note != NULL)
+        ebt->note = strCopy(note);
     return ebt;
 }
 
 static af_ErrorBacktracking *freeErrorBacktracking(af_ErrorBacktracking *ebt) {
     af_ErrorBacktracking *next = ebt->next;
+    free(ebt->note);
     free(ebt->file);
     free(ebt);
     return next;
@@ -1117,8 +1123,8 @@ static void freeAllErrorBacktracking(af_ErrorBacktracking *ebt) {
     }
 }
 
-void pushErrorBacktracking(FileLine line, FilePath file, af_ErrorInfo *ei) {
-    af_ErrorBacktracking *ebt = makeErrorBacktracking(line, file);
+void pushErrorBacktracking(FileLine line, FilePath file, char *note, af_ErrorInfo *ei) {
+    af_ErrorBacktracking *ebt = makeErrorBacktracking(line, file, note);
     ebt->next = ei->track;
     ei->track = ebt;
 }

+ 66 - 0
src/main.c

@@ -350,6 +350,12 @@ bool getInfo5(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_En
     return true;
 }
 
+bool getInfo10(af_FuncInfo **fi, af_Object *obj, af_Code *code, void *mark, af_Environment *env) {
+    *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
+    makeCodeFuncBodyToFuncInfo(makeElementCode("no-var", NUL, 1, "func9.info.af"), true, NULL, *fi);
+    return true;
+}
+
 bool objFunc(af_Object *obj) {
     return true;
 }
@@ -767,6 +773,52 @@ int main() {
         printf("func8(%p)\n", obj);
     }
 
+    {
+        af_ObjectAPI *api = makeObjectAPI();
+        af_Object *obj;
+        DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_info10 = MAKE_SYMBOL(getInfo10, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize2, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData2, objectAPIFunc);
+        DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData2, objectAPIFunc);
+        if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
+            return 2;
+        if (addAPI(initData_2, "obj_initData", api) != 1)
+            return 2;
+        if (addAPI(freeData_2, "obj_destructData", api) != 1)
+            return 2;
+        if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
+            return 2;
+        if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
+            return 2;
+        if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
+            return 2;
+        if (addAPI(get_info10, "obj_funcGetInfo", api) != 1)
+            return 2;
+        if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
+            return 2;
+        if (addAPI(get_gl, "obj_getGcList", api) != 1)
+            return 2;
+
+        addVarToProtectVarSpace(makeVar("func9", 3, 3, 3,
+                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                env);
+        FREE_SYMBOL(get_alc);
+        FREE_SYMBOL(get_vsl);
+        FREE_SYMBOL(get_al);
+        FREE_SYMBOL(get_info10);
+        FREE_SYMBOL(free_mark);
+        FREE_SYMBOL(get_gl);
+        FREE_SYMBOL(getSize_2);
+        FREE_SYMBOL(initData_2);
+        FREE_SYMBOL(freeData_2);
+        printf("func9(%p)\n", obj);
+    }
+
     printf("\n");
     enableEnvironment(env);
 
@@ -1066,6 +1118,20 @@ int main() {
         printf("\n");
     }
 
+    {  // 错误回溯测试
+        printf("TAG W: ERROR\n");
+
+        af_Code *bt2 = makeElementCode("func9", 0, 1, NULL);
+        af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "TagW.error.af", NULL);
+
+        af_Code *bt3 = makeElementCode("global", 0, 1, NULL);
+        connectCode(&bt1, bt3);
+
+        iterCode(bt1, env);
+        freeAllCode(bt1);
+        printf("\n");
+    }
+
     printf("freeEnvironment:\n");
     freeEnvironment(env);
     return 0;