Sfoglia il codice sorgente

refactor: 调整gc机制

创建新对象、访问变量自动添加gc引用
仅当对象不再是临时变量时才释放gc引用
SongZihuan 3 anni fa
parent
commit
5d8484db57

+ 0 - 5
include/core/env.h

@@ -124,11 +124,6 @@ AFUN_CORE_EXPORT af_Object *getActivityFunc(af_Environment *env);
 AFUN_CORE_EXPORT bool isEnviromentExit(af_Environment *env);
 AFUN_CORE_EXPORT bool isEnviromentExit(af_Environment *env);
 AFUN_CORE_EXPORT size_t getEnviromentSonCount(af_Environment *env);
 AFUN_CORE_EXPORT size_t getEnviromentSonCount(af_Environment *env);
 
 
-/* 消息 属性访问 */
-AFUN_CORE_EXPORT af_Object *getMsgNormalData(af_Message *msg, af_Environment *env);
-AFUN_CORE_EXPORT af_ErrorInfo *getMsgErrorInfo(af_Message *msg);
-AFUN_CORE_EXPORT af_ImportInfo *getMsgImportInfo(af_Message *msg);
-
 /* ErrorInfo 属性访问 */
 /* ErrorInfo 属性访问 */
 AFUN_CORE_EXPORT char *getErrorType(af_ErrorInfo *ei);
 AFUN_CORE_EXPORT char *getErrorType(af_ErrorInfo *ei);
 AFUN_CORE_EXPORT char *getError(af_ErrorInfo *ei);
 AFUN_CORE_EXPORT char *getError(af_ErrorInfo *ei);

+ 1 - 0
include/core/func.h

@@ -48,6 +48,7 @@ AFUN_CORE_EXPORT void freeAllArgCodeList(af_ArgCodeList *acl, af_Environment *en
 /* af_ArgList 创建与释放 */
 /* af_ArgList 创建与释放 */
 AFUN_CORE_EXPORT af_ArgList *makeArgList(char *name, af_Object *obj, af_Environment *env);
 AFUN_CORE_EXPORT af_ArgList *makeArgList(char *name, af_Object *obj, af_Environment *env);
 AFUN_CORE_EXPORT void freeAllArgList(af_ArgList *al, af_Environment *env);
 AFUN_CORE_EXPORT void freeAllArgList(af_ArgList *al, af_Environment *env);
+AFUN_CORE_EXPORT af_ArgList *makeArgListFromArgCodeList(char *name, af_ArgCodeList *acl, af_Environment *env);
 
 
 /* FuncBody 创建与释放 */
 /* FuncBody 创建与释放 */
 AFUN_CORE_EXPORT af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code, char **msg_type);
 AFUN_CORE_EXPORT af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code, char **msg_type);

+ 1 - 1
include/core/object.h

@@ -43,7 +43,7 @@ AFUN_CORE_EXPORT af_Inherit **pushInherit(af_Inherit **base, af_Inherit *new);
 /* 对象 属性访问 */
 /* 对象 属性访问 */
 AFUN_CORE_EXPORT void *getObjectData(af_Object *obj);
 AFUN_CORE_EXPORT void *getObjectData(af_Object *obj);
 AFUN_CORE_EXPORT af_Object *getBelongObject(af_Object *object);
 AFUN_CORE_EXPORT af_Object *getBelongObject(af_Object *object);
-AFUN_CORE_EXPORT af_Object *findObjectAttributes(char *name, af_Object *visitor, af_Object *obj);
+AFUN_CORE_EXPORT af_Object *findObjectAttributes(char *name, af_Object *visitor, af_Object *obj, af_Environment *env);
 AFUN_CORE_EXPORT char *getObjectID(af_Object *obj);
 AFUN_CORE_EXPORT char *getObjectID(af_Object *obj);
 AFUN_CORE_EXPORT af_ObjectAPI *getObjectAPI(af_Object *obj);
 AFUN_CORE_EXPORT af_ObjectAPI *getObjectAPI(af_Object *obj);
 AFUN_CORE_EXPORT af_Inherit *getObjectInherit(af_Object *obj);
 AFUN_CORE_EXPORT af_Inherit *getObjectInherit(af_Object *obj);

+ 4 - 3
include/core/var.h

@@ -25,7 +25,7 @@ AFUN_CORE_EXPORT bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *v
 AFUN_CORE_EXPORT void addVarNode(af_Var *var, af_Object *obj, char *id);
 AFUN_CORE_EXPORT void addVarNode(af_Var *var, af_Object *obj, char *id);
 
 
 /* 变量空间 相关操作 */
 /* 变量空间 相关操作 */
-AFUN_CORE_EXPORT bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs);
+AFUN_CORE_EXPORT bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs, af_Environment *env);
 AFUN_CORE_EXPORT bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
 AFUN_CORE_EXPORT bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
                                         af_Object *visitor, af_Environment *env);
                                         af_Object *visitor, af_Environment *env);
 AFUN_CORE_EXPORT bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
 AFUN_CORE_EXPORT bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
@@ -35,7 +35,8 @@ AFUN_CORE_EXPORT void setVarSpacePermissions(af_Object *visitor, af_VarSpace *vs
 AFUN_CORE_EXPORT bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, bool protect);
 AFUN_CORE_EXPORT bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, bool protect);
 
 
 /* 变量空间链 相关操作 */
 /* 变量空间链 相关操作 */
-AFUN_CORE_EXPORT bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl);
+AFUN_CORE_EXPORT bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl,
+                                           af_Environment *env);
 AFUN_CORE_EXPORT bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
 AFUN_CORE_EXPORT bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
                                             af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env);
                                             af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env);
 AFUN_CORE_EXPORT bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
 AFUN_CORE_EXPORT bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
@@ -46,7 +47,7 @@ AFUN_CORE_EXPORT bool setVarToVarList(char *name, af_Object *obj, af_Object *vis
 AFUN_CORE_EXPORT af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env);
 AFUN_CORE_EXPORT af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env);
 
 
 /* 变量 属性访问 */
 /* 变量 属性访问 */
-AFUN_CORE_EXPORT af_Object *findVarNode(af_Var *var, char *id);
+AFUN_CORE_EXPORT af_Object *findVarNode(af_Var *var, char *id, af_Environment *env);
 
 
 /* 变量空间 属性访问 */
 /* 变量空间 属性访问 */
 AFUN_CORE_EXPORT af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
 AFUN_CORE_EXPORT af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);

+ 1 - 1
src/core/__env.h

@@ -276,7 +276,7 @@ struct af_ErrorInfo {
     char *error_type;
     char *error_type;
     char *error;
     char *error;
     struct af_ErrorBacktracking *track;
     struct af_ErrorBacktracking *track;
-    af_Object *obj;
+    af_Object *obj;  // 代表错误的obj对象
 };
 };
 
 
 struct af_ImportInfo {
 struct af_ImportInfo {

+ 4 - 6
src/core/__gc.h

@@ -82,21 +82,19 @@ struct gc_Factory {
 };
 };
 
 
 /* 重新定义包括af_ObjectData的 gc Reference 函数 */
 /* 重新定义包括af_ObjectData的 gc Reference 函数 */
-#ifdef core_shared_t_EXPORTS
 #undef gc_addReference
 #undef gc_addReference
 #undef gc_delReference
 #undef gc_delReference
-#define gc_addReference(obj) ((_Generic((obj), \
+#define gc_addReference(obj, env) ((_Generic((obj), \
                                af_ObjectData *: gc_addObjectDataReference, \
                                af_ObjectData *: gc_addObjectDataReference, \
                                af_Object *: gc_addObjectReference, \
                                af_Object *: gc_addObjectReference, \
                                af_Var *: gc_addVarReference, \
                                af_Var *: gc_addVarReference, \
-                               af_VarSpace *: gc_addVarSpaceReference))(obj))
+                               af_VarSpace *: gc_addVarSpaceReference))((obj), (env)))
 
 
-#define gc_delReference(obj) ((_Generic((obj), \
+#define gc_delReference(obj, env) ((_Generic((obj), \
                                af_ObjectData *: gc_delObjectDataReference, \
                                af_ObjectData *: gc_delObjectDataReference, \
                                af_Object *: gc_delObjectReference, \
                                af_Object *: gc_delObjectReference, \
                                af_Var *: gc_delVarReference, \
                                af_Var *: gc_delVarReference, \
-                               af_VarSpace *: gc_delVarSpaceReference))(obj))
-#endif
+                               af_VarSpace *: gc_delVarSpaceReference))((obj), (env)))
 
 
 /* gc_Factory 创建与释放 */
 /* gc_Factory 创建与释放 */
 AFUN_CORE_NO_EXPORT gc_Factory *makegGcFactory(void);
 AFUN_CORE_NO_EXPORT gc_Factory *makegGcFactory(void);

+ 2 - 1
src/core/__object.h

@@ -73,7 +73,8 @@ struct af_Inherit {
 AFUN_CORE_NO_EXPORT void freeObject(af_Object *obj, af_Environment *env);
 AFUN_CORE_NO_EXPORT void freeObject(af_Object *obj, af_Environment *env);
 
 
 /* ObjectData 属性访问 */
 /* ObjectData 属性访问 */
-AFUN_CORE_NO_EXPORT af_Object *findObjectAttributesByObjectData(char *name, af_Object *visitor, af_ObjectData *od);
+AFUN_CORE_NO_EXPORT af_Object *findObjectAttributesByObjectData(char *name, af_Object *visitor, af_ObjectData *od,
+                                                                af_Environment *env);
 
 
 /* ObjectData 释放函数 */
 /* ObjectData 释放函数 */
 AFUN_CORE_NO_EXPORT void freeObjectDataData(af_ObjectData *od, af_Environment *env);
 AFUN_CORE_NO_EXPORT void freeObjectDataData(af_ObjectData *od, af_Environment *env);

+ 78 - 56
src/core/env.c

@@ -146,7 +146,7 @@ af_VarSpace *getProtectVarSpace(af_Environment *env) {
 af_Object *getBaseObject(char *name, af_Environment *env) {
 af_Object *getBaseObject(char *name, af_Environment *env) {
     af_Var *var = findVarFromVarSpace(name, NULL, env->protect);
     af_Var *var = findVarFromVarSpace(name, NULL, env->protect);
     if (var != NULL)
     if (var != NULL)
-        return findVarNode(var, NULL);
+        return findVarNode(var, NULL, env);
     return NULL;
     return NULL;
 }
 }
 
 
@@ -581,10 +581,16 @@ void connectMessage(af_Message **base, af_Message *msg) {
     *base = msg;
     *base = msg;
 }
 }
 
 
+/**
+ * 生成类型为NORMAL的Message
+ * 注意: obj 必须提前添加 gc_addReference
+ * @param obj
+ * @param env
+ * @return
+ */
 af_Message *makeNORMALMessage(af_Object *obj, af_Environment *env){
 af_Message *makeNORMALMessage(af_Object *obj, af_Environment *env){
     af_Message *msg = makeMessage("NORMAL", sizeof(af_Object *));
     af_Message *msg = makeMessage("NORMAL", sizeof(af_Object *));
     *(af_Object **)msg->msg = obj;
     *(af_Object **)msg->msg = obj;
-    gc_addReference(obj, env);
     return msg;
     return msg;
 }
 }
 
 
@@ -621,6 +627,14 @@ af_Message *makeERRORMessageFormat(char *type, af_Environment *env, const char *
     return makeERRORMessage(type, buf, env);;
     return makeERRORMessage(type, buf, env);;
 }
 }
 
 
+/**
+ * 生成类型为IMPORT的Message
+ * 注意: obj 必须提前添加 gc_addReference
+ * @param mark
+ * @param obj
+ * @param env
+ * @return
+ */
 af_Message *makeIMPORTMessage(char *mark, af_Object *obj, af_Environment *env){
 af_Message *makeIMPORTMessage(char *mark, af_Object *obj, af_Environment *env){
     af_Message *msg = makeMessage("IMPORT", sizeof(af_ImportInfo *));
     af_Message *msg = makeMessage("IMPORT", sizeof(af_ImportInfo *));
     *(af_ImportInfo **)msg->msg = makeImportInfo(mark, obj, env);
     *(af_ImportInfo **)msg->msg = makeImportInfo(mark, obj, env);
@@ -748,9 +762,10 @@ static void mp_NORMAL(af_Message *msg, bool is_top, af_Environment *env) {
         writeErrorLog(aFunCoreLogger, "NORMAL msg: %p error", msg->msg);
         writeErrorLog(aFunCoreLogger, "NORMAL msg: %p error", msg->msg);
         return;
         return;
     }
     }
-    gc_delReference(*(af_Object **)msg->msg, env);
     if (is_top)
     if (is_top)
         writeDebugLog(aFunCoreLogger, "NORMAL Point: %p", *(af_Object **)msg->msg);
         writeDebugLog(aFunCoreLogger, "NORMAL Point: %p", *(af_Object **)msg->msg);
+    gc_delReference(*(af_Object **)msg->msg, env);
+    *(af_Object **)msg->msg = NULL;
 }
 }
 
 
 static void mp_NORMALThread(af_Message *msg, bool is_top, af_Environment *env) {
 static void mp_NORMALThread(af_Message *msg, bool is_top, af_Environment *env) {
@@ -759,13 +774,14 @@ static void mp_NORMALThread(af_Message *msg, bool is_top, af_Environment *env) {
         return;
         return;
     }
     }
 
 
+    if (is_top)
+        writeDebugLog(aFunCoreLogger, "Thread-NORMAL Point: %p", *(af_Object **)msg->msg);
+
     pthread_mutex_lock(&env->thread_lock);
     pthread_mutex_lock(&env->thread_lock);
     env->result = *(af_Object **)msg->msg;
     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);
     pthread_mutex_unlock(&env->thread_lock);
-
-    if (is_top)
-        writeDebugLog(aFunCoreLogger, "Thread-NORMAL Point: %p", *(af_Object **)msg->msg);
 }
 }
 
 
 static void mp_ERROR(af_Message *msg, bool is_top, af_Environment *env) {
 static void mp_ERROR(af_Message *msg, bool is_top, af_Environment *env) {
@@ -833,7 +849,7 @@ static af_GuardianList *guardian_GC(char *type, bool is_guard, void *data, af_En
         GcCountToZero(env);  // 清零
         GcCountToZero(env);  // 清零
         gl = gc_RunGC(env);
         gl = gc_RunGC(env);
         if (gl != NULL)
         if (gl != NULL)
-            writeDebugLog(aFunCoreLogger, "GC destruct");
+            writeDebugLog(aFunCoreLogger, "GC run destruct function");
     }
     }
     return gl;
     return gl;
 }
 }
@@ -900,10 +916,10 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
 
 
     /* 创建保护空间 */
     /* 创建保护空间 */
     env->protect = makeVarSpace(NULL, 3, 3, 3, env);
     env->protect = makeVarSpace(NULL, 3, 3, 3, env);
+    gc_delReference(env->protect, env);
 
 
     /* 生成global对象 */
     /* 生成global对象 */
     env->global = makeGlobalObject(env);
     env->global = makeGlobalObject(env);
-    addVarToProtectVarSpace(makeVar("global", 3, 3, 3, env->global, env), env);
 
 
     /* 设置NORMAL顶级处理器 */
     /* 设置NORMAL顶级处理器 */
     DLC_SYMBOL(TopMsgProcessFunc) func1 = MAKE_SYMBOL(mp_NORMAL, TopMsgProcessFunc);
     DLC_SYMBOL(TopMsgProcessFunc) func1 = MAKE_SYMBOL(mp_NORMAL, TopMsgProcessFunc);
@@ -929,6 +945,8 @@ af_Environment *makeEnvironment(enum GcRunTime grt) {
 
 
     env->status = core_init;
     env->status = core_init;
     env->activity = makeTopActivity(NULL, NULL, env->protect, env->global);
     env->activity = makeTopActivity(NULL, NULL, env->protect, env->global);
+    makeVarToProtectVarSpace("global", 3, 3, 3, env->global, env);
+    gc_delReference(env->global, env);
     return env;
     return env;
 }
 }
 
 
@@ -1149,7 +1167,7 @@ bool popGuardian(char *type, af_Environment *env) {
 static void newFuncActivity(af_Code *bt, const af_Code *next, bool return_first, af_Environment *env){
 static void newFuncActivity(af_Code *bt, const af_Code *next, bool return_first, af_Environment *env){
     if (next == NULL && env->activity->body_next == NULL &&
     if (next == NULL && env->activity->body_next == NULL &&
         env->activity->type == act_func && env->activity->macro_varlist == NULL) {
         env->activity->type == act_func && env->activity->macro_varlist == NULL) {
-        writeTrackLog(aFunCoreLogger, "Tail call optimization");
+        writeDebugLog(aFunCoreLogger, "Tail call optimization");
         tailCallActivity(getActivityFunc(env), env->activity);
         tailCallActivity(getActivityFunc(env), env->activity);
         setActivityBtTop(bt, env->activity);
         setActivityBtTop(bt, env->activity);
         env->activity->optimization = true;
         env->activity->optimization = true;
@@ -1174,22 +1192,27 @@ static bool isInfixFunc(af_Code *code, af_Environment *env) {
     if (checkLiteralCode(code->element.data, NULL, NULL, env))  // 检查是否字面量
     if (checkLiteralCode(code->element.data, NULL, NULL, env))  // 检查是否字面量
         return false;
         return false;
 
 
-    printf("isInfixFunc: %s\n", code->element.data);
+    writeDebugLog(aFunCoreLogger, "isInfixFunc: %s\n", code->element.data);
     af_Var *var = findVarFromVarList(code->element.data, env->activity->belong, env->activity->run_varlist);
     af_Var *var = findVarFromVarList(code->element.data, env->activity->belong, env->activity->run_varlist);
     if (var == NULL)
     if (var == NULL)
         return false;
         return false;
 
 
-    af_Object *obj = findVarNode(var, NULL);
+    af_Object *obj = findVarNode(var, NULL, env);
     obj_isInfixFunc *func = findAPI("obj_isInfixFunc", getObjectAPI(obj));
     obj_isInfixFunc *func = findAPI("obj_isInfixFunc", getObjectAPI(obj));
-    if (func == NULL)
+    if (func == NULL) {
+        gc_delReference(obj, env);
         return false;
         return false;
-    return func(getObjectID(obj), obj);
+    }
+
+    bool res = func(getObjectID(obj), obj);
+    gc_delReference(obj, env);
+    return res;
 }
 }
 
 
 bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env) {
 bool pushExecutionActivity(af_Code *bt, bool return_first, af_Environment *env) {
     af_Code *next;
     af_Code *next;
     next = getCodeNext(bt);
     next = getCodeNext(bt);
-    writeTrackLog(aFunCoreLogger, "Run execution");
+    writeDebugLog(aFunCoreLogger, "Run execution");
 
 
     if (bt->type != code_block || bt->block.is_empty) {
     if (bt->type != code_block || bt->block.is_empty) {
         pushMessageDown(makeERRORMessage(SYNTAX_ERROR, NOT_CODE_INFO, env), env);
         pushMessageDown(makeERRORMessage(SYNTAX_ERROR, NOT_CODE_INFO, env), env);
@@ -1215,7 +1238,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
     env->activity->parentheses_call = NULL;
     env->activity->parentheses_call = NULL;
     pthread_rwlock_unlock(&env->activity->gc_lock);
     pthread_rwlock_unlock(&env->activity->gc_lock);
 
 
-    writeTrackLog(aFunCoreLogger, "Run func");
+    writeDebugLog(aFunCoreLogger, "Run func");
     next = getCodeNext(bt);
     next = getCodeNext(bt);
     switch (bt->block.type) {
     switch (bt->block.type) {
         case curly:
         case curly:
@@ -1265,7 +1288,7 @@ bool pushFuncActivity(af_Code *bt, af_Environment *env) {
 bool pushLiteralActivity(af_Code *bt, char *data, af_Object *func, af_Environment *env) {
 bool pushLiteralActivity(af_Code *bt, char *data, af_Object *func, af_Environment *env) {
     setActivityBtNext(bt->next, env->activity);
     setActivityBtNext(bt->next, env->activity);
 
 
-    writeTrackLog(aFunCoreLogger, "Run literal");
+    writeDebugLog(aFunCoreLogger, "Run literal");
     newFuncActivity(bt, bt->next, false, env);
     newFuncActivity(bt, bt->next, false, env);
     env->activity->is_literal = true;
     env->activity->is_literal = true;
     pushLiteralData(strCopy(data), env);  // FuncBody的释放导致code和literal_data释放, 所以要复制
     pushLiteralData(strCopy(data), env);  // FuncBody的释放导致code和literal_data释放, 所以要复制
@@ -1275,7 +1298,7 @@ bool pushLiteralActivity(af_Code *bt, char *data, af_Object *func, af_Environmen
 bool pushVariableActivity(af_Code *bt, af_Object *func, af_Environment *env) {
 bool pushVariableActivity(af_Code *bt, af_Object *func, af_Environment *env) {
     setActivityBtNext(bt->next, env->activity);
     setActivityBtNext(bt->next, env->activity);
 
 
-    writeTrackLog(aFunCoreLogger, "Run variable");
+    writeDebugLog(aFunCoreLogger, "Run variable");
     newFuncActivity(bt, bt->next, false, env);
     newFuncActivity(bt, bt->next, false, env);
     env->activity->is_obj_func = true;
     env->activity->is_obj_func = true;
     return setFuncActivityToArg(func, env);
     return setFuncActivityToArg(func, env);
@@ -1293,7 +1316,7 @@ bool pushMacroFuncActivity(af_Object *func, af_Environment *env) {
     env->activity->run_varlist = NULL;
     env->activity->run_varlist = NULL;
     pthread_rwlock_unlock(&env->activity->gc_lock);
     pthread_rwlock_unlock(&env->activity->gc_lock);
 
 
-    writeTrackLog(aFunCoreLogger, "Run macro");
+    writeDebugLog(aFunCoreLogger, "Run macro");
     if (!freeVarSpaceListCount(env->activity->count_run_varlist, tmp)) { // 释放外部变量空间
     if (!freeVarSpaceListCount(env->activity->count_run_varlist, tmp)) { // 释放外部变量空间
         env->activity->count_run_varlist = 0;
         env->activity->count_run_varlist = 0;
         pushMessageDown(makeERRORMessage(RUN_ERROR, FREE_VARSPACE_INFO, env), env);
         pushMessageDown(makeERRORMessage(RUN_ERROR, FREE_VARSPACE_INFO, env), env);
@@ -1330,17 +1353,20 @@ void pushGuardianActivity(af_GuardianList *gl, af_GuardianList **pgl, af_Environ
 
 
 bool pushImportActivity(af_Code *bt, af_Object **obj, char *mark, af_Environment *env) {
 bool pushImportActivity(af_Code *bt, af_Object **obj, char *mark, af_Environment *env) {
     af_Object *tmp = NULL;
     af_Object *tmp = NULL;
-    if (obj == NULL)
-        obj = &tmp;
-
-    if (*obj == NULL)
-        *obj = makeGlobalObject(env);
+    if (obj != NULL)
+        tmp = *obj;
 
 
-    if (*obj == NULL)
-        return false;
+    if (tmp == NULL)
+        tmp = makeGlobalObject(env);
 
 
-    af_Activity *activity = makeTopImportActivity(bt, bt, env->protect, *obj, mark);
+    af_Activity *activity = makeTopImportActivity(bt, bt, env->protect, tmp, mark);
     pushActivity(activity, env);
     pushActivity(activity, env);
+
+    if (obj != NULL)
+        *obj = tmp;
+    else
+        gc_delReference(tmp, env);
+
     return true;
     return true;
 }
 }
 
 
@@ -1651,8 +1677,11 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
         if (msg == NULL && env->activity->return_first) {  // 如果首位
         if (msg == NULL && env->activity->return_first) {  // 如果首位
             if (env->activity->return_obj == NULL)
             if (env->activity->return_obj == NULL)
                 msg = makeERRORMessage(RUN_ERROR, RETURN_OBJ_NOT_FOUND_INFO, env);
                 msg = makeERRORMessage(RUN_ERROR, RETURN_OBJ_NOT_FOUND_INFO, env);
-            else
+            else {
+                gc_addReference(env->activity->return_obj, env);
                 msg = makeNORMALMessage(env->activity->return_obj, env);
                 msg = makeNORMALMessage(env->activity->return_obj, env);
+                env->activity->return_obj = NULL;
+            }
         }
         }
     }
     }
 
 
@@ -1662,6 +1691,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 */
     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")) {
         env->activity->msg_down != NULL && EQ_STR(env->activity->msg_down->type, "NORMAL")) {
         af_Message *tmp = getFirstMessage(env);
         af_Message *tmp = getFirstMessage(env);
+        gc_addReference(env->activity->belong, env);
         pushMessageDown(makeIMPORTMessage(env->activity->import_mark, env->activity->belong, env), env);  // 压入belong作为msg
         pushMessageDown(makeIMPORTMessage(env->activity->import_mark, env->activity->belong, env), env);  // 压入belong作为msg
         pushMessageDown(tmp, env);
         pushMessageDown(tmp, env);
     }
     }
@@ -2020,12 +2050,19 @@ static char *getActivityTrackBackInfoToBacktracking(af_ActivityTrackBack *atb) {
     return strCopy(info);
     return strCopy(info);
 }
 }
 
 
+/**
+ * 生成用于类型为IMPORT的Message的信息的数据
+ * 注意: obj必须添加 gc_addReference
+ * @param mark
+ * @param obj
+ * @param env
+ * @return
+ */
 af_ImportInfo *makeImportInfo(char *mark, af_Object *obj, af_Environment *env){
 af_ImportInfo *makeImportInfo(char *mark, af_Object *obj, af_Environment *env){
     af_ImportInfo *ii = calloc(1, sizeof(af_ImportInfo));
     af_ImportInfo *ii = calloc(1, sizeof(af_ImportInfo));
     if (mark != NULL)
     if (mark != NULL)
         ii->mark = strCopy(mark);
         ii->mark = strCopy(mark);
     ii->obj = obj;
     ii->obj = obj;
-    gc_addReference(obj, env);
     return ii;
     return ii;
 }
 }
 
 
@@ -2036,13 +2073,18 @@ void freeImportInfo(af_ImportInfo *ii, af_Environment *env){
     free(ii);
     free(ii);
 }
 }
 
 
+/**
+ * 创建守护器函数调用列表
+ * 注意: obj和func 必须添加 gc_addReference
+ * @param obj func的belong (可为NULL)
+ * @param func 调用的函数
+ * @param env 运行环境
+ * @return
+ */
 static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func, af_Environment *env){
 static af_GuardianList *makeGuardianList(af_Object *obj, af_Object *func, af_Environment *env){
     af_GuardianList *gl = calloc(1, sizeof(af_GuardianList));
     af_GuardianList *gl = calloc(1, sizeof(af_GuardianList));
     gl->obj = obj;
     gl->obj = obj;
     gl->func = func;
     gl->func = func;
-    if (obj != NULL)
-        gc_addReference(obj, env);
-    gc_addReference(func, env);
     return gl;
     return gl;
 }
 }
 
 
@@ -2138,9 +2180,13 @@ af_Object *getCoreGlobal(af_Environment *env) {
 af_Object *getGlobal(af_Environment *env) {
 af_Object *getGlobal(af_Environment *env) {
     af_Activity *activity = env->activity;
     af_Activity *activity = env->activity;
     for (NULL; activity != NULL; activity = activity->prev) {
     for (NULL; activity != NULL; activity = activity->prev) {
-        if (activity->type == act_top || activity->type == act_top_import)
+        if (activity->type == act_top || activity->type == act_top_import) {
+            gc_addReference(activity->belong, env);
             return activity->belong;
             return activity->belong;
+        }
     }
     }
+
+    gc_addReference(env->global, env);
     return env->global;
     return env->global;
 }
 }
 
 
@@ -2162,29 +2208,6 @@ FileLine getActivityLine(af_Environment *env){
     return env->activity->line;
     return env->activity->line;
 }
 }
 
 
-af_Object *getMsgNormalData(af_Message *msg, af_Environment *env){
-    if (!EQ_STR("NORMAL", msg->type))
-        return NULL;
-    af_Object *obj = *(af_Object **)msg->msg;
-    gc_delReference(obj, env);
-    *(af_Object **)msg->msg = NULL;
-    return obj;
-}
-
-af_ErrorInfo *getMsgErrorInfo(af_Message *msg) {
-    if (!EQ_STR("ERROR", msg->type))
-        return NULL;
-    af_ErrorInfo *ei = *(af_ErrorInfo **)msg->msg;
-    return ei;
-}
-
-af_ImportInfo *getMsgImportInfo(af_Message *msg) {
-    if (!EQ_STR("IMPORT", msg->type))
-        return NULL;
-    af_ImportInfo *ii = *(af_ImportInfo **)msg->msg;
-    return ii;
-}
-
 char *getErrorType(af_ErrorInfo *ei) {
 char *getErrorType(af_ErrorInfo *ei) {
     return ei->error_type;
     return ei->error_type;
 }
 }
@@ -2202,7 +2225,6 @@ af_Object *getImportObject(af_ImportInfo *ii, af_Environment *env){
     if (obj == NULL)
     if (obj == NULL)
         return NULL;
         return NULL;
     ii->obj = NULL;
     ii->obj = NULL;
-    gc_delReference(obj, env);
     return obj;
     return obj;
 }
 }
 
 

+ 15 - 1
src/core/func.c

@@ -54,7 +54,6 @@ af_ArgList *makeArgList(char *name, af_Object *obj, af_Environment *env){
     af_ArgList *arg_list = calloc(1, sizeof(af_ArgList));
     af_ArgList *arg_list = calloc(1, sizeof(af_ArgList));
     arg_list->name = strCopy(name);
     arg_list->name = strCopy(name);
     arg_list->obj = obj;
     arg_list->obj = obj;
-    gc_addReference(obj, env);
     return arg_list;
     return arg_list;
 }
 }
 
 
@@ -82,6 +81,21 @@ af_ArgList **pushArgList(af_ArgList **base, af_ArgList *new) {
     return base;
     return base;
 }
 }
 
 
+/**
+ * af_ArgCodeList 转 af_ArgList
+ * @param name 参数名
+ * @param acl ArgCodeList
+ * @param env 运行环境
+ * @return
+ */
+af_ArgList *makeArgListFromArgCodeList(char *name, af_ArgCodeList *acl, af_Environment *env) {
+    af_Object *obj = getArgCodeListResult(acl);
+    gc_addReference(obj, env);
+
+    af_ArgList *al = makeArgList(name, obj, env);
+    return al;
+}
+
 bool runArgList(af_ArgList *al, af_VarSpaceListNode *vsl, af_Environment *env){
 bool runArgList(af_ArgList *al, af_VarSpaceListNode *vsl, af_Environment *env){
     for (NULL; al != NULL; al = al->next) {
     for (NULL; al != NULL; al = al->next) {
         if (!makeVarToVarSpaceList(al->name, 3, 3, 3, al->obj, vsl,
         if (!makeVarToVarSpaceList(al->name, 3, 3, 3, al->obj, vsl,

+ 35 - 29
src/core/gc.c

@@ -6,35 +6,37 @@
 #include "pthread.h"
 #include "pthread.h"
 
 
 /* gc 操控函数 */
 /* gc 操控函数 */
-void gc_addObjectData(af_ObjectData *obj, af_Environment *base){
+void gc_addObjectData(af_ObjectData *od, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.prev = ((void *) 0);
+    od->gc.info.reference = 1;
+    od->gc.prev = ((void *) 0);
     if (base->gc_factory->gc_ObjectData != ((void *) 0))
     if (base->gc_factory->gc_ObjectData != ((void *) 0))
-        base->gc_factory->gc_ObjectData->gc.prev = obj;
-    obj->gc.next = base->gc_factory->gc_ObjectData;
-    base->gc_factory->gc_ObjectData = obj;
+        base->gc_factory->gc_ObjectData->gc.prev = od;
+    od->gc.next = base->gc_factory->gc_ObjectData;
+    base->gc_factory->gc_ObjectData = od;
     GcCountAdd1(base);
     GcCountAdd1(base);
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_addObjectDataReference(af_ObjectData *obj, af_Environment *base){
+void gc_addObjectDataReference(af_ObjectData *od, af_Environment *base){
     base = base->base;  // 转换为主线程 Env
     base = base->base;  // 转换为主线程 Env
 
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.info.reference++;
+    od->gc.info.reference++;
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_delObjectDataReference(af_ObjectData *obj, af_Environment *base){
+void gc_delObjectDataReference(af_ObjectData *od, af_Environment *base){
     base = base->base;  // 转换为主线程 Env
     base = base->base;  // 转换为主线程 Env
 
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.info.reference--;
+    od->gc.info.reference--;
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
 void gc_addObject(af_Object *obj, af_Environment *base){
 void gc_addObject(af_Object *obj, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
+    obj->gc.info.reference = 1;
     obj->gc.prev = ((void *) 0);
     obj->gc.prev = ((void *) 0);
     if (base->gc_factory->gc_Object != ((void *) 0))
     if (base->gc_factory->gc_Object != ((void *) 0))
         base->gc_factory->gc_Object->gc.prev = obj;
         base->gc_factory->gc_Object->gc.prev = obj;
@@ -60,56 +62,58 @@ void gc_delObjectReference(af_Object *obj, af_Environment *base){
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_addVar(af_Var *obj, af_Environment *base) {
+void gc_addVar(af_Var *var, af_Environment *base) {
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.prev = ((void *) 0);
+    var->gc.info.reference = 1;
+    var->gc.prev = ((void *) 0);
     if (base->gc_factory->gc_Var != ((void *) 0))
     if (base->gc_factory->gc_Var != ((void *) 0))
-        base->gc_factory->gc_Var->gc.prev = obj;
-    obj->gc.next = base->gc_factory->gc_Var;
-    base->gc_factory->gc_Var = obj;
+        base->gc_factory->gc_Var->gc.prev = var;
+    var->gc.next = base->gc_factory->gc_Var;
+    base->gc_factory->gc_Var = var;
     GcCountAdd1(base);
     GcCountAdd1(base);
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_addVarReference(af_Var *obj, af_Environment *base) {
+void gc_addVarReference(af_Var *var, af_Environment *base) {
     base = base->base;  // 转换为主线程 Env
     base = base->base;  // 转换为主线程 Env
 
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.info.reference++;
+    var->gc.info.reference++;
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_delVarReference(af_Var *obj, af_Environment *base) {
+void gc_delVarReference(af_Var *var, af_Environment *base) {
     base = base->base;  // 转换为主线程 Env
     base = base->base;  // 转换为主线程 Env
 
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.info.reference--;
+    var->gc.info.reference--;
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_addVarSpace(af_VarSpace *obj, af_Environment *base){
+void gc_addVarSpace(af_VarSpace *vs, af_Environment *base){
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.prev = ((void *) 0);
-    if (base->gc_factory->gc_VarSpace != ((void *) 0)) { base->gc_factory->gc_VarSpace->gc.prev = obj; }
-    obj->gc.next = base->gc_factory->gc_VarSpace;
-    base->gc_factory->gc_VarSpace = obj;
+    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; }
+    vs->gc.next = base->gc_factory->gc_VarSpace;
+    base->gc_factory->gc_VarSpace = vs;
     GcCountAdd1(base);
     GcCountAdd1(base);
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_addVarSpaceReference(af_VarSpace *obj, af_Environment *base) {
+void gc_addVarSpaceReference(af_VarSpace *vs, af_Environment *base) {
     base = base->base;  // 转换为主线程 Env
     base = base->base;  // 转换为主线程 Env
 
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.info.reference++;
+    vs->gc.info.reference++;
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
-void gc_delVarSpaceReference(af_VarSpace *obj, af_Environment *base) {
+void gc_delVarSpaceReference(af_VarSpace *vs, af_Environment *base) {
     base = base->base;  // 转换为主线程 Env
     base = base->base;  // 转换为主线程 Env
 
 
     pthread_mutex_lock(&base->gc_factory->mutex);
     pthread_mutex_lock(&base->gc_factory->mutex);
-    obj->gc.info.reference--;
+    vs->gc.info.reference--;
     pthread_mutex_unlock(&base->gc_factory->mutex);
     pthread_mutex_unlock(&base->gc_factory->mutex);
 }
 }
 
 
@@ -448,7 +452,7 @@ static void freeValue(af_Environment *env) {
 static pgc_Analyzed checkDestruct(af_Environment *env, paf_GuardianList *pgl, pgc_Analyzed plist) {
 static pgc_Analyzed checkDestruct(af_Environment *env, paf_GuardianList *pgl, pgc_Analyzed plist) {
     for (af_ObjectData *od = env->gc_factory->gc_ObjectData; od != NULL; od = od->gc.next) {
     for (af_ObjectData *od = env->gc_factory->gc_ObjectData; od != NULL; od = od->gc.next) {
         if (!od->gc.info.reachable && !od->gc.done_destruct) {
         if (!od->gc.info.reachable && !od->gc.done_destruct) {
-            af_Object *func = findObjectAttributesByObjectData(mg_gc_destruct, NULL, od);
+            af_Object *func = findObjectAttributesByObjectData(mg_gc_destruct, NULL, od, env);
             if (func == NULL)
             if (func == NULL)
                 continue;
                 continue;
             od->gc.done_destruct = true;
             od->gc.done_destruct = true;
@@ -456,6 +460,7 @@ static pgc_Analyzed checkDestruct(af_Environment *env, paf_GuardianList *pgl, pg
             pthread_rwlock_rdlock(&od->lock);
             pthread_rwlock_rdlock(&od->lock);
             af_Object *base = od->base;
             af_Object *base = od->base;
             pthread_rwlock_unlock(&od->lock);
             pthread_rwlock_unlock(&od->lock);
+            gc_addReference(base, env);
 
 
             *pgl = pushGuardianList(base, func, *pgl, env);
             *pgl = pushGuardianList(base, func, *pgl, env);
             plist = reachableObjectData(od, plist);
             plist = reachableObjectData(od, plist);
@@ -500,7 +505,7 @@ paf_GuardianList checkAllDestruct(af_Environment *env, paf_GuardianList pgl) {
     pthread_mutex_lock(&env->gc_factory->mutex);
     pthread_mutex_lock(&env->gc_factory->mutex);
     for (af_ObjectData *od = env->gc_factory->gc_ObjectData; od != NULL; od = od->gc.next) {
     for (af_ObjectData *od = env->gc_factory->gc_ObjectData; od != NULL; od = od->gc.next) {
         if (!od->gc.done_destruct) {
         if (!od->gc.done_destruct) {
-            af_Object *func = findObjectAttributesByObjectData(mg_gc_destruct, NULL, od);
+            af_Object *func = findObjectAttributesByObjectData(mg_gc_destruct, NULL, od, env);
             if (func == NULL)
             if (func == NULL)
                 continue;
                 continue;
             od->gc.done_destruct = true;
             od->gc.done_destruct = true;
@@ -508,6 +513,7 @@ paf_GuardianList checkAllDestruct(af_Environment *env, paf_GuardianList pgl) {
             pthread_rwlock_rdlock(&od->lock);
             pthread_rwlock_rdlock(&od->lock);
             af_Object *base = od->base;
             af_Object *base = od->base;
             pthread_rwlock_unlock(&od->lock);
             pthread_rwlock_unlock(&od->lock);
+            gc_addReference(base, env);
 
 
             pgl = pushGuardianList(base, func, pgl, env);
             pgl = pushGuardianList(base, func, pgl, env);
         }
         }

+ 1 - 0
src/core/global_obj.c

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

+ 17 - 6
src/core/object.c

@@ -1,5 +1,6 @@
 #include "__object.h"
 #include "__object.h"
 #include "__env.h"
 #include "__env.h"
+#include "__gc.h"
 #include "tool.h"
 #include "tool.h"
 
 
 /* ObjectData 创建与释放 */
 /* ObjectData 创建与释放 */
@@ -35,6 +36,8 @@ static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI
     od->allow_inherit = allow_inherit;
     od->allow_inherit = allow_inherit;
 
 
     od->var_space = makeVarSpace(base_obj, 3, 2, 0, env);
     od->var_space = makeVarSpace(base_obj, 3, 2, 0, env);
+    gc_delReference(od->var_space, env);
+
     od->inherit = NULL;
     od->inherit = NULL;
 
 
     obj_getDataSize *func = findAPI("obj_getDataSize", api);
     obj_getDataSize *func = findAPI("obj_getDataSize", api);
@@ -103,6 +106,7 @@ af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inh
     obj->belong = belong;
     obj->belong = belong;
     obj->data->inherit = ih;
     obj->data->inherit = ih;
     obj->data->free_inherit = free_inherit;
     obj->data->free_inherit = free_inherit;
+    gc_delReference(obj->data, env);  // od已经被obj引用, 并且不再是临时变量
     return obj;
     return obj;
 }
 }
 
 
@@ -406,16 +410,16 @@ void *findObjectAPI(char *api_name, af_Object *obj) {
     return GET_SYMBOL(node->api);
     return GET_SYMBOL(node->api);
 }
 }
 
 
-af_Object *findObjectAttributes(char *name, af_Object *visitor, af_Object *obj) {
+af_Object *findObjectAttributes(char *name, af_Object *visitor, af_Object *obj, af_Environment *env){
     af_Var *var = findVarFromVarSpace(name, visitor, getObjectVarSpace(obj));
     af_Var *var = findVarFromVarSpace(name, visitor, getObjectVarSpace(obj));
 
 
     if (var != NULL)
     if (var != NULL)
-        return findVarNode(var, NULL);
+        return findVarNode(var, NULL, env);
 
 
     for (af_Inherit *ih = getObjectInherit(obj); ih != NULL; ih = getInheritNext(ih)) {
     for (af_Inherit *ih = getObjectInherit(obj); ih != NULL; ih = getInheritNext(ih)) {
         var = findVarFromVarSpace(name, visitor, getInheritVarSpace(ih));  // 搜索共享变量空间
         var = findVarFromVarSpace(name, visitor, getInheritVarSpace(ih));  // 搜索共享变量空间
         if (var != NULL)
         if (var != NULL)
-            return findVarNode(var, NULL);
+            return findVarNode(var, NULL, env);
     }
     }
 
 
     return NULL;
     return NULL;
@@ -426,19 +430,26 @@ bool setObjectAttributes(char *name, char p_self, char p_posterity, char p_exter
     return makeVarToVarSpace(name, p_self, p_posterity, p_external, attributes, getObjectVarSpace(obj), visitor, env);
     return makeVarToVarSpace(name, p_self, p_posterity, p_external, attributes, getObjectVarSpace(obj), visitor, env);
 }
 }
 
 
-af_Object *findObjectAttributesByObjectData(char *name, af_Object *visitor, af_ObjectData *od) {
+/**
+ * 获得指定对象的属性, 自动添加 gc_addReference
+ * @param name
+ * @param visitor
+ * @param od
+ * @return
+ */
+af_Object *findObjectAttributesByObjectData(char *name, af_Object *visitor, af_ObjectData *od, af_Environment *env){
     pthread_rwlock_rdlock(&od->lock);
     pthread_rwlock_rdlock(&od->lock);
     af_Var *var = findVarFromVarSpace(name, visitor, od->var_space);
     af_Var *var = findVarFromVarSpace(name, visitor, od->var_space);
     af_Inherit *ih = od->inherit;
     af_Inherit *ih = od->inherit;
     pthread_rwlock_unlock(&od->lock);
     pthread_rwlock_unlock(&od->lock);
 
 
     if (var != NULL)
     if (var != NULL)
-        return findVarNode(var, NULL);
+        return findVarNode(var, NULL, env);
 
 
     for (NULL; ih != NULL; ih = getInheritNext(ih)) {
     for (NULL; ih != NULL; ih = getInheritNext(ih)) {
         var = findVarFromVarSpace(name, visitor, getInheritVarSpace(ih));  // 搜索共享变量空间
         var = findVarFromVarSpace(name, visitor, getInheritVarSpace(ih));  // 搜索共享变量空间
         if (var != NULL)
         if (var != NULL)
-            return findVarNode(var, NULL);
+            return findVarNode(var, NULL, env);
     }
     }
 
 
     return NULL;
     return NULL;

+ 16 - 10
src/core/run.c

@@ -174,8 +174,11 @@ static bool codeElement(af_Code *code, af_Environment *env) {
             return false;
             return false;
         }
         }
 
 
-        writeTrackLog(aFunCoreLogger, "Get literal %s : %p", code->element.data, findVarNode(var, NULL));
-        return pushLiteralActivity(code, code->element.data, findVarNode(var, NULL), 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);
+        return res;
     }
     }
 
 
     /* 变量执行 */
     /* 变量执行 */
@@ -186,19 +189,22 @@ static bool codeElement(af_Code *code, af_Environment *env) {
         return false;
         return false;
     }
     }
 
 
-    af_Object *obj = findVarNode(var, NULL);
+    af_Object *obj = findVarNode(var, NULL, env);
     obj_isObjFunc *is_obj;
     obj_isObjFunc *is_obj;
     obj_isInfixFunc *is_infix;
     obj_isInfixFunc *is_infix;
 
 
     if (code->prefix != getPrefix(E_QUOTE, env)) {
     if (code->prefix != getPrefix(E_QUOTE, env)) {
         af_ObjectAPI *api = getObjectAPI(obj);
         af_ObjectAPI *api = getObjectAPI(obj);
         char *id = getObjectID(obj);
         char *id = getObjectID(obj);
-        if ((is_obj = findAPI("obj_isObjFunc", api)) != NULL && is_obj(id, obj))
-            return pushVariableActivity(code, obj, env);  // 对象函数
-        else if (env->activity->status != act_func_get && // 在act_func_get 模式下不检查是否为is_infix函数 因为本来就要将其作为函数调用
+        if ((is_obj = findAPI("obj_isObjFunc", api)) != NULL && is_obj(id, obj)) {
+            bool res = pushVariableActivity(code, 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)) {
                  (is_infix = findAPI("obj_isInfixFunc", api)) != NULL && is_infix(id, obj)) {
             pushMessageDown(makeERRORMessageFormat(INFIX_PROTECT, env,
             pushMessageDown(makeERRORMessageFormat(INFIX_PROTECT, env,
                                                    "Infix protect variable: %s.", code->element.data), env);
                                                    "Infix protect variable: %s.", code->element.data), env);
+            gc_delReference(obj, env);
             return false;
             return false;
         }
         }
     }
     }
@@ -328,7 +334,7 @@ bool checkNormalEnd(af_Message *msg, af_Environment *env) {
  * 目标: 检查act_arg是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
  * 目标: 检查act_arg是否运行到结尾 (若运行到结尾则返回true, 否则返回false)
  */
  */
 static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
 static bool checkGetArgEnd(af_Message *msg, af_Environment *env) {
-    env->activity->acl_done->result = *(af_Object **)(msg->msg);
+    env->activity->acl_done->result = *(af_Object **)(msg->msg);  // 保持 gc 引用计数
     freeMessage(msg);
     freeMessage(msg);
     if (env->activity->acl_done->next == NULL) { // 参数设定结束
     if (env->activity->acl_done->next == NULL) { // 参数设定结束
         setArgCodeListToActivity(NULL, env);
         setArgCodeListToActivity(NULL, env);
@@ -363,7 +369,7 @@ bool iterCode(af_Code *code, int mode, af_Environment *env){
     if (!iterCodeInit(code, mode, env))
     if (!iterCodeInit(code, mode, env))
         return false;
         return false;
     bool re = true;
     bool re = true;
-    af_Monitor *monitor = makeMonitor(env);
+    makeMonitor(env);  // 启动监视线程
     /*
     /*
      * 问题: 如何确保循环跳出之前, top-Activity已经被pop。(即执行释放)
      * 问题: 如何确保循环跳出之前, top-Activity已经被pop。(即执行释放)
      * 为什么会有这个问题: top-Activity只有在bt_next=NULL时被pop, 而循环也是在bt_next=NULL时可能被退出
      * 为什么会有这个问题: top-Activity只有在bt_next=NULL时被pop, 而循环也是在bt_next=NULL时可能被退出
@@ -483,10 +489,10 @@ bool iterCode(af_Code *code, int mode, af_Environment *env){
                 break;
                 break;
             case act_func_get: {
             case act_func_get: {
                 af_Object *func = *(af_Object **) (msg->msg);  // func仍保留了msg的gc计数
                 af_Object *func = *(af_Object **) (msg->msg);  // func仍保留了msg的gc计数
-                gc_delReference(func, env);  // 释放计数
-                freeMessage(msg);
                 if (!setFuncActivityToArg(func, env))
                 if (!setFuncActivityToArg(func, env))
                     popActivity(false, NULL, env);
                     popActivity(false, NULL, env);
+                gc_delReference(func, env);  // 释放计数 (setFuncActivityToArg 不需要计数)
+                freeMessage(msg);
                 break;
                 break;
             }
             }
             case act_func_arg: {
             case act_func_arg: {

+ 8 - 2
src/core/thread.c

@@ -12,6 +12,7 @@ static void *runThread(void *ec);
 
 
 /**
 /**
  * 启动一个次线程运行代码
  * 启动一个次线程运行代码
+ * 注意: vs需要 gc_addReference
  * @param env 父线程env
  * @param env 父线程env
  * @param vs 压入的变量空间
  * @param vs 压入的变量空间
  * @param code 执行的代码
  * @param code 执行的代码
@@ -21,13 +22,18 @@ af_Environment *startRunThread(af_Environment *env, af_VarSpace *vs, af_Code *co
     af_Environment *base = env->base;
     af_Environment *base = env->base;
     af_Environment *new = deriveEnvironment(derive_tmp, derive_guardian, derive_lr, enable, base);
     af_Environment *new = deriveEnvironment(derive_tmp, derive_guardian, derive_lr, enable, base);
 
 
-    if (vs == NULL)
-        vs = makeVarSpace(getGlobal(env), 3, 3, 3, env);
+    if (vs == NULL) {
+        af_Object *obj = getGlobal(env);
+        vs = makeVarSpace(obj, 3, 3, 3, env);
+        gc_delReference(obj, env);
+    }
 
 
     af_VarSpaceListNode *vsl = makeVarSpaceList(vs);
     af_VarSpaceListNode *vsl = makeVarSpaceList(vs);
     vsl->next = new->activity->run_varlist;
     vsl->next = new->activity->run_varlist;
     new->activity->run_varlist = vsl;
     new->activity->run_varlist = vsl;
     new->activity->count_run_varlist++;
     new->activity->count_run_varlist++;
+    gc_delReference(vs, base);
+
     if (!enable)  // 如果未Enable, 则暂时不启动线程
     if (!enable)  // 如果未Enable, 则暂时不启动线程
         return new;
         return new;
 
 

+ 30 - 11
src/core/var.c

@@ -93,16 +93,19 @@ void addVarNode(af_Var *var, af_Object *obj, char *id) {
 /**
 /**
  * 查找指定名字的VarNode
  * 查找指定名字的VarNode
  * 外部函数, 带锁
  * 外部函数, 带锁
+ * 返回值自动添加 gc_addReference
  * @param var
  * @param var
  * @param id
  * @param id
  * @return
  * @return
  */
  */
-af_Object *findVarNode(af_Var *var, char *id) {
+af_Object *findVarNode(af_Var *var, char *id, af_Environment *env){
     pthread_rwlock_rdlock(&var->lock);
     pthread_rwlock_rdlock(&var->lock);
     af_VarNode *vn = findVarNode_(var, id);
     af_VarNode *vn = findVarNode_(var, id);
     af_Object *obj = NULL;
     af_Object *obj = NULL;
-    if (vn != NULL)
+    if (vn != NULL) {
         obj = vn->obj;
         obj = vn->obj;
+        gc_addReference(obj, env);
+    }
     pthread_rwlock_unlock(&var->lock);
     pthread_rwlock_unlock(&var->lock);
     return obj;
     return obj;
 }
 }
@@ -220,12 +223,13 @@ static bool checkVarSpaceDefinePermissions(af_Object *visitor, af_VarSpace *vs){
 
 
 /**
 /**
  * 把var添加到VarSpace中
  * 把var添加到VarSpace中
+ * 注意: Var必须添加 gc_addReference
  * @param var 变量
  * @param var 变量
  * @param visitor 访问者
  * @param visitor 访问者
  * @param vs 变量空间
  * @param vs 变量空间
  * @return 若空间被保护, 权限错误或已存在同名Var则返回false不作修改 否则返回true
  * @return 若空间被保护, 权限错误或已存在同名Var则返回false不作修改 否则返回true
  */
  */
-bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs) {
+bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs, af_Environment *env){
     pthread_rwlock_rdlock(&var->lock);
     pthread_rwlock_rdlock(&var->lock);
     pthread_rwlock_wrlock(&vs->lock);
     pthread_rwlock_wrlock(&vs->lock);
 
 
@@ -250,6 +254,7 @@ bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs) {
     *pCup = makeVarCup(var);
     *pCup = makeVarCup(var);
     pthread_rwlock_unlock(&vs->lock);
     pthread_rwlock_unlock(&vs->lock);
     pthread_rwlock_unlock(&var->lock);
     pthread_rwlock_unlock(&var->lock);
+    gc_delReference(var, env);
     return true;
     return true;
 
 
 RETURN_FALSE:
 RETURN_FALSE:
@@ -267,7 +272,11 @@ RETURN_FALSE:
  */
  */
 bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
 bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
                        af_Object *visitor, af_Environment *env){
                        af_Object *visitor, af_Environment *env){
-    return addVarToVarSpace(makeVar(name, p_self, p_posterity, p_external, obj, env), visitor, vs);
+    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);
+    return false;
 }
 }
 
 
 /*
 /*
@@ -276,10 +285,10 @@ bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_externa
  * 自动跳过保护空间
  * 自动跳过保护空间
  * 调用 addVarToVarSpace
  * 调用 addVarToVarSpace
  */
  */
-bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl) {
+bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl, af_Environment *env){
     for (NULL; vsl != NULL; vsl = vsl->next) {
     for (NULL; vsl != NULL; vsl = vsl->next) {
         if (!vsl->vs->is_protect)
         if (!vsl->vs->is_protect)
-            return addVarToVarSpace(var, visitor, vsl->vs);
+            return addVarToVarSpace(var, visitor, vsl->vs, env);
     }
     }
     return false;
     return false;
 }
 }
@@ -292,7 +301,11 @@ bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *
  */
  */
 bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
 bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
                            af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env){
                            af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env){
-    return addVarToVarSpaceList(makeVar(name, p_self, p_posterity, p_external, obj, env), visitor, vsl);
+    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);
+    return false;
 }
 }
 
 
 /*
 /*
@@ -307,7 +320,11 @@ bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_
     env->protect->is_protect = false;
     env->protect->is_protect = false;
     pthread_rwlock_unlock(&env->protect->lock);
     pthread_rwlock_unlock(&env->protect->lock);
 
 
-    bool re = addVarToVarSpace(makeVar(name, p_self, p_posterity, p_external, obj, env), env->activity->belong, env->protect);
+    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);
 
 
     pthread_rwlock_wrlock(&env->protect->lock);
     pthread_rwlock_wrlock(&env->protect->lock);
     env->protect->is_protect = true;
     env->protect->is_protect = true;
@@ -317,7 +334,7 @@ bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_
 
 
 /*
 /*
  * 函数名: addVarToProtectVarSpace
  * 函数名: addVarToProtectVarSpace
- * 目标: 添加一个var变量添加到保护空间中
+ * 目标: 添加一个var变量添加到保护空间中 (Var需要提前gc_addReference)
  * 若已存在同名Var则返回false不作修改
  * 若已存在同名Var则返回false不作修改
  * 否则返回true
  * 否则返回true
  * 调用 addVarToVarSpace
  * 调用 addVarToVarSpace
@@ -328,7 +345,7 @@ bool addVarToProtectVarSpace(af_Var *var, af_Environment *env) {
     env->protect->is_protect = false;
     env->protect->is_protect = false;
     pthread_rwlock_unlock(&env->protect->lock);
     pthread_rwlock_unlock(&env->protect->lock);
 
 
-    bool re = addVarToVarSpace(var, NULL, env->protect);
+    bool re = addVarToVarSpace(var, NULL, env->protect, env);
 
 
     pthread_rwlock_wrlock(&env->protect->lock);
     pthread_rwlock_wrlock(&env->protect->lock);
     env->protect->is_protect = is_protect;
     env->protect->is_protect = is_protect;
@@ -602,8 +619,10 @@ bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpace
 }
 }
 
 
 af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env){
 af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env){
-    af_VarSpaceListNode *new = makeVarSpaceList(makeVarSpace(belong, 3, 2, 0, env));
+    af_VarSpace *vs = makeVarSpace(belong, 3, 2, 0, env);
+    af_VarSpaceListNode *new = makeVarSpaceList(vs);
     new->next = base;
     new->next = base;
+    gc_delReference(vs, env);
     return new;
     return new;
 }
 }
 
 

+ 1 - 1
src/runtime/aFunlang.c

@@ -65,7 +65,7 @@ af_Environment *creatAFunEnvironment(int argc, char **argv){
     if (!aFunInit_mark)
     if (!aFunInit_mark)
         return NULL;
         return NULL;
 
 
-    af_Environment *env = makeEnvironment(grt_count);
+    af_Environment *env = makeEnvironment(grt_always);
     af_Code *code = NULL;
     af_Code *code = NULL;
 
 
     for(int i = 0; i < argc; i++)
     for(int i = 0; i < argc; i++)

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

@@ -48,6 +48,7 @@ static void strFuncInit(char *id, af_Object *obj, ObjectStrFunc *data, af_Enviro
         return;
         return;
     data->func_var_list = copyVarSpaceList(getRunVarSpaceList(env));
     data->func_var_list = copyVarSpaceList(getRunVarSpaceList(env));
     data->share_vs = makeVarSpace(obj, 3, 2, 0, env);
     data->share_vs = makeVarSpace(obj, 3, 2, 0, env);
+    gc_delReference(data->share_vs, env);
     data->api = makeAPIFromList(api_list);
     data->api = makeAPIFromList(api_list);
 }
 }
 
 

+ 5 - 2
src/runtime/runtime.c

@@ -75,12 +75,15 @@ void makeObjectFromList(const ObjectDefineList obj_def[], af_Object *visitor, af
             api = makeAPIFromList(od->api_list);
             api = makeAPIFromList(od->api_list);
 
 
         af_Object *obj = makeObject(od->id, od->free_api, api, od->allow_inherit, od->belong, true, od->inherit, env);
         af_Object *obj = makeObject(od->id, od->free_api, api, od->allow_inherit, od->belong, true, od->inherit, env);
-        if (od->save != NULL)
-            *(od->save) = obj;
         if (vs != NULL && od->var_name != NULL) {
         if (vs != NULL && od->var_name != NULL) {
             if (!makeVarToVarSpace(od->var_name, od->p_self, od->p_posterity, od->p_external, obj, vs, visitor, env))
             if (!makeVarToVarSpace(od->var_name, od->p_self, od->p_posterity, od->p_external, obj, vs, visitor, env))
                 setVarToVarSpace(od->var_name, obj, visitor, vs);  // 若失败则尝试直接设定变量
                 setVarToVarSpace(od->var_name, obj, visitor, vs);  // 若失败则尝试直接设定变量
         }
         }
+
+        if (od->save != NULL)
+            *(od->save) = obj;
+        else
+            gc_delReference(obj, env);
     }
     }
 }
 }
 
 

+ 1 - 1
test/export/main.c

@@ -77,7 +77,7 @@ void literalSet(char *str, void *data, af_Object *obj, af_Environment *env) {
     printf("literalSet(): str = %s\n", str);
     printf("literalSet(): str = %s\n", str);
 }
 }
 
 
-af_FuncBody *testFunc(CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
+af_FuncBody *testFunc_Normal(struct af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     printf("testFunc(): I am testFunc\n");
     printf("testFunc(): I am testFunc\n");
     af_Object *obj;
     af_Object *obj;
 
 

File diff suppressed because it is too large
+ 298 - 328
test/src/run_code.c


Some files were not shown because too many files changed in this diff