Переглянути джерело

fix: 修复 freeObjectData 内存错误

SongZihuan 3 роки тому
батько
коміт
d14b0e7839

+ 3 - 1
include/core/gc.h

@@ -22,7 +22,8 @@ enum af_GcListType {
 #define gc_delReference(obj, env) ((_Generic((obj), \
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
-                               af_VarSpace *: gc_delVarSpaceReference))((obj), (env)))
+                               af_VarSpace *: gc_delVarSpaceReference, \
+                               af_VarSpaceListNode *: gc_delVarListReference))((obj), (env)))
 
 /* GcList 创建与释放 */
 AFUN_CORE_EXPORT af_GcList *makeGcList(enum af_GcListType type, void *data);
@@ -38,4 +39,5 @@ AFUN_CORE_EXPORT void gc_addVarSpaceReference(af_VarSpace *obj, af_Environment *
 AFUN_CORE_EXPORT void gc_delObjectReference(af_Object *obj, af_Environment *base);
 AFUN_CORE_EXPORT void gc_delVarReference(af_Var *obj, af_Environment *base);
 AFUN_CORE_EXPORT void gc_delVarSpaceReference(af_VarSpace *obj, af_Environment *base);
+AFUN_CORE_EXPORT void gc_delVarListReference(af_VarSpaceListNode *vsl, af_Environment *base);
 #endif //AFUN_GC

+ 2 - 1
src/core/__gc.h

@@ -87,7 +87,8 @@ struct gc_Factory {
                                af_ObjectData *: gc_delObjectDataReference, \
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
-                               af_VarSpace *: gc_delVarSpaceReference))((obj), (env)))
+                               af_VarSpace *: gc_delVarSpaceReference, \
+                               af_VarSpaceListNode *: gc_delVarListReference))((obj), (env)))
 
 /* gc_Factory 创建与释放 */
 AFUN_CORE_NO_EXPORT gc_Factory *makegGcFactory(void);

+ 29 - 29
src/core/env.c

@@ -777,7 +777,7 @@ static void mp_NORMAL(af_Message *msg, bool is_top, af_Environment *env) {
     }
     if (is_top)
         writeDebugLog(aFunCoreLogger, "NORMAL Point: %p", *(af_Object **)msg->msg);
-    gc_delReference(*(af_Object **)msg->msg, env);
+//    gc_delReference(*(af_Object **)msg->msg, env);
     *(af_Object **)msg->msg = NULL;
 }
 
@@ -792,7 +792,7 @@ static void mp_NORMALThread(af_Message *msg, bool is_top, af_Environment *env) {
 
     pthread_mutex_lock(&env->thread_lock);
     env->result = *(af_Object **)msg->msg;
-    gc_delReference(env->result, env);
+//    gc_delReference(env->result, env);
     *(af_Object **)msg->msg = NULL;
     pthread_mutex_unlock(&env->thread_lock);
 }
@@ -866,7 +866,6 @@ static af_GuardianList *guardian_GC(char *type, bool is_guard, guardian_GC_data
     if (grt == grt_always || grt == grt_count && getGcCount(env) >= getGcMax(env)) {
         GcCountToZero(env);  // 清零
 
-        writeDebugLog(aFunCoreLogger, "GC Run");
         gl = gc_RunGC(env);
         if (gl != NULL)
             writeDebugLog(aFunCoreLogger, "GC run destruct function");
@@ -889,7 +888,7 @@ static af_GuardianList *guardian_Signal(char *type, bool is_guard, void *data, a
             af_Message *msg;
             if (EQ_STR("NORMAL", env->activity->msg_down->type)) {
                 msg = getFirstMessage(env);
-                gc_delReference(*(af_Object **)msg->msg, env);
+//                gc_delReference(*(af_Object **)msg->msg, env);
                 freeMessage(msg);
             } else if (EQ_STR("ERROR", env->activity->msg_down->type)) {
                 msg = getFirstMessage(env);
@@ -957,13 +956,13 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
     env->activity = makeTopActivity(NULL, NULL, env->protect, env->global, env);
 
     makeVarToProtectVarSpace("global", 3, 3, 3, env->global, env);
-    gc_delReference(env->global, env);
+//    gc_delReference(env->global, env);
 
     af_Object *cycle = makeCycleObject(env);
     makeVarToProtectVarSpace(mg_sys_cycle, 3, 3, 3, cycle, env);
 
-    gc_delReference(env->protect, env);
-    gc_delReference(cycle, env);
+//    gc_delReference(env->protect, env);
+//    gc_delReference(cycle, env);
     return env;
 }
 
@@ -1238,12 +1237,12 @@ static bool isInfixFunc(af_Code *code, af_Environment *env) {
     af_Object *obj = findVarNode(var, NULL, env);
     obj_isInfixFunc *func = findAPI("obj_isInfixFunc", getObjectAPI(obj));
     if (func == NULL) {
-        gc_delReference(obj, env);
+//        gc_delReference(obj, env);
         return false;
     }
 
     bool res = func(getObjectID(obj), obj);
-    gc_delReference(obj, env);
+//    gc_delReference(obj, env);
     return res;
 }
 
@@ -1402,8 +1401,8 @@ bool pushImportActivity(af_Code *bt, af_Object **obj, char *mark, af_Environment
 
     if (obj != NULL)
         *obj = tmp;
-    else
-        gc_delReference(tmp, env);
+//    else
+//        gc_delReference(tmp, env);
 
     return true;
 }
@@ -1519,7 +1518,7 @@ bool setFuncActivityAddVar(af_Environment *env){
         /* 新层的变量空间应该属于belong而不是func */
         env->activity->run_varlist = pushNewVarList(env->activity->belong, env->activity->run_varlist, env);;
         env->activity->count_run_varlist++;
-        gc_delReference(env->activity->run_varlist->vs, env);
+//        gc_delReference(env->activity->run_varlist, env);
     }
     pthread_mutex_unlock(env->activity->gc_lock);
 
@@ -1687,14 +1686,14 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     if (env->activity->type == act_func || env->activity->type == act_top || env->activity->type == act_top_import) {
         if (msg != NULL && env->activity->return_first) {  // msg有内容, 并且设定了返回首位, 则清除msg内容, 并压入首位(压入的代码在下面)
             if (EQ_STR(msg->type, "NORMAL")) {
-                gc_delReference(*(af_Object **) msg->msg, env);
+//                gc_delReference(*(af_Object **) msg->msg, env);
                 freeMessage(msg);
                 msg = NULL;
             }
         } else if (env->activity->return_first) {  // msg无内容, 并且设定了返回首位, 则检查msg_down是否有normal, 有则清除
             if (env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
                 af_Message *tmp = getFirstMessage(env);
-                gc_delReference(*(af_Object **) (tmp->msg), env);
+//                gc_delReference(*(af_Object **) (tmp->msg), env);
                 freeMessage(tmp);
             }
         }
@@ -1703,7 +1702,7 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
             if (env->activity->return_obj == NULL)
                 msg = makeERRORMessage(RUN_ERROR, RETURN_OBJ_NOT_FOUND_INFO, env);
             else {
-                gc_addReference(env->activity->return_obj, env);
+//                gc_addReference(env->activity->return_obj, env);
                 msg = makeNORMALMessage(env->activity->return_obj, env);
                 env->activity->return_obj = NULL;
             }
@@ -1716,7 +1715,7 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
     if (env->activity->type == act_top_import && /* import模式, 并且msg_down中有normal, 则把normal替换为belong */
         env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
         af_Message *tmp = getFirstMessage(env);
-        gc_addReference(env->activity->belong, env);
+//        gc_addReference(env->activity->belong, env);
         pushMessageDown(makeIMPORTMessage(env->activity->import_mark, env->activity->belong, env), env);  // 压入belong作为msg
         pushMessageDown(tmp, env);
     }
@@ -1857,8 +1856,8 @@ af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line,
 void freeErrorInfo(af_ErrorInfo *ei, af_Environment *env){
     free(ei->error_type);
     free(ei->error);
-    if (ei->obj != NULL)
-        gc_delReference(ei->obj, env);
+//    if (ei->obj != NULL)
+//        gc_delReference(ei->obj, env);
     freeAllErrorBacktracking(ei->track);
     free(ei);
 }
@@ -2093,8 +2092,8 @@ af_ImportInfo *makeImportInfo(char *mark, af_Object *obj, af_Environment *env){
 
 void freeImportInfo(af_ImportInfo *ii, af_Environment *env){
     free(ii->mark);
-    if (ii->obj != NULL)
-        gc_delReference(ii->obj, env);
+//    if (ii->obj != NULL)
+//        gc_delReference(ii->obj, env);
     free(ii);
 }
 
@@ -2115,9 +2114,9 @@ static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func, af_Env
 
 static af_GuardianList *freeGuardianList(af_GuardianList *gl, af_Environment *env){
     af_GuardianList *next = gl->next;
-    if (gl->obj != NULL)
-        gc_delReference(gl->obj, env);
-    gc_delReference(gl->func, env);
+//    if (gl->obj != NULL)
+//        gc_delReference(gl->obj, env);
+//    gc_delReference(gl->func, env);
     free(gl);
     return next;
 }
@@ -2206,12 +2205,12 @@ af_Object *getGlobal(af_Environment *env) {
     af_Activity *activity = env->activity;
     for (NULL; activity != NULL; activity = activity->prev) {
         if (activity->type == act_top || activity->type == act_top_import) {
-            gc_addReference(activity->belong, env);
+//            gc_addReference(activity->belong, env);
             return activity->belong;
         }
     }
 
-    gc_addReference(env->global, env);
+//    gc_addReference(env->global, env);
     return env->global;
 }
 
@@ -2341,8 +2340,9 @@ void waitForEnviromentExit(af_Environment *env) {
     if (env->gc_env != NULL)
         setEnviromentExit_out(env->gc_env);
 
-    pthread_mutex_lock(&env->thread_lock);
-    while (env->env_list != NULL)
-        pthread_cond_wait(&env->thread_cond, &env->thread_lock);
-    pthread_mutex_unlock(&env->thread_lock);
+    sleep(2);
+//    pthread_mutex_lock(&env->thread_lock);
+//    while (env->env_list != NULL)
+//        pthread_cond_wait(&env->thread_cond, &env->thread_lock);
+//    pthread_mutex_unlock(&env->thread_lock);
 }

+ 5 - 5
src/core/func.c

@@ -21,8 +21,8 @@ static af_ArgCodeList *freeArgCodeList(af_ArgCodeList *acl, af_Environment *env)
     free(acl->info);
     if (acl->free_code)
         freeAllCode(acl->code);
-    if (acl->result != NULL)
-        gc_delReference(acl->result, env);
+//    if (acl->result != NULL)
+//        gc_delReference(acl->result, env);
     free(acl);
     return next;
 }
@@ -60,8 +60,8 @@ af_ArgList *makeArgList(char *name, af_Object *obj, af_Environment *env){
 static af_ArgList *freeArgList(af_ArgList *al, af_Environment *env){
     af_ArgList *next = al->next;
     free(al->name);
-    if (al->obj != NULL)
-        gc_delReference(al->obj, env);
+//    if (al->obj != NULL)
+//        gc_delReference(al->obj, env);
     free(al);
     return next;
 }
@@ -90,7 +90,7 @@ af_ArgList **pushArgList(af_ArgList **base, af_ArgList *new) {
  */
 af_ArgList *makeArgListFromArgCodeList(char *name, af_ArgCodeList *acl, af_Environment *env) {
     af_Object *obj = getArgCodeListResult(acl);
-    gc_addReference(obj, env);
+//    gc_addReference(obj, env);
 
     af_ArgList *al = makeArgList(name, obj, env);
     return al;

+ 49 - 60
src/core/gc.c

@@ -2,6 +2,7 @@
 #include "__object.h"
 #include "pthread.h"
 
+
 /* gc 操控函数 */
 void gc_addObjectData(af_ObjectData *od, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
@@ -13,14 +14,16 @@ void gc_addObjectData(af_ObjectData *od, af_Environment *base){
     base->gc_factory->gc_ObjectData = od;
     GcCountAdd1(base);
     pthread_mutex_unlock(&base->gc_factory->mutex);
-    writeTrackLog(aFunCoreLogger, "Make ObjectData %p", od);
 }
 
 void gc_delObjectData(af_ObjectData *od, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
-    if ((od)->gc.prev != ((void *) 0)) { (od)->gc.prev->gc.next = (od)->gc.next; }
-    else { base->gc_factory->gc_ObjectData = (od)->gc.next; }
-    if ((od)->gc.next != ((void *) 0)) { (od)->gc.next->gc.prev->gc.prev; }
+    if ((od)->gc.prev != ((void *) 0))
+        (od)->gc.prev->gc.next = (od)->gc.next;
+    else
+        base->gc_factory->gc_ObjectData = (od)->gc.next;
+    if ((od)->gc.next != ((void *) 0))
+        (od)->gc.next->gc.prev = (od)->gc.prev;
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
@@ -50,14 +53,16 @@ void gc_addObject(af_Object *obj, af_Environment *base){
     base->gc_factory->gc_Object = obj;
     GcCountAdd1(base);
     pthread_mutex_unlock(&base->gc_factory->mutex);
-    writeTrackLog(aFunCoreLogger, "Make Object %p", obj);
 }
 
 void gc_delObject(af_Object *obj, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
-    if ((obj)->gc.prev != ((void *) 0)) { (obj)->gc.prev->gc.next = (obj)->gc.next; }
-    else { base->gc_factory->gc_Object = (obj)->gc.next; }
-    if ((obj)->gc.next != ((void *) 0)) { (obj)->gc.next->gc.prev = (obj)->gc.prev; }
+    if ((obj)->gc.prev != ((void *) 0))
+        (obj)->gc.prev->gc.next = (obj)->gc.next;
+    else
+        base->gc_factory->gc_Object = (obj)->gc.next;
+    if ((obj)->gc.next != ((void *) 0))
+        (obj)->gc.next->gc.prev = (obj)->gc.prev;
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
@@ -78,6 +83,7 @@ void gc_delObjectReference(af_Object *obj, af_Environment *base){
 }
 
 void gc_addVar(af_Var *var, af_Environment *base) {
+    pthread_mutex_lock(&base->gc_factory->mutex);
     var->gc.info.reference = 1;
     var->gc.prev = ((void *) 0);
     if (base->gc_factory->gc_Var != ((void *) 0))
@@ -85,14 +91,17 @@ void gc_addVar(af_Var *var, af_Environment *base) {
     var->gc.next = base->gc_factory->gc_Var;
     base->gc_factory->gc_Var = var;
     GcCountAdd1(base);
-    writeTrackLog(aFunCoreLogger, "Make Var %p", var);
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
 void gc_delVar(af_Var *var, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
-    if ((var)->gc.prev != ((void *) 0)) { (var)->gc.prev->gc.next = (var)->gc.next; }
-    else { base->gc_factory->gc_Var = (var)->gc.next; }
-    if ((var)->gc.next != ((void *) 0)) { (var)->gc.next->gc.prev = (var)->gc.prev; }
+    if ((var)->gc.prev != ((void *) 0))
+        (var)->gc.prev->gc.next = (var)->gc.next;
+    else
+        base->gc_factory->gc_Var = (var)->gc.next;
+    if ((var)->gc.next != ((void *) 0))
+        (var)->gc.next->gc.prev = (var)->gc.prev;
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
@@ -109,6 +118,7 @@ void gc_delVarReference(af_Var *var, af_Environment *base) {
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     var->gc.info.reference--;
+    writeTrackLog(aFunCoreLogger, "del VarSpace Reference");
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
@@ -120,20 +130,26 @@ void gc_delVarReference(af_Var *var, af_Environment *base) {
  * @param base
  */
 void gc_addVarSpace(af_VarSpace *vs, af_Environment *base){
+    pthread_mutex_lock(&base->gc_factory->mutex);
     vs->gc.info.reference = 1;
     vs->gc.prev = ((void *) 0);
-    if (base->gc_factory->gc_VarSpace != ((void *) 0)) { base->gc_factory->gc_VarSpace->gc.prev = vs; }
+    if (base->gc_factory->gc_VarSpace != ((void *) 0))
+        base->gc_factory->gc_VarSpace->gc.prev = vs;
     vs->gc.next = base->gc_factory->gc_VarSpace;
     base->gc_factory->gc_VarSpace = vs;
     GcCountAdd1(base);
-    writeTrackLog(aFunCoreLogger, "Make VarSpace %p", vs);
+    pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
 void gc_delVarSpace(af_VarSpace *vs, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
-    if ((vs)->gc.prev != ((void *) 0)) { (vs)->gc.prev->gc.next = (vs)->gc.next; }
-    else { base->gc_factory->gc_VarSpace = (vs)->gc.next; }
-    if ((vs)->gc.next != ((void *) 0)) { (vs)->gc.next->gc.prev = (vs)->gc.prev; }
+    if ((vs)->gc.prev != ((void *) 0))
+        (vs)->gc.prev->gc.next = (vs)->gc.next;
+    else
+        base->gc_factory->gc_VarSpace = (vs)->gc.next;
+
+    if ((vs)->gc.next != ((void *) 0))
+        (vs)->gc.next->gc.prev = (vs)->gc.prev;
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
@@ -153,6 +169,10 @@ void gc_delVarSpaceReference(af_VarSpace *vs, af_Environment *base) {
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 
+void gc_delVarListReference(af_VarSpaceListNode *vsl, af_Environment *base) {
+    gc_delVarSpaceReference(vsl->vs, base);
+}
+
 /* gc_Factory 函数 */
 gc_Factory *makegGcFactory(void) {
     gc_Factory *factory = calloc(1, sizeof(gc_Factory));
@@ -252,8 +272,6 @@ static pgc_Analyzed checkAnalyzed(gc_Analyzed *analyzed, pgc_Analyzed plist);
 static pgc_Analyzed reachableObject(struct af_Object *obj, pgc_Analyzed plist) {
     for (NULL; obj != NULL && !obj->gc.info.reachable; obj = obj->belong) {
         obj->gc.info.reachable = true;
-        writeTrackLog(aFunCoreLogger, "Reachable Object %p -> data %p -> vs %p", obj, obj->data, obj->data->var_space);
-
         pthread_rwlock_rdlock(&obj->lock);
         if (!obj->data->gc.info.reachable)
             plist = reachableObjectData(obj->data, plist);
@@ -263,32 +281,24 @@ static pgc_Analyzed reachableObject(struct af_Object *obj, pgc_Analyzed plist) {
 }
 
 static pgc_Analyzed reachableObjectData(struct af_ObjectData *od, pgc_Analyzed plist) {  // 暂时不考虑API调用
-    writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p wait", od);
     if (od->gc.info.reachable)
         return plist;
 
-    writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p -> vs %p", od, od->var_space);
     od->gc.info.reachable = true;
 
     pthread_rwlock_rdlock(&od->lock);
     plist = reachableVarSpace(od->var_space, plist);
-    if (!od->base->gc.info.reachable) {
+    if (!od->base->gc.info.reachable)
         plist = makeAnalyzed(od->base, plist);
-        writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p add object %p", od, od->base);
-    }
 
     for (af_Inherit *ih = od->inherit; ih != NULL; ih = getInheritNext(ih)) {
         af_Object *obj = getInheritObject(ih);
         af_VarSpace *vs = getInheritVarSpace(ih);
-        if (!obj->gc.info.reachable) {
-            writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p inherit add object %p", od, obj);
+        if (!obj->gc.info.reachable)
             plist = makeAnalyzed(obj, plist);
-        }
 
-        if (!vs->gc.info.reachable) {
-            writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p inherit add varspace %p", od, vs);
+        if (!vs->gc.info.reachable)
             plist = reachableVarSpace(vs, plist);
-        }
     }
 
     obj_getGcList *func = findAPI("obj_getGcList", od->api);
@@ -300,21 +310,16 @@ static pgc_Analyzed reachableObjectData(struct af_ObjectData *od, pgc_Analyzed p
 
             switch (tmp->type) {
                 case glt_obj:
-                    if (!tmp->obj->gc.info.reachable) {
-                        writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p gl add object %p", od, tmp->obj);
+                    if (!tmp->obj->gc.info.reachable)
                         plist = makeAnalyzed(tmp->obj, plist);
-                    }
                     break;
                 case glt_var:
-                    writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p gl add object %p", od, tmp->var);
                     plist = reachableVar(tmp->var, plist);
                     break;
                 case glt_vs:
-                    writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p gl add object %p", od, tmp->vs);
                     plist = reachableVarSpace(tmp->vs, plist);
                     break;
                 case glt_vsl:
-                    writeTrackLog(aFunCoreLogger, "Reachable ObjectData %p gl add object %p", od, tmp->vsl);
                     plist = reachableVarSpaceList(tmp->vsl, plist);
                     break;
                 default:
@@ -329,18 +334,14 @@ static pgc_Analyzed reachableObjectData(struct af_ObjectData *od, pgc_Analyzed p
 }
 
 static pgc_Analyzed reachableVarSpace(struct af_VarSpace *vs, pgc_Analyzed plist) {
-    writeTrackLog(aFunCoreLogger, "Reachable VarSpace %p wait", vs);
     if (vs->gc.info.reachable)
         return plist;
 
-    writeTrackLog(aFunCoreLogger, "Reachable VarSpace %p -> %p", vs, vs->belong);
     vs->gc.info.reachable = true;
 
     pthread_rwlock_rdlock(&vs->lock);
-    if (vs->belong != NULL) {
+    if (vs->belong != NULL)
         plist = makeAnalyzed(vs->belong, plist);
-        writeTrackLog(aFunCoreLogger, "Reachable VarSpace %p add object %p", vs, vs->belong);
-    }
 
     for (int i = 0; i < VAR_HASHTABLE_SIZE; i++) {
         for (af_VarCup *var = vs->var[i]; var != NULL; var = var->next)
@@ -352,19 +353,15 @@ static pgc_Analyzed reachableVarSpace(struct af_VarSpace *vs, pgc_Analyzed plist
 }
 
 static pgc_Analyzed reachableVar(struct af_Var *var, pgc_Analyzed plist) {
-    writeTrackLog(aFunCoreLogger, "Reachable Var %p wait", var);
     if (var->gc.info.reachable)
         return plist;
 
-    writeTrackLog(aFunCoreLogger, "Reachable VarSpace %p -> %p [%s]", var, var->vn->obj, var->name);
     var->gc.info.reachable = true;
 
     pthread_rwlock_rdlock(&var->lock);
     for (af_VarNode *vn = var->vn; vn != NULL; vn = vn->next) {
-        if (!vn->obj->gc.info.reachable) {
+        if (!vn->obj->gc.info.reachable)
             plist = makeAnalyzed(vn->obj, plist);
-            writeTrackLog(aFunCoreLogger, "Reachable Var %p add object %p", var, vn->obj);
-        }
     }
     pthread_rwlock_unlock(&var->lock);
     return plist;
@@ -529,7 +526,7 @@ static pgc_Analyzed checkDestruct(af_Environment *env, paf_GuardianList *pgl, pg
             pthread_rwlock_rdlock(&od->lock);
             af_Object *base = od->base;
             pthread_rwlock_unlock(&od->lock);
-            gc_addReference(base, env);
+//            gc_addReference(base, env);
 
             *pgl = pushGuardianList(base, func, *pgl, env);
             plist = reachableObjectData(od, plist);
@@ -586,7 +583,7 @@ paf_GuardianList checkAllDestruct(af_Environment *env, paf_GuardianList pgl) {
             pthread_rwlock_rdlock(&od->lock);
             af_Object *base_obj = od->base;
             pthread_rwlock_unlock(&od->lock);
-            gc_addReference(base_obj, env);
+//            gc_addReference(base_obj, env);
             pgl = pushGuardianList(base_obj, func, pgl, env);
         }
     }
@@ -616,25 +613,17 @@ void gc_freeAllValue(af_Environment *env) {
     af_Environment *base = env->base;
 
     pthread_mutex_lock(&base->gc_factory->mutex);
-    for (af_ObjectData *od = base->gc_factory->gc_ObjectData, *next; od != NULL; od = next) {
-        next = od->gc.next;
+    for (af_ObjectData *od = base->gc_factory->gc_ObjectData, *next; od != NULL; od = base->gc_factory->gc_ObjectData)
         freeObjectData(od, env);
-    }
 
-    for (af_Object *obj = base->gc_factory->gc_Object, *next; obj != NULL; obj = next) {
-        next = obj->gc.next;
+    for (af_Object *obj = base->gc_factory->gc_Object, *next; obj != NULL; obj = base->gc_factory->gc_Object)
         freeObject(obj, env);
-    }
 
-    for (af_VarSpace *vs = base->gc_factory->gc_VarSpace, *next; vs != NULL; vs = next) {
-        next = vs->gc.next;
+    for (af_VarSpace *vs = base->gc_factory->gc_VarSpace, *next; vs != NULL; vs = base->gc_factory->gc_VarSpace)
         freeVarSpace(vs, env);
-    }
 
-    for (af_Var *var = base->gc_factory->gc_Var, *next; var != NULL; var = next) {
-        next = var->gc.next;
+    for (af_Var *var = base->gc_factory->gc_Var, *next; var != NULL; var = base->gc_factory->gc_Var)
         freeVar(var, env);
-    }
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 

+ 1 - 1
src/core/global_obj.c

@@ -10,7 +10,7 @@ static char *global_id = "global-object";
 
 static void initGOD(af_Object *obj, GlobalObjectData *data, af_Environment *env) {
     data->share = makeVarSpace(obj, 3, 2, 0, env);
-    gc_delReference(data->share, env);
+//    gc_delReference(data->share, env);
 }
 
 static void freeGOD(GlobalObjectData *god, af_Object  *obj, af_Environment *env) {

+ 34 - 48
src/core/object.c

@@ -4,10 +4,6 @@
 #include "tool.h"
 #include "core_init.h"
 
-/* ObjectData 创建与释放 */
-static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *base_obj,
-                                          af_Environment *env);
-static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Environment *env);
 
 /* ObjectData API 创建与释放 */
 static af_ObjectAPINode *makeObjectAPINode(DLC_SYMBOL(objectAPIFunc) func, char *api_name);
@@ -18,48 +14,6 @@ static void freeAllObjectAPINode(af_ObjectAPINode *apin);
 static af_ObjectAPINode *findObjectDataAPINode(char *api_name, af_ObjectData *od);
 static int addAPIToObjectData(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_ObjectData *od);
 
-/*
- * 函数名: makeObjectData_Pri
- * 目标: 创建ObjectData
- * 注意: af_ObjectData不是对外开放的结构体
- * 注意: api不能为NULL
- */
-static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *base_obj,
-                                          af_Environment *env){
-    af_ObjectData *od = calloc(1, sizeof(af_ObjectData));
-    od->base = base_obj;
-    base_obj->data = od;
-    od->id = strCopy(id == NULL ? "Unknown" : id);
-
-    od->api = api;
-    od->free_api = free_api;
-
-    od->allow_inherit = allow_inherit;
-    od->var_space = makeVarSpace(base_obj, 3, 2, 0, env);
-    od->inherit = NULL;
-
-    obj_getDataSize *func = findAPI("obj_getDataSize", api);
-    if (func != NULL)
-        od->size = func(id, base_obj);
-    else
-        od->size = 0;
-
-    if (od->size != 0)
-        od->data = calloc(1, od->size);
-
-    pthread_rwlock_init(&od->lock, NULL);
-    gc_addObjectData(od, env->base);
-    return od;
-}
-
-static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Environment *env){
-    af_Object *obj = calloc(1, sizeof(af_Object));
-    obj->belong = NULL;
-    makeObjectData_Pri(id, free_api, api, allow_inherit, obj, env);
-    pthread_rwlock_init(&obj->lock, NULL);
-    gc_addObject(obj, env->base);
-    return obj;
-}
 
 /*
  * 函数名: 创建一个object
@@ -95,18 +49,48 @@ af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inh
             writeFatalErrorLog(aFunCoreLogger, 1, "Make object belong null");
     }
 
-    af_Object *obj = makeObject_Pri(id, free_api, api, allow_inherit, env);
+    af_Object *obj = calloc(1, sizeof(af_Object));
+    af_ObjectData *od = calloc(1, sizeof(af_ObjectData));
+
+    obj->belong = NULL;
+    od->base = obj;
+    obj->data = od;
+    od->id = strCopy(id == NULL ? "Unknown" : id);
+
+    od->api = api;
+    od->free_api = free_api;
+
+    od->allow_inherit = allow_inherit;
+    od->inherit = NULL;
+
+    obj_getDataSize *func = findAPI("obj_getDataSize", api);
+    if (func != NULL)
+        od->size = func(id, obj);
+    else
+        od->size = 0;
+
+    if (od->size != 0)
+        od->data = calloc(1, od->size);
+
+    pthread_rwlock_init(&od->lock, NULL);
+    pthread_rwlock_init(&obj->lock, NULL);
 
     obj->belong = belong;
     obj->data->inherit = ih;
     obj->data->free_inherit = free_inherit;
 
-    if (obj->data->size != 0) {
+    od->var_space = makeVarSpace(obj, 3, 2, 0, env);
+    gc_addObjectData(od, env->base);
+    gc_addObject(obj, env->base);
+
+    if (obj->data->size != 0) {  // 要在 add_object 之后再运行 init
         obj_initData *init = findAPI("obj_initData", obj->data->api);
         if (init != NULL)
             init(id, obj, obj->data->data, env);
     }
 
+//    gc_delReference(od->var_space, env);
+//    gc_delReference(od, env);
     return obj;
 }
 
@@ -135,6 +119,8 @@ void freeObjectDataData(af_ObjectData *od, af_Environment *env) {
  * 对外API中, 创建对象的基本单位都是af_Object, 无法直接操控af_ObjectData
  */
 void freeObjectData(af_ObjectData *od, af_Environment *env) {
+    printf("od-free %p\n", od);
+
     if (od->size != 0) {
         obj_destructData *func = findAPI("obj_destructData", od->api);
         if (func != NULL)

+ 8 - 8
src/core/run.c

@@ -50,7 +50,7 @@ static bool checkLiteral(af_Message **msg, af_Environment *env) {
     af_Object *obj = *(af_Object **)((*msg)->msg);
     obj_literalSetting *func = findAPI("obj_literalSetting", getObjectAPI(obj));
     if (func == NULL) {
-        gc_delReference(obj, env);
+//        gc_delReference(obj, env);
         freeMessage(*msg);
         *msg = makeERRORMessage(TYPE_ERROR, API_NOT_FOUND_INFO(obj_literalSetting), env);
         return false;
@@ -82,7 +82,7 @@ static int checkMacro(af_Message *msg, af_Environment *env) {
 
     af_Object *obj = *(af_Object **)(msg->msg);
     bool re = pushMacroFuncActivity(obj, env);
-    gc_delReference(obj, env);
+//    gc_delReference(obj, env);
     freeMessage(msg);
     if (re)
         return 1;
@@ -177,7 +177,7 @@ static bool codeElement(af_Code *code, af_Environment *env) {
         af_Object *obj = findVarNode(var, NULL, env);
         writeTrackLog(aFunCoreLogger, "Get literal %s : %p", code->element.data, obj);
         bool res = pushLiteralActivity(code, code->element.data, obj, env);
-        gc_delReference(obj, env);
+//        gc_delReference(obj, env);
         return res;
     }
 
@@ -198,13 +198,13 @@ static bool codeElement(af_Code *code, af_Environment *env) {
         char *id = getObjectID(obj);
         if ((is_obj = findAPI("obj_isObjFunc", api)) != NULL && is_obj(id, obj)) {
             bool res = pushVariableActivity(code, obj, env);  // 对象函数
-            gc_delReference(obj, env);
+//            gc_delReference(obj, env);
             return res;
         } else if (env->activity->status != act_func_get && // 在act_func_get 模式下不检查是否为is_infix函数 因为本来就要将其作为函数调用
                  (is_infix = findAPI("obj_isInfixFunc", api)) != NULL && is_infix(id, obj)) {
             pushMessageDown(makeERRORMessageFormat(INFIX_PROTECT, env,
                                                    "Infix protect variable: %s.", code->element.data), env);
-            gc_delReference(obj, env);
+//            gc_delReference(obj, env);
             return false;
         }
     }
@@ -313,7 +313,7 @@ bool checkNormalEnd(af_Message *msg, af_Environment *env) {
             pushMessageDown(msg, env);
             return true;
         } else if (msg != NULL) {
-            gc_delReference(*(af_Object **) (msg->msg), env);  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
+//            gc_delReference(*(af_Object **) (msg->msg), env);  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
             freeMessage(msg);
         }
     } else if (msg != NULL) {
@@ -323,7 +323,7 @@ bool checkNormalEnd(af_Message *msg, af_Environment *env) {
             env->activity->parentheses_call = *(af_Object **) (msg->msg);  // 类前缀调用
             pthread_mutex_unlock(env->activity->gc_lock);
         }
-        gc_delReference(*(af_Object **)(msg->msg), env);  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
+//        gc_delReference(*(af_Object **)(msg->msg), env);  // msg->msg是一个指针, 这个指针的内容是一个af_Object *
         freeMessage(msg);
     }
     return false;
@@ -491,7 +491,7 @@ bool iterCode(af_Code *code, int mode, af_Environment *env){
                 af_Object *func = *(af_Object **) (msg->msg);  // func仍保留了msg的gc计数
                 if (!setFuncActivityToArg(func, env))
                     popActivity(false, NULL, env);
-                gc_delReference(func, env);  // 释放计数 (setFuncActivityToArg 不需要计数)
+//                gc_delReference(func, env);  // 释放计数 (setFuncActivityToArg 不需要计数)
                 freeMessage(msg);
                 break;
             }

+ 2 - 2
src/core/thread.c

@@ -26,14 +26,14 @@ af_Environment *startRunThread(af_Environment *env, af_VarSpace *vs, af_Code *co
     if (vs == NULL) {
         af_Object *obj = getGlobal(env);
         vs = makeVarSpace(obj, 3, 3, 3, env);
-        gc_delReference(obj, env);
+//        gc_delReference(obj, env);
     }
 
     af_VarSpaceListNode *vsl = makeVarSpaceList(vs);
     vsl->next = new->activity->run_varlist;
     new->activity->run_varlist = vsl;
     new->activity->count_run_varlist++;
-    gc_delReference(vs, base);
+//    gc_delReference(vs, base);
 
     if (enable)  // 如果未Enable, 则暂时不启动线程
         startRunThread_(new, code, free_code);

+ 6 - 6
src/core/var.c

@@ -110,7 +110,7 @@ af_Object *findVarNode(af_Var *var, char *id, af_Environment *env){
     af_Object *obj = NULL;
     if (vn != NULL) {
         obj = vn->obj;
-        gc_addReference(obj, env);
+//        gc_addReference(obj, env);
     }
     pthread_rwlock_unlock(&var->lock);
     return obj;
@@ -262,7 +262,7 @@ bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs, af_Envir
     *pCup = makeVarCup(var);
     pthread_rwlock_unlock(&vs->lock);
     pthread_rwlock_unlock(&var->lock);
-    gc_delReference(var, env);
+//    gc_delReference(var, env);
     return true;
 
 RETURN_FALSE:
@@ -283,7 +283,7 @@ bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_externa
     af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
     if (addVarToVarSpace(var, visitor, vs, env))
         return true;
-    gc_delReference(var, env);
+//    gc_delReference(var, env);
     return false;
 }
 
@@ -312,7 +312,7 @@ bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_ext
     af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
     if (addVarToVarSpaceList(var, visitor, vsl, env))
         return true;
-    gc_delReference(var, env);
+//    gc_delReference(var, env);
     return false;
 }
 
@@ -331,8 +331,8 @@ bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_
     af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
     bool re = addVarToVarSpace(var, env->activity->belong,
                                env->protect, env);
-    if (!re)
-        gc_delReference(var, env);
+//    if (!re)
+//        gc_delReference(var, env);
 
     pthread_rwlock_wrlock(&env->protect->lock);
     env->protect->is_protect = is_protect;

+ 1 - 1
src/runtime/base/str_obj.c

@@ -48,8 +48,8 @@ static void strFuncInit(char *id, af_Object *obj, ObjectStrFunc *data, af_Enviro
         return;
     data->func_var_list = copyVarSpaceList(getRunVarSpaceList(env));
     data->share_vs = makeVarSpace(obj, 3, 2, 0, env);
-    gc_delReference(data->share_vs, env);
     data->api = makeAPIFromList(api_list);
+//    gc_delReference(data->share_vs, env);
 }
 
 static bool strFuncArgCodeList(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, void **mark, af_Environment *env) {

+ 2 - 2
src/runtime/runtime.c

@@ -83,8 +83,8 @@ void makeObjectFromList(const ObjectDefineList obj_def[], af_Object *visitor, af
 
         if (od->save != NULL)
             *(od->save) = obj;
-        else
-            gc_delReference(obj, env);
+//        else
+//            gc_delReference(obj, env);
     }
 }
 

+ 1 - 1
src/tool/log.c

@@ -266,7 +266,7 @@ static void writeLogToFactory_(LogLevel level, char *id, pid_t tid, char *ti, ti
  * @param info 日志内容
  */
 static void writeLogToConsole_(LogLevel level, char *id, pid_t tid, char *ti, time_t t, char *file, int line, char *func, char *info) {
-#define FORMAT_SHORT "\r* %s[%d] %d (%s:%d) : %s \n"  // 显示到终端, 添加\r回车符确保顶行显示
+#define FORMAT_SHORT "\r* %s[%d] %ld (%s:%d) : %s \n"  // 显示到终端, 添加\r回车符确保顶行显示
 #define STD_BUF_SIZE (STR_LEN(info) + 1024)
     if (level < log_warning) {
         printf_stdout(STD_BUF_SIZE, FORMAT_SHORT, LogLevelNameLong[level], tid, t, file, line, info);

Різницю між файлами не показано, бо вона завелика
+ 573 - 573
test/src/run_code.c


Деякі файли не було показано, через те що забагато файлів було змінено