2
0
SongZihuan 3 жил өмнө
parent
commit
23e464b858

+ 55 - 56
include/core/README

@@ -16,8 +16,8 @@ af_BlockType 表示block类型的枚举体 (公开)
 * makeBlockCode
 * freeAllCode
 
-相关操作:
-* connectCode  [不会修改现有代码的结构, 只是在末尾追加内容]
+相关操作:
+* pushCode  [不会修改现有代码的结构, 只是在末尾追加内容]
 * copyCode
 * writeAllCode
 * readAllCode
@@ -26,16 +26,15 @@ af_BlockType 表示block类型的枚举体 (公开)
 属性访问:
 * getCodeNext
 * getCodeBlockElement
-* getCodeType  [未存在]
-* getCodeBlockType  [未存在]
-* getCodePrefix  [未存在]
-* getCodeEndCount  [未存在]
-* getCodeElementData  [未存在]
-* getCodeBlockType  [未存在]
-* getCodeBlockElements  [未存在]
+* getCodeType
+* getCodeBlockType
+* getCodePrefix
+* getCodeEndCount
+* getCodeElementData
+* getCodeElementCount
 
 
-func.h
+func
 af_ArgCodeList  表示参数计算表, 已经计算结果
 af_ArgList  表示参数赋值表
 af_FuncBody  函数体信息 [无访问的必要性]
@@ -56,31 +55,31 @@ af_FuncInfo  函数信息 [无访问的必要性]
 * makeFuncInfo
 * freeFuncInfo
 
-相关操作
+相关操作:
 * pushArgCodeList
 * pushArgList
-* pushFuncBody  [未存在]
+* pushFuncBody
 * makeCFuncBodyToFuncInfo
 * makeCodeFuncBodyToFuncInfo
 * makeImportFuncBodyToFuncInfo
 * makeDynamicFuncBodyToFuncInfo
 
 属性访问
-* getArgCodeListNext  [未存在]
-* getArgListNext  [未存在]
+* getArgCodeListNext
+* getArgListNext
 * getArgCodeListResult
 * getArgCodeListData
-* getArgCodeListRunInFunc  [未存在]
+* getArgCodeListRunInFunc
 
 
-gc.h
+gc
 GcList 记录自定义的gc链接信息 [无访问的必要性]
 
 创建与释放
 * makeGcList
 * freeAllGcList
 
-相关操作
+相关操作:
 * pushGcList
 * gc_addObjectReference
 * gc_addVarReference
@@ -90,12 +89,12 @@ GcList 记录自定义的gc链接信息 [无访问的必要性]
 * gc_delVarSpaceReference
 
 属性访问
-* gc_getObjectReference  [未存在]
-* gc_getVarReference  [未存在]
-* gc_getVarSpaceReference  [未存在]
+* gc_getObjectReference
+* gc_getVarReference
+* gc_getVarSpaceReference
 
 
-object.h
+object
 af_Object 描述一个对象
 af_Inherit 描述继承关系
 af_ObjectAPI 描述API
@@ -107,29 +106,30 @@ af_ObjectAPI 描述API
 * makeObjectAPI
 * freeObjectAPI
 
-相关操作
+相关操作:
 * objectSetAllowInherit
 * setObjectAttributes
 * addAPI
 * addAPIToObject
-* pushInherit  [未定义]
+* pushInherit
 
 属性访问
-* getObjectID  [未定义]
+* getObjectID
 * getObjectData
-* getObjectAPI   [未定义]
+* getObjectAPI
 * getBelongObject
-* getInherit  (副本) [未定义]
+* getObjectInherit
+* getInheritNext
 * findObjectAttributes
 * checkPosterity
-* getInheritObject  [未定义]
-* getInheritVarSpace  [未定义]
+* getInheritObject
+* getInheritVarSpace
 * findAPI
 * findObjectAPI
-* getAPICount  [未定义]
+* getAPICount
 
 
-parser.h
+parser
 af_Parser 描述解释器
 
 创建与释放:
@@ -137,18 +137,18 @@ af_Parser 描述解释器
 * freeParser
 * makeParserByString
 * makeParserByFile
-* makeParserByStdin  [未定义]
+* makeParserByStdin
 
 相关操作:
 * parserCode
 * initParser
 
 
-run.h
+run
 相关操作:
 * iterCode
 
-var.h
+var
 af_Var 描述一个变量
 af_VarSpace 描述一个变量空间
 af_VarSpaceListNode 描述变量空间链
@@ -160,7 +160,7 @@ af_VarSpaceListNode 描述变量空间链
 * freeAllVarSpaceList
 * freeVarSpaceListCount
 
-相关操作
+相关操作:
 * addVarNode
 * addVarToVarSpace
 * makeVarToVarSpace
@@ -172,18 +172,19 @@ af_VarSpaceListNode 描述变量空间链
 * setVarToVarSpace
 * setVarToVarList
 * pushNewVarList
-* setVarPermison  [未定义]
-* setVarSpacePermison  [未定义]
-* setVarSpaceProtect  [未定义]
+* setVarPermison
+* setVarSpacePermison
+* setVarSpaceProtect
 
 属性访问
-* getVarNode  [未定义]
+* isProtectVarSpace
+* findVarNode
 * findVarFromVarSpace
 * findVarFromVarList
 * getVarSpaceFromList
 
 
-env.h
+env
 af_Environment 描述运行环境
 af_Message 描述消息传递
 af_ErrorInfo 描述错误信息
@@ -200,8 +201,10 @@ af_ErrorInfo 描述错误信息
 * makeErrorInfo
 * freeErrorInfo
 
-相关操作
+相关操作:
 * enableEnvironment
+* setGcMax
+* setGcRun
 * setPrefix
 * addVarToProtectVarSpace
 * setCoreStop
@@ -217,8 +220,6 @@ af_ErrorInfo 描述错误信息
 * pushLiteralRegex
 * fprintfErrorInfo
 * pushErrorBacktracking
-* setGcMax  [未定义]
-* setGcRun  [未定义]
 
 属性访问
 * getPrefix
@@ -226,18 +227,16 @@ af_ErrorInfo 描述错误信息
 * getProtectVarSpace
 * getMessageData
 * getFirstMessage
-* getCoreSttaus  [未定义]
-* getGcCount  [未定义]
-* getGcMax  [未定义]
-* getGcRun  [未定义]
-* getCoreGlobal  [未定义]
-* getGlobal (会涉及import)  [未定义]
-* getBelong  [未定义]
-* getActivityType  [未定义]
-* getActivityFile  [未定义]
-* getActivityLine  [未定义]
+* getGcCount
+* getGcMax
+* getGcRun
+* getCoreGlobal
+* getGlobal (会涉及import)
+* getBelong
+* getActivityFile
+* getActivityLine
 * findEnvVar
-* getMsgNormalData  [未定义]
-* getMsgErrorInfo  [未定义]
-* getErrorType  [未定义]
-* getMsgError  [未定义]
+* getMsgNormalData
+* getMsgErrorInfo
+* getErrorType
+* getError

+ 12 - 10
include/core/code.h

@@ -20,25 +20,27 @@ enum af_BlockType {
     curly = '{',  // 大括号
 };
 
-/* 代码块创建函数 */
+/* 代码块 创建与释放 */
 AFUN_CORE_EXPORT af_Code *makeElementCode(char *var, char prefix, FileLine line, FilePath path);
 AFUN_CORE_EXPORT af_Code *makeBlockCode(enum af_BlockType type, af_Code *element, char prefix,
-        FileLine line, FilePath path, af_Code **next);
-
-/* 代码块释放函数 */
+                                        FileLine line, FilePath path, af_Code **next);
 AFUN_CORE_EXPORT void freeAllCode(af_Code *bt);
 
-/* 代码块操作函数 */
+/* 代码块 相关操作 */
 AFUN_CORE_EXPORT af_Code *pushCode(af_Code **base, af_Code *next);
 AFUN_CORE_EXPORT af_Code *copyCode(af_Code *base, FilePath *path);
+AFUN_CORE_EXPORT bool writeAllCode(af_Code *bt, FILE *file);
+AFUN_CORE_EXPORT bool readAllCode(af_Code **bt, FILE *file);
 
-/* 代码块属性获取函数 */
+/* 代码块 属性访问 */
 AFUN_CORE_EXPORT af_Code *getCodeNext(af_Code *bt);
 AFUN_CORE_EXPORT af_Code *getCodeElement(af_Code *bt);
 AFUN_CORE_EXPORT char *codeToStr(af_Code *code, int n);
-
-/* 代码块IO函数 */
-AFUN_CORE_EXPORT bool writeAllCode(af_Code *bt, FILE *file);
-AFUN_CORE_EXPORT bool readAllCode(af_Code **bt, FILE *file);
+AFUN_CORE_EXPORT enum af_CodeType getCodeType(af_Code *code);
+AFUN_CORE_EXPORT enum af_BlockType getCodeBlockType(af_Code *code);
+AFUN_CORE_EXPORT char getCodePrefix(af_Code *code);
+AFUN_CORE_EXPORT CodeInt getCodeEndCount(af_Code *code);
+AFUN_CORE_EXPORT char *getCodeElementData(af_Code *code);
+AFUN_CORE_EXPORT CodeInt getCodeElementCount(af_Code *code);
 
 #endif //AFUN_BYTECODE

+ 46 - 33
include/core/env.h

@@ -21,64 +21,77 @@ enum GcRunTime {
 #include "object.h"
 #include "var.h"
 
-/* 运行环境函数 */
+/* 运行环境 创建与释放 */
 AFUN_CORE_EXPORT af_Environment *makeEnvironment(enum GcRunTime grt);
-AFUN_CORE_EXPORT void enableEnvironment(af_Environment *env);
 AFUN_CORE_EXPORT void freeEnvironment(af_Environment *env);
 
-/* 前缀管理函数 */
-AFUN_CORE_EXPORT char getPrefix(size_t name, af_Environment *env);
-AFUN_CORE_EXPORT char setPrefix(size_t name, char prefix, af_Environment *env);
+/* 消息 创建与释放 */
+AFUN_CORE_EXPORT af_Message *makeMessage(char *type, size_t size);
+AFUN_CORE_EXPORT af_Message *freeMessage(af_Message *msg);
+AFUN_CORE_EXPORT bool freeMessageCount(size_t count, af_Message *msg);
+AFUN_CORE_EXPORT af_Message *makeNORMALMessage(af_Object *obj);
+AFUN_CORE_EXPORT af_Message *makeERRORMessage(char *type, char *error, af_Environment *env);
+AFUN_CORE_EXPORT af_Message *makeERRORMessageFormate(char *type, af_Environment *env, const char *formate, ...);
 
-/* 保护空间管理函数 */
-AFUN_CORE_EXPORT bool addVarToProtectVarSpace(af_Var *var, af_Environment *env);
-AFUN_CORE_EXPORT af_Object *getBaseObject(char *name, af_Environment *env);
-AFUN_CORE_EXPORT af_VarSpace *getProtectVarSpace(af_Environment *env);
+/* ErrorInfo 创建与释放 */
+AFUN_CORE_EXPORT af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line, FilePath path);
+AFUN_CORE_EXPORT void freeErrorInfo(af_ErrorInfo *ei);
 
-/* Core 退出与停止 */
+/* 运行环境 相关操作 */
+AFUN_CORE_EXPORT void enableEnvironment(af_Environment *env);
+AFUN_CORE_EXPORT void setGcMax(size_t max, af_Environment *env);
+AFUN_CORE_EXPORT void setGcRun(enum GcRunTime grt, af_Environment *env);
+AFUN_CORE_EXPORT char setPrefix(size_t name, char prefix, af_Environment *env);
+AFUN_CORE_EXPORT bool addVarToProtectVarSpace(af_Var *var, af_Environment *env);
 AFUN_CORE_EXPORT void setCoreStop(af_Environment *env);
 AFUN_CORE_EXPORT void setCoreExit(int exit_code, af_Environment *env);
 AFUN_CORE_EXPORT void setCoreNormal(af_Environment *env);
 
-/* 消息创建与释放函数 */
-AFUN_CORE_EXPORT af_Message *makeMessage(char *type, size_t size);
-AFUN_CORE_EXPORT af_Message *freeMessage(af_Message *msg);
-AFUN_CORE_EXPORT bool freeMessageCount(size_t count, af_Message *msg);
-
-/* 消息管理函数 */
+/* 消息 相关操作 */
 AFUN_CORE_EXPORT void pushMessageUp(af_Message *msg, af_Environment *env);
 AFUN_CORE_EXPORT void *popMessageUpData(char *type, af_Environment *env);
 AFUN_CORE_EXPORT af_Message *popMessageUp(af_Environment *env);
 AFUN_CORE_EXPORT void *getMessageData(af_Message *msg);
-
-/* 消息工具函数 */
-AFUN_CORE_EXPORT af_Message *makeNORMALMessage(af_Object *obj);
-AFUN_CORE_EXPORT af_Message *makeERRORMessage(char *type, char *error, af_Environment *env);
-AFUN_CORE_EXPORT af_Message *makeERRORMessageFormate(char *type, af_Environment *env, const char *formate, ...);
-
-/* 下行消息表管理函数 */
 AFUN_CORE_EXPORT void pushMessageDown(af_Message *msg, af_Environment *env);
 AFUN_CORE_EXPORT af_Message *popMessageDown(char *type, af_Environment *env);
 AFUN_CORE_EXPORT af_Message *getFirstMessage(af_Environment *env);
 
-/* 环境变量管理函数 */
+/* 环境变量 相关操作 */
 AFUN_CORE_EXPORT void setEnvVar(char *name, char *data, af_Environment *env);
-AFUN_CORE_EXPORT char *findEnvVar(char *name, af_Environment *env);
 
-/* 顶层消息处理器管理函数 */
+/* 顶层消息处理器 相关操作 */
 AFUN_CORE_EXPORT bool addTopMsgProcess(char *type, DLC_SYMBOL(TopMsgProcessFunc) func, af_Environment *env);
 
-/* LiteralRegex操作函数 */
+/* LiteralRegex 相关操作 */
 AFUN_CORE_EXPORT bool pushLiteralRegex(char *pattern, char *func, bool in_protect, af_Environment *env);
 
-/* ErrorInfo 创建与释放 */
-AFUN_CORE_EXPORT af_ErrorInfo *makeErrorInfo(char *type, char *error, char *note, FileLine line, FilePath path);
-AFUN_CORE_EXPORT void freeErrorInfo(af_ErrorInfo *ei);
-
-/* ErrorInfo 操作函数 */
+/* ErrorInfo 相关操作 */
 AFUN_CORE_EXPORT void fprintfErrorInfo(FILE *file, af_ErrorInfo *ei);
 
-/* ErrorBacktracking 操作函数 */
+/* ErrorBacktracking 相关操作 */
 AFUN_CORE_EXPORT void pushErrorBacktracking(FileLine line, FilePath file, char *note, af_ErrorInfo *ei);
 
+/* 环境变量 属性访问 */
+AFUN_CORE_EXPORT char *findEnvVar(char *name, af_Environment *env);
+
+/* 运行环境 属性访问 */
+AFUN_CORE_EXPORT char getPrefix(size_t name, af_Environment *env);
+AFUN_CORE_EXPORT af_Object *getBaseObject(char *name, af_Environment *env);
+AFUN_CORE_EXPORT af_VarSpace *getProtectVarSpace(af_Environment *env);
+AFUN_CORE_EXPORT size_t getGcCount(af_Environment *env);
+AFUN_CORE_EXPORT size_t getGcMax(af_Environment *env);
+AFUN_CORE_EXPORT enum GcRunTime getGcRun(af_Environment *env);
+AFUN_CORE_EXPORT af_Object *getCoreGlobal(af_Environment *env);
+AFUN_CORE_EXPORT af_Object *getGlobal(af_Environment *env);
+AFUN_CORE_EXPORT af_Object *getBelong(af_Environment *env);
+AFUN_CORE_EXPORT FilePath getActivityFile(af_Environment *env);
+AFUN_CORE_EXPORT FileLine getActivityLine(af_Environment *env);
+
+/* 消息 属性访问 */
+AFUN_CORE_EXPORT af_Object *getMsgNormalData(af_Message *msg);
+AFUN_CORE_EXPORT af_ErrorInfo *getMsgErrorInfo(af_Message *msg);
+
+/* ErrorInfo 属性访问 */
+AFUN_CORE_EXPORT char *getErrorType(af_ErrorInfo *ei);
+AFUN_CORE_EXPORT char *getError(af_ErrorInfo *ei);
 #endif //AFUN_ENV

+ 19 - 11
include/core/func.h

@@ -29,20 +29,10 @@ NEW_DLC_SYMBOL(callFuncBody, callFuncBody);
 AFUN_CORE_EXPORT af_ArgCodeList *makeArgCodeList(af_Code *code, size_t size, bool free_code, bool run_in_func);
 AFUN_CORE_EXPORT void freeAllArgCodeList(af_ArgCodeList *acl);
 
-/* af_ArgCodeList 操作函数 */
-AFUN_CORE_EXPORT af_ArgCodeList **pushArgCodeList(af_ArgCodeList **base, af_ArgCodeList *new);
-
-/* af_ArgCodeList 属性获取 */
-AFUN_CORE_EXPORT void *getArgCodeListData(af_ArgCodeList *acl);
-AFUN_CORE_EXPORT af_Object *getArgCodeListResult(af_ArgCodeList *acl);
-
 /* af_ArgList 创建与释放 */
 AFUN_CORE_EXPORT af_ArgList *makeArgList(char *name, af_Object *obj);
 AFUN_CORE_EXPORT void freeAllArgList(af_ArgList *al);
 
-/* af_ArgList 操作函数 */
-AFUN_CORE_EXPORT af_ArgList **pushArgList(af_ArgList **base, af_ArgList *new);
-
 /* FuncBody 创建与释放 */
 AFUN_CORE_EXPORT af_FuncBody *makeCodeFuncBody(af_Code *code, bool free_code, char **msg_type);
 AFUN_CORE_EXPORT af_FuncBody *makeImportFuncBody(af_Code *code, bool free_code, char **msg_type);
@@ -56,10 +46,28 @@ AFUN_CORE_EXPORT af_FuncInfo *makeFuncInfo(enum af_FuncInfoScope scope, enum af_
                                            bool is_macro, bool var_this, bool var_func);
 AFUN_CORE_EXPORT void freeFuncInfo(af_FuncInfo *fi);
 
-/* FuncInfo 操作函数 */
+/* af_ArgCodeList 相关操作 */
+AFUN_CORE_EXPORT af_ArgCodeList **pushArgCodeList(af_ArgCodeList **base, af_ArgCodeList *new);
+
+/* af_ArgList 相关操作 */
+AFUN_CORE_EXPORT af_ArgList **pushArgList(af_ArgList **base, af_ArgList *new);
+
+/* af_FuncBody 相关操作 */
+AFUN_CORE_EXPORT void pushFuncBody(af_FuncBody **base, af_FuncBody *body);
+
+/* FuncInfo 相关操作 */
 AFUN_CORE_EXPORT void makeCFuncBodyToFuncInfo(DLC_SYMBOL(callFuncBody) c_func, char **msg_type, af_FuncInfo *fi);
 AFUN_CORE_EXPORT void makeCodeFuncBodyToFuncInfo(af_Code *code, bool free_code, char **msg_type, af_FuncInfo *fi);
 AFUN_CORE_EXPORT void makeImportFuncBodyToFuncInfo(af_Code *code, bool free_code, char **msg_type, af_FuncInfo *fi);
 AFUN_CORE_EXPORT void makeDynamicFuncBodyToFuncInfo(af_FuncInfo *fi);
 
+/* af_ArgCodeList 属性获取 */
+AFUN_CORE_EXPORT void *getArgCodeListData(af_ArgCodeList *acl);
+AFUN_CORE_EXPORT af_Object *getArgCodeListResult(af_ArgCodeList *acl);
+af_ArgCodeList *getArgCodeListNext(af_ArgCodeList *acl);
+bool getArgCodeListRunInFunc(af_ArgCodeList *acl);
+
+/* af_ArgList 属性获取 */
+af_ArgList *getArgListNext(af_ArgList *al);
+
 #endif //AFUN_FUNC

+ 12 - 2
include/core/gc.h

@@ -4,6 +4,7 @@
 #include "object.h"
 #include "var.h"
 
+typedef uint32_t GcCount;
 typedef struct af_GcList af_GcList;
 enum af_GcListType {
     glt_obj = 1,
@@ -23,14 +24,19 @@ enum af_GcListType {
                                af_Var *: gc_delVarReference, \
                                af_VarSpace *: gc_delVarSpaceReference))(obj))
 
+#define gc_getReference(obj) ((_Generic((obj), \
+                               af_Object *: gc_getObjectReference, \
+                               af_Var *: gc_getVarReference, \
+                               af_VarSpace *: gc_getVarSpaceReference))(obj))
+
 /* GcList 创建与释放 */
 AFUN_CORE_EXPORT af_GcList *makeGcList(enum af_GcListType type, void *data);
 AFUN_CORE_EXPORT void freeAllGcList(af_GcList *gl);
 
-/* GcList 操作函数 */
+/* GcList 相关操作 */
 AFUN_CORE_EXPORT af_GcList *pushGcList(enum af_GcListType type, void *data, af_GcList *base);
 
-/* gc Reference 管理函数 */
+/* gc Reference 相关操作 */
 AFUN_CORE_EXPORT void gc_addObjectReference(af_Object *obj);
 AFUN_CORE_EXPORT void gc_addVarReference(af_Var *obj);
 AFUN_CORE_EXPORT void gc_addVarSpaceReference(af_VarSpace *obj);
@@ -38,4 +44,8 @@ AFUN_CORE_EXPORT void gc_delObjectReference(af_Object *obj);
 AFUN_CORE_EXPORT void gc_delVarReference(af_Var *obj);
 AFUN_CORE_EXPORT void gc_delVarSpaceReference(af_VarSpace *obj);
 
+/* gc Reference 属性访问 */
+AFUN_CORE_EXPORT GcCount gc_getObjectReference(af_Object *obj);
+AFUN_CORE_EXPORT GcCount gc_getVarReference(af_Var *obj);
+AFUN_CORE_EXPORT GcCount gc_getVarSpaceReference(af_VarSpace *obj);
 #endif //AFUN_GC

+ 34 - 20
include/core/object.h

@@ -3,6 +3,7 @@
 #include "aFunCoreExport.h"
 #include "tool.h"
 
+typedef uint32_t ObjAPIUint;
 typedef struct af_Object af_Object;
 typedef struct af_Inherit af_Inherit;
 typedef struct af_ObjectAPI af_ObjectAPI;
@@ -13,35 +14,48 @@ DEFINE_DLC_SYMBOL(objectAPIFunc);
 
 #include "obj_api.h"
 #include "env.h"
+#include "var.h"
 
-/* 对象创建与释放函数 */
+/* 对象创建 */
 AFUN_CORE_EXPORT af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *belong,
-                      af_Inherit *inherit, af_Environment *env);
+                                       af_Inherit *inherit, af_Environment *env);
 
-/* 对象属性获取函数 */
-AFUN_CORE_EXPORT void *getObjectData(af_Object *obj);
-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 bool setObjectAttributes(char *name, char p_self, char p_posterity, char p_external, af_Object *attributes,
-                         af_Object *obj, af_Object *visitor, af_Environment *env);
+/* API表 创建与释放 */
+AFUN_CORE_EXPORT af_ObjectAPI *makeObjectAPI(void);
+AFUN_CORE_EXPORT void freeObjectAPI(af_ObjectAPI *api);
 
-/* 对象继承关系函数 */
+/* 对象继承表 创建与释放 */
 AFUN_CORE_EXPORT af_Inherit *makeInherit(af_Object *obj);
 AFUN_CORE_EXPORT void freeAllInherit(af_Inherit *ih);
 
-AFUN_CORE_EXPORT bool checkPosterity(af_Object *base, af_Object *posterity);
-
-/* API表 创建与释放 */
-AFUN_CORE_EXPORT af_ObjectAPI *makeObjectAPI(void);
-AFUN_CORE_EXPORT void freeObjectAPI(af_ObjectAPI *api);
+/* 对象 相关操作 */
+AFUN_CORE_EXPORT bool setObjectAttributes(char *name, char p_self, char p_posterity, char p_external, af_Object *attributes,
+                                          af_Object *obj, af_Object *visitor, af_Environment *env);
+AFUN_CORE_EXPORT void objectSetAllowInherit(af_Object *obj, bool allow);
 
-/* API表 管理函数 */
+/* API表 相关操作 */
 AFUN_CORE_EXPORT int addAPI(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_ObjectAPI *api);
-AFUN_CORE_EXPORT void *findAPI(char *api_name, af_ObjectAPI *api);
-
-/* 对象API函数 */
 AFUN_CORE_EXPORT int addAPIToObject(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_Object *obj);
+
+/* 对象继承表 相关操作 */
+AFUN_CORE_EXPORT af_Inherit *pushInherit(af_Inherit **base, af_Inherit *new);
+
+/* 对象 属性访问 */
+AFUN_CORE_EXPORT void *getObjectData(af_Object *obj);
+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 char *getObjectID(af_Object *obj);
+AFUN_CORE_EXPORT af_ObjectAPI *getObjectAPI(af_Object *obj);
+AFUN_CORE_EXPORT af_Inherit *getObjectInherit(af_Object *obj);
+
+/* API表 属性访问 */
+AFUN_CORE_EXPORT void *findAPI(char *api_name, af_ObjectAPI *api);
 AFUN_CORE_EXPORT void *findObjectAPI(char *api_name, af_Object *obj);
+AFUN_CORE_EXPORT ObjAPIUint getAPICount(af_ObjectAPI *api);
+
+/* 对象继承表 属性访问 */
+AFUN_CORE_EXPORT bool checkPosterity(af_Object *base, af_Object *posterity);
+AFUN_CORE_EXPORT af_Inherit *getInheritNext(af_Inherit *ih);
+AFUN_CORE_EXPORT af_Object *getInheritObject(af_Inherit *ih);
+AFUN_CORE_EXPORT af_VarSpace *getInheritVarSpace(af_Inherit *ih);
 #endif //AFUN_OBJECT

+ 2 - 1
include/core/parser.h

@@ -14,8 +14,9 @@ AFUN_CORE_EXPORT af_Parser *makeParser(DLC_SYMBOL(readerFunc) read_func, DLC_SYM
 AFUN_CORE_EXPORT void freeParser(af_Parser *parser);
 AFUN_CORE_EXPORT af_Parser *makeParserByString(char *str, bool free_str, FILE *error);
 AFUN_CORE_EXPORT af_Parser *makeParserByFile(FilePath path, FILE *error);
+AFUN_CORE_EXPORT af_Parser *makeParserByStdin(FILE *error);
 
-/* Parser 操作函数 */
+/* Parser 相关操作 */
 AFUN_CORE_EXPORT af_Code *parserCode(af_Parser *parser);
 AFUN_CORE_EXPORT void initParser(af_Parser *parser);
 

+ 1 - 2
include/core/run.h

@@ -3,7 +3,6 @@
 #include "aFunCoreExport.h"
 #include "tool.h"
 #include "code.h"
-
-/* 代码运行工具 */
+/* 代码运行 相关操作 */
 AFUN_CORE_EXPORT bool iterCode(af_Code *code, af_Environment *env);
 #endif //AFUN_RUN_H

+ 27 - 24
include/core/var.h

@@ -9,46 +9,49 @@ typedef struct af_VarSpaceListNode af_VarSpaceListNode;
 #include "tool.h"
 #include "object.h"
 
-/* 变量创建与释放 */
+/* 变量 创建 */
 AFUN_CORE_EXPORT af_Var *makeVar(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env);
 
-/* 变量值管理 */
-AFUN_CORE_EXPORT void addVarNode(af_Var var, af_Object *obj, char *id);
-
-/* 变量空间创建与释放 */
+/* 变量空间 创建 */
 AFUN_CORE_EXPORT af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char p_external, af_Environment *env);
 
-/* 变量定义函数 */
+/* 变量空间链 创建与释放 */
+AFUN_CORE_EXPORT af_VarSpaceListNode *makeVarSpaceList(af_VarSpace *vs);
+AFUN_CORE_EXPORT void freeAllVarSpaceList(af_VarSpaceListNode *vsl);
+AFUN_CORE_EXPORT bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *vsl);
+
+/* 变量 相关操作 */
+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 makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
                                         af_Object *visitor, af_Environment *env);
+AFUN_CORE_EXPORT bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
+AFUN_CORE_EXPORT bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpace *vs);
+AFUN_CORE_EXPORT void setVarPermison(af_Var *var, af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external);
+AFUN_CORE_EXPORT void setVarSpacePermison(af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external);
+AFUN_CORE_EXPORT bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, char protect);
+
+/* 变量空间链 相关操作 */
 AFUN_CORE_EXPORT bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl);
 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);
 AFUN_CORE_EXPORT bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
                                                af_Environment *env);
-
-/* 变量删除函数 */
-AFUN_CORE_EXPORT bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
 AFUN_CORE_EXPORT bool delVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
-
-/* 变量访问函数 */
-AFUN_CORE_EXPORT af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
-AFUN_CORE_EXPORT af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
-
-/* 变量设置函数 */
-AFUN_CORE_EXPORT bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpace *vs);
 AFUN_CORE_EXPORT bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpaceListNode *vsl);
+AFUN_CORE_EXPORT af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env);
 
-/* 变量空间链的创建与释放 */
-AFUN_CORE_EXPORT af_VarSpaceListNode *makeVarSpaceList(af_VarSpace *vs);
-AFUN_CORE_EXPORT void freeAllVarSpaceList(af_VarSpaceListNode *vsl);
-AFUN_CORE_EXPORT bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *vsl);
+/* 变量 属性访问 */
+AFUN_CORE_EXPORT af_Object *findVarNode(af_Var *var, char *id);
 
-/* 变量空间链属性获取 */
-AFUN_CORE_EXPORT af_VarSpace *getVarSpaceFromList(af_VarSpaceListNode *vsl);
+/* 变量空间 属性访问 */
+AFUN_CORE_EXPORT af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
+AFUN_CORE_EXPORT bool isProtectVarSpace(af_VarSpace *vs);
 
-/* 变量空间链管理 */
-AFUN_CORE_EXPORT af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env);
+/* 变量空间链 属性访问 */
+AFUN_CORE_EXPORT af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
+AFUN_CORE_EXPORT af_VarSpace *getVarSpaceFromList(af_VarSpaceListNode *vsl);
 
 #endif //AFUN_VAR

+ 2 - 1
src/core/CMakeLists.txt

@@ -45,7 +45,8 @@ foreach(tgt core-shared-t core-shared-s core-static-s)
                                $<BUILD_INTERFACE:${build_include_core}/info>
                                $<INSTALL_INTERFACE:${install_include_core}>)
     set_target_properties(${tgt} PROPERTIES
-                          PUBLIC_HEADER "${public_h_build}")
+                          PUBLIC_HEADER "${public_h_build}"
+                          PRIVATE_HEADER "${private_h}")  # PRIVATE_HEADER私有头文件, 可以用于高级开发
 endforeach()
 
 set_target_properties(core-shared-t PROPERTIES OUTPUT_NAME "aFunCore-t")

+ 2 - 2
src/core/__env.h

@@ -227,14 +227,14 @@ AFUN_CORE_NO_EXPORT void setActivityBtNext(af_Code *bt_next, af_Activity *activi
 /* LiteralData 释放函数 */
 AFUN_CORE_NO_EXPORT void freeAllLiteralData(af_LiteralDataList *ld);
 
-/* LiteralData 操作函数 */
+/* LiteralData 相关操作 */
 AFUN_CORE_NO_EXPORT void pushLiteralData(char *data, af_Environment *env);
 AFUN_CORE_NO_EXPORT bool checkLiteralCode(char *literal, char **func, bool *in_protect, af_Environment *env);
 
 /* 顶层消息处理器 处理函数 */
 AFUN_CORE_NO_EXPORT void runTopMessageProcess(bool is_gc, af_Environment *env);
 
-/* 消息创建与释放函数 */
+/* 消息 创建与释放 */
 AFUN_CORE_NO_EXPORT void freeAllMessage(af_Message *msg);
 
 /* 消息管理函数 */

+ 2 - 2
src/core/__func.h

@@ -57,10 +57,10 @@ struct af_FuncInfo {
     struct af_FuncBody *body;
 };
 
-/* FuncInfo 操作函数 */
+/* FuncInfo 相关操作 */
 AFUN_CORE_NO_EXPORT bool pushDynamicFuncBody(af_FuncBody *new, af_FuncBody *body);
 
-/* ArgList 操作函数 */
+/* ArgList 相关操作 */
 AFUN_CORE_NO_EXPORT bool runArgList(af_ArgList *al, af_VarSpaceListNode *vsl, af_Environment *env);
 
 #endif //AFUN_FUNC_H_

+ 9 - 0
src/core/__gc.h

@@ -77,8 +77,10 @@ struct gc_DestructList {
 };
 
 /* 重新定义包括af_ObjectData的 gc Reference 函数 */
+#ifdef core_shared_t_EXPORTS
 #undef gc_addReference
 #undef gc_delReference
+#undef gc_getReference
 #define gc_addReference(obj) ((_Generic((obj), \
                                af_ObjectData *: gc_addObjectDataReference, \
                                af_Object *: gc_addObjectReference, \
@@ -91,6 +93,12 @@ struct gc_DestructList {
                                af_Var *: gc_delVarReference, \
                                af_VarSpace *: gc_delVarSpaceReference))(obj))
 
+#define gc_getReference(obj) ((_Generic((obj), \
+                               af_ObjectData *: gc_getObjectDataReference, \
+                               af_Object *: gc_getObjectReference, \
+                               af_Var *: gc_getVarReference, \
+                               af_VarSpace *: gc_getVarSpaceReference))(obj))
+#endif
 /* gc 对象新增函数 */
 AFUN_CORE_NO_EXPORT void gc_addObject(af_Object *obj, af_Environment *env);
 AFUN_CORE_NO_EXPORT void gc_addVar(af_Var *obj, af_Environment *env);
@@ -104,6 +112,7 @@ AFUN_CORE_NO_EXPORT void gc_addVarSpaceByCore(struct af_VarSpace *obj, af_Core *
 /* gc Reference 管理函数 : 涉及af_ObjectData 不对外公开 */
 AFUN_CORE_NO_EXPORT void gc_addObjectDataReference(af_ObjectData *obj);
 AFUN_CORE_NO_EXPORT void gc_delObjectDataReference(af_ObjectData *obj);
+AFUN_CORE_NO_EXPORT GcCount gc_getObjectDataReference(af_ObjectData *obj);
 
 /* gc 操控函数 : gc的启动由解释器完全管理 */
 AFUN_CORE_NO_EXPORT void gc_RunGC(af_Environment *env);

+ 3 - 3
src/core/__object.h

@@ -26,7 +26,7 @@ struct af_ObjectAPINode {
 };
 
 struct af_ObjectAPI {
-    uint32_t count;  // api个数记录
+    ObjAPIUint count;  // api个数记录
     struct af_ObjectAPINode *(node[API_HASHTABLE_SIZE]);
 };
 
@@ -59,10 +59,10 @@ struct af_Inherit {
     struct af_Inherit *next;
 };
 
-/* 对象创建与释放函数 */
+/* 对象 创建与释放 */
 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);
 
 /* ObjectData 释放函数 */

+ 1 - 1
src/core/__parser.h

@@ -60,7 +60,7 @@ struct af_Syntactic {
     char *text;
 };
 
-/* Parser 操作函数 */
+/* Parser 相关操作 */
 AFUN_CORE_EXPORT af_TokenType getTokenFromLexical(char **text, af_Parser *parser);
 
 #endif //AFUN_PARSER_H_

+ 31 - 1
src/core/code.c

@@ -13,7 +13,7 @@
 static af_Code *makeCode(char prefix, FileLine line, FilePath path);
 static af_Code *freeCode(af_Code *bt);
 
-/* Code 操作函数 */
+/* Code 相关操作 */
 static bool countElement(af_Code *element, CodeInt *elements, af_Code **next);
 
 /* Code IO函数 */
@@ -416,4 +416,34 @@ void printCode(af_Code *bt) {
                 break;
         }
     }
+}
+
+enum af_CodeType getCodeType(af_Code *code) {
+    return code->type;
+}
+
+enum af_BlockType getCodeBlockType(af_Code *code) {
+    if (code->type != code_block)
+        return '(';
+    return code->block.type;
+}
+
+char getCodePrefix(af_Code *code) {
+    return code->prefix;
+}
+
+CodeInt getCodeEndCount(af_Code *code) {
+    return code->code_end;
+}
+
+char *getCodeElementData(af_Code *code) {
+    if (code->type != code_element)
+        return NULL;
+    return code->element.data;
+}
+
+CodeInt getCodeElementCount(af_Code *code) {
+    if (code->type != code_block)
+        return -1;
+    return code->block.elements;
 }

+ 74 - 0
src/core/env.c

@@ -1299,3 +1299,77 @@ static char *getActivityInfoToBacktracking(af_Activity *activity, bool print_bt_
 
     return info;
 }
+
+void setGcMax(size_t max, af_Environment *env) {
+    env->core->gc_count_max = max;
+}
+
+void setGcRun(enum GcRunTime grt, af_Environment *env) {
+    env->core->gc_run = grt;
+}
+
+size_t getGcCount(af_Environment *env) {
+    return env->core->gc_count_max;
+}
+
+size_t getGcMax(af_Environment *env) {
+    return env->core->gc_count;
+}
+
+enum GcRunTime getGcRun(af_Environment *env) {
+    return env->core->gc_run;
+}
+
+af_Object *getCoreGlobal(af_Environment *env) {
+    return env->core->global;
+}
+
+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)
+            return activity->belong;
+    }
+    return env->core->global;
+}
+
+af_Object *getBelong(af_Environment *env) {
+    if (env == NULL || env->activity == NULL)
+        return NULL;
+    return env->activity->belong;
+}
+
+FilePath getActivityFile(af_Environment *env){
+    if (env == NULL || env->activity == NULL)
+        return NULL;
+    return env->activity->file;
+}
+
+FileLine getActivityLine(af_Environment *env){
+    if (env == NULL || env->activity == NULL)
+        return 0;
+    return env->activity->line;
+}
+
+af_Object *getMsgNormalData(af_Message *msg) {
+    if (!EQ_STR("NORMAL", msg->type))
+        return NULL;
+    af_Object *obj = *(af_Object **)msg->msg;
+    gc_delReference(obj);
+    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;
+}
+
+char *getErrorType(af_ErrorInfo *ei) {
+    return ei->error_type;
+}
+
+char *getError(af_ErrorInfo *ei) {
+    return ei->error;
+}

+ 13 - 4
src/core/func.c

@@ -6,9 +6,6 @@ static af_FuncBody *makeFuncBody(enum af_FuncBodyType type, char **msg_type);
 /* msg_type 释放 */
 static void freeMsgType(char **msg_type);
 
-/* FuncBody 操作函数 */
-static void pushFuncBody(af_FuncBody **base, af_FuncBody *body);
-
 af_ArgCodeList *makeArgCodeList(af_Code *code, size_t size, bool free_code, bool run_in_func) {
     af_ArgCodeList *acl = calloc(1, sizeof(af_ArgCodeList));
     acl->info = calloc(1, size);
@@ -150,7 +147,7 @@ void freeAllFuncBody(af_FuncBody *fb) {
         fb = freeFuncBody(fb);
 }
 
-static void pushFuncBody(af_FuncBody **base, af_FuncBody *body) {
+void pushFuncBody(af_FuncBody **base, af_FuncBody *body) {
     while (*base != NULL)
         base = &((*base)->next);
     *base = body;
@@ -205,3 +202,15 @@ bool pushDynamicFuncBody(af_FuncBody *new, af_FuncBody *body) {
 
     return true;
 }
+
+af_ArgCodeList *getArgCodeListNext(af_ArgCodeList *acl) {
+    return acl->next;
+}
+
+af_ArgList *getArgListNext(af_ArgList *al) {
+    return al->next;
+}
+
+bool getArgCodeListRunInFunc(af_ArgCodeList *acl) {
+    return acl->run_in_func;
+}

+ 7 - 4
src/core/gc.c

@@ -25,6 +25,9 @@ void gc_add##type##Reference(af_##type *obj) { \
 } \
 void gc_del##type##Reference(af_##type *obj) { \
     obj->gc.info.reference--; \
+} \
+GcCount gc_get##type##Reference(af_##type *obj) { \
+    return obj->gc.info.reference; \
 }
 
 GC_FUNC_DEFINED(ObjectData)
@@ -35,11 +38,11 @@ GC_FUNC_DEFINED(VarSpace)
 #undef GC_FUNC_DEFINED
 
 /* gc_DestructList 函数 */
-/* gc_DestructList 创建与释放函数 */
+/* gc_DestructList 创建与释放 */
 static gc_DestructList *makeDestructList(af_ObjectData *od, af_Object *func);
 static gc_DestructList *freeDestructList(gc_DestructList *dl);
 
-/* gc_DestructList 操作函数 */
+/* gc_DestructList 相关操作 */
 static pgc_DestructList pushDestructList(af_ObjectData *od, af_Object *func, pgc_DestructList pdl);
 
 static gc_DestructList *makeDestructList(af_ObjectData *od, af_Object *func) {
@@ -70,7 +73,7 @@ static pgc_DestructList pushDestructList(af_ObjectData *od, af_Object *func, pgc
 }
 
 /* gcList 函数 */
-/* gcList 创建与释放函数 */
+/* gcList 创建与释放 */
 static af_GcList *freeGcList(af_GcList *gl);
 
 af_GcList *makeGcList(enum af_GcListType type, void *data) {
@@ -98,7 +101,7 @@ af_GcList *pushGcList(enum af_GcListType type, void *data, af_GcList *base) {
 }
 
 /* 分析记录器函数 */
-/* 分析记录器创建与释放函数 */
+/* 分析记录器 创建与释放 */
 static pgc_Analyzed makeAnalyzed(struct af_Object *obj, pgc_Analyzed plist);
 static gc_Analyzed *freeAnalyzed(gc_Analyzed *base);
 static void freeAllAnalyzed(gc_Analyzed *base);

+ 41 - 0
src/core/object.c

@@ -151,6 +151,15 @@ af_Inherit *makeInherit(af_Object *obj) {
     return ih;
 }
 
+af_Inherit *pushInherit(af_Inherit **base, af_Inherit *new) {
+    while ((*base) != NULL)
+        base = &((*base)->next);
+    *base = new;
+    while (new != NULL && new->next != NULL)
+        new = new->next;
+    return new;
+}
+
 static af_Inherit *freeInherit(af_Inherit *ih) {
     af_Inherit *next = ih->next;  // vs一定是被gc托管的
     free(ih);
@@ -319,3 +328,35 @@ af_Object *findObjectAttributesByObjectData(char *name, af_Object *visitor, af_O
 
     return NULL;
 }
+
+char *getObjectID(af_Object *obj) {
+    return obj->data->id;
+}
+
+af_ObjectAPI *getObjectAPI(af_Object *obj) {
+    return obj->data->api;
+}
+
+af_Inherit *getObjectInherit(af_Object *obj) {
+    return obj->data->inherit;
+}
+
+af_Inherit *getInheritNext(af_Inherit *ih) {
+    return ih->next;
+}
+
+af_Object *getInheritObject(af_Inherit *ih) {
+    return ih->obj;
+}
+
+af_VarSpace *getInheritVarSpace(af_Inherit *ih) {
+    return ih->vs;
+}
+
+ObjAPIUint getAPICount(af_ObjectAPI *api) {
+    return api->count;
+}
+
+void objectSetAllowInherit(af_Object *obj, bool allow) {
+    obj->data->allow_inherit = allow;
+}

+ 20 - 0
src/core/parser.c

@@ -119,4 +119,24 @@ af_Parser *makeParserByFile(FilePath path, FILE *error) {
     FREE_SYMBOL(read_func);
     FREE_SYMBOL(destruct);
     return parser;
+}
+
+static size_t readFuncStdin(struct readerDataFile *data, char *dest, size_t len) {
+    if (fgets(dest, (int)(len + 1), stdin) == NULL)
+        return 0;
+    return strlen(dest);
+}
+
+static void destructStdin(struct readerDataFile *data) {
+    // 什么都不用做
+}
+
+af_Parser *makeParserByStdin(FILE *error) {
+    DLC_SYMBOL(readerFunc) read_func = MAKE_SYMBOL(readFuncStdin, readerFunc);
+    DLC_SYMBOL(destructReaderFunc) destruct = MAKE_SYMBOL(destructStdin, destructReaderFunc);
+    af_Parser *parser = makeParser(read_func, destruct, sizeof(struct readerDataString), error);
+    initParser(parser);
+    FREE_SYMBOL(read_func);
+    FREE_SYMBOL(destruct);
+    return parser;
 }

+ 54 - 4
src/core/var.c

@@ -1,5 +1,4 @@
 #include "__var.h"
-#include "__env.h"
 #include "tool.h"
 
 /* VarNode 创建与释放 */
@@ -7,6 +6,9 @@ static af_VarNode *makeVarNode(af_Object *obj, char *id);
 static af_VarNode *freeVarNode(af_VarNode *vn);
 static void freeAllVarNode(af_VarNode *vn);
 
+/* VarNode 相关操作 */
+static af_VarNode *findVarNode_(af_Var *var, char *id);
+
 /* VarCup 创建与释放 */
 static af_VarCup *makeVarCup(af_Var *var);
 static af_VarCup *freeVarCup(af_VarCup *vp);
@@ -77,10 +79,30 @@ void freeVarByCore(af_Var *var, af_Core *core) {
     free(var);
 }
 
-void addVarNode(af_Var var, af_Object *obj, char *id) {
+static af_VarNode *findVarNode_(af_Var *var, char *id) {
+    af_VarNode *vn = var->vn->next;
+
+    if (id == NULL)
+        return var->vn;
+
+    for (NULL; vn != NULL; vn = vn->next) {
+        if (EQ_STR(vn->id, id))
+            return vn;
+    }
+    return NULL;
+}
+
+void addVarNode(af_Var *var, af_Object *obj, char *id) {
     af_VarNode *vn = makeVarNode(obj, id);
-    vn->next = var.vn->next;  // 第一个 vn 必须表示返回值
-    var.vn->next = vn;
+    vn->next = var->vn->next;  // 第一个 vn 必须表示返回值
+    var->vn->next = vn;
+}
+
+af_Object *findVarNode(af_Var *var, char *id) {
+    af_VarNode *vn = findVarNode_(var, id);
+    if (vn != NULL)
+        return vn->obj;
+    return NULL;
 }
 
 static af_VarCup *makeVarCup(af_Var *var) {
@@ -422,3 +444,31 @@ af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base
     new->next = base;
     return new;
 }
+
+void setVarPermison(af_Var *var, af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external) {
+    if (vs->belong->data != visitor->data)
+        return;
+    var->permissions[0] = p_self;
+    var->permissions[1] = p_posterity;
+    var->permissions[2] = p_external;
+}
+
+void setVarSpacePermison(af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external) {
+    if (vs->belong->data != visitor->data)
+        return;
+    vs->permissions[0] = p_self;
+    vs->permissions[1] = p_posterity;
+    vs->permissions[2] = p_external;
+}
+
+bool isProtectVarSpace(af_VarSpace *vs) {
+    return vs->is_protect;
+}
+
+bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, char protect) {
+    bool re = vs->is_protect;
+    if (vs->belong->data != visitor->data)
+        return re;
+    vs->is_protect = protect;
+    return re;
+}