فهرست منبع

fix: freeArgList使用gc_delReferenc

SongZihuan 3 سال پیش
والد
کامیت
4132e33c42
5فایلهای تغییر یافته به همراه61 افزوده شده و 11 حذف شده
  1. 4 1
      src/core/__gc.h
  2. 1 0
      src/core/env.c
  3. 1 1
      src/core/func.c
  4. 20 1
      src/core/gc.c
  5. 35 8
      src/main.c

+ 4 - 1
src/core/__gc.h

@@ -76,8 +76,11 @@ void gc_addObjectByCore(struct af_Object *obj, af_Core *core);
 void gc_addVarByCore(struct af_Var *obj, af_Core *core);
 void gc_addVarSpaceByCore(struct af_VarSpace *obj, af_Core *core);
 
-/* gc启动函数 : gc的启动由解释器完全管理 */
+/* gc 启动函数 : gc的启动由解释器完全管理 */
 bool gc_RunGC(af_Environment *env);
 void gc_freeAllValue(af_Core *core);
 
+/* gc 信息函数 */
+void printGCByCode(af_Core *core);
+
 #endif //AFUN_GC_H

+ 1 - 0
src/core/env.c

@@ -59,6 +59,7 @@ static void freeCore(af_Core *core) {
     if (core->global != NULL)
         gc_delReference(core->global);
     gc_delReference(core->protect);
+    printGCByCode(core);
     gc_freeAllValue(core);
     free(core);
 }

+ 1 - 1
src/core/func.c

@@ -76,7 +76,7 @@ af_ArgList *freeArgList(af_ArgList *al) {
     af_ArgList *next = al->next;
     free(al->name);
     if (al->obj != NULL)
-        gc_addReference(al->obj);
+        gc_delReference(al->obj);
     free(al);
     return next;
 }

+ 20 - 1
src/core/gc.c

@@ -319,4 +319,23 @@ void gc_freeAllValue(af_Core *core) {
         next = var->gc.next;
         freeVar(var);
     }
-}
+}
+
+void printGCByCode(af_Core *core) {
+    printf("GC ObjectData:\n");
+    for (af_ObjectData *od = core->gc_ObjectData; od != NULL; od = od->gc.next)
+        printf("af_ObjectData(%p) Reference: %d\n", od, od->gc.info.reference);
+
+    printf("GC Object:\n");
+    for (af_Object *obj = core->gc_Object; obj != NULL; obj = obj->gc.next)
+        printf("af_Object(%p->%p) Reference: %d\n", obj, obj->data, obj->gc.info.reference);
+
+    printf("GC VarSpace:\n");
+    for (af_VarSpace *vs = core->gc_VarSpace; vs != NULL; vs = vs->gc.next)
+        printf("af_VarSpace(%p) Reference: %d\n", vs, vs->gc.info.reference);
+
+    printf("GC Var:\n");
+    for (af_Var *var = core->gc_Var; var != NULL; var = var->gc.next)
+        printf("af_Var(%p) Reference: %d\n", var, var->gc.info.reference);
+
+}

+ 35 - 8
src/main.c

@@ -169,6 +169,7 @@ int main() {
     af_Environment *env = makeEnvironment();
     {
         af_ObjectAPI *api = makeObjectAPI();
+        af_Object *obj;
         DLC_SYMBOL(objectAPIFunc) getSize_ = MAKE_SYMBOL(getSize, objectAPIFunc);
         DLC_SYMBOL(objectAPIFunc) initData_ = MAKE_SYMBOL(initData, objectAPIFunc);
         DLC_SYMBOL(objectAPIFunc) freeData_ = MAKE_SYMBOL(freeData, objectAPIFunc);
@@ -180,15 +181,17 @@ int main() {
             return 2;
 
         addVarToProtectVarSpace(makeVar("global", 3, 3,
-                                        makeObject("global", true, api, true, NULL, NULL, env)),
+                                        (obj = makeObject("global", true, api, true, NULL, NULL, env))),
                                 env);
         FREE_SYMBOL(getSize_);
         FREE_SYMBOL(initData_);
         FREE_SYMBOL(freeData_);
+        printf("global(%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);
@@ -206,17 +209,19 @@ int main() {
             return 2;
 
         addVarToProtectVarSpace(makeVar("func", 3, 3,
-                                        makeObject("func", true, api, true, NULL, NULL, env)),
+                                        (obj = makeObject("func", true, api, true, NULL, NULL, env))),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
         FREE_SYMBOL(get_al);
         FREE_SYMBOL(get_info);
         FREE_SYMBOL(free_mark);
+        printf("func(%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);
@@ -234,17 +239,19 @@ int main() {
             return 2;
 
         addVarToProtectVarSpace(makeVar("func2", 3, 3,
-                                        makeObject("func", true, api, true, NULL, NULL, env)),
+                                        (obj = makeObject("func", true, api, true, NULL, NULL, env))),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
         FREE_SYMBOL(get_al);
         FREE_SYMBOL(get_info2);
         FREE_SYMBOL(free_mark);
+        printf("func2(%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);
@@ -262,17 +269,19 @@ int main() {
             return 2;
 
         addVarToProtectVarSpace(makeVar("func3", 3, 3,
-                                        makeObject("func", true, api, true, NULL, NULL, env)),
+                                        (obj = makeObject("func", true, api, true, NULL, NULL, env))),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
         FREE_SYMBOL(get_al);
         FREE_SYMBOL(get_info3);
         FREE_SYMBOL(free_mark);
+        printf("func3(%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);
@@ -293,7 +302,7 @@ int main() {
             return 2;
 
         addVarToProtectVarSpace(makeVar("func4", 3, 3,
-                                        makeObject("func", true, api, true, NULL, NULL, env)),
+                                        (obj = makeObject("func", true, api, true, NULL, NULL, env))),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -301,11 +310,18 @@ int main() {
         FREE_SYMBOL(get_info4);
         FREE_SYMBOL(free_mark);
         FREE_SYMBOL(obj_func);
+        printf("func4(%p)\n", obj);
     }
 
-    addVarToProtectVarSpace(makeVar("object", 3, 3,
-                                    makeObject("object", true, makeObjectAPI(), true, NULL, NULL, env)),
-                            env);
+    {
+        af_Object *obj;
+        addVarToProtectVarSpace(makeVar("object", 3, 3,
+                                        (obj = makeObject("object", true, makeObjectAPI(), true, NULL, NULL, env))),
+                                env);
+        printf("object(%p)\n", obj);
+    }
+
+    printf("\n");
 
     {
         DLC_SYMBOL(TopMsgProcessFunc) func = MAKE_SYMBOL(mp_ERROR_STR, TopMsgProcessFunc);
@@ -532,6 +548,17 @@ int main() {
         printf("\n");
     }
 
+    {  // 函数调用
+        printf("TAG P:\n");
+
+        af_Code *bt2 = makeVariableCode("func", 0, 1, NULL);
+        af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, NULL, NULL);
+
+        iterCode(bt1, env);
+        freeAllCode(bt1);
+        printf("\n");
+    }
+
     freeEnvironment(env);
     return 0;
 }