Ver código fonte

fix: 修复了gc Reference宏无法在外部使用的问题

SongZihuan 3 anos atrás
pai
commit
9afcc5182c
4 arquivos alterados com 50 adições e 10 exclusões
  1. 17 2
      include/gc.h
  2. 19 0
      src/core/__gc.h
  3. 12 6
      src/core/gc.c
  4. 2 2
      src/main.c

+ 17 - 2
include/gc.h

@@ -4,14 +4,29 @@
 #include "var.h"
 
 /* gc 引用计数管理函数 */
-#define gc_addReference(obj) ((obj)->gc.info.reference++)
-#define gc_delReference(obj) ((obj)->gc.info.reference--)
+#define gc_addReference(obj) ((_Generic((obj), \
+                               af_Object *:gc_addObjectReference, \
+                               af_Var *: gc_addVarReference, \
+                               af_VarSpace *: gc_addVarSpaceReference))(obj))
+
+#define gc_delReference(obj) ((_Generic((obj), \
+                               af_Object *: gc_delObjectReference, \
+                               af_Var *: gc_delVarReference, \
+                               af_VarSpace *: gc_delVarSpaceReference))(obj))
 
 /* gc 对象新增函数 */
 void gc_addObject(af_Object *obj, af_Environment *env);
 void gc_addVar(af_Var *obj, af_Environment *env);
 void gc_addVarSpace(af_VarSpace *obj, af_Environment *env);
 
+/* gc Reference 管理函数 */
+void gc_addObjectReference(af_Object *obj);
+void gc_addVarReference(af_Var *obj);
+void gc_addVarSpaceReference(af_VarSpace *obj);
+void gc_delObjectReference(af_Object *obj);
+void gc_delVarReference(af_Var *obj);
+void gc_delVarSpaceReference(af_VarSpace *obj);
+
 /* gc 运行时函数 */
 bool resetGC(af_Environment *env);
 

+ 19 - 0
src/core/__gc.h

@@ -48,9 +48,28 @@ struct GC_VarSpace {
 #include "__env.h"  // 这部分内容依赖上面的定义
 #include "gc.h"
 
+/* 重新定义包括af_ObjectData的 gc Reference 函数 */
+#undef gc_addReference
+#undef gc_delReference
+#define gc_addReference(obj) ((_Generic((obj), \
+                               af_ObjectData *: gc_addObjectDataReference, \
+                               af_Object *: gc_addObjectReference, \
+                               af_Var *: gc_addVarReference, \
+                               af_VarSpace *: gc_addVarSpaceReference))(obj))
+
+#define gc_delReference(obj) ((_Generic((obj), \
+                               af_ObjectData *: gc_delObjectDataReference, \
+                               af_Object *: gc_delObjectReference, \
+                               af_Var *: gc_delVarReference, \
+                               af_VarSpace *: gc_delVarSpaceReference))(obj))
+
 /* gc 对象新增函数 : 涉及af_ObjectData 不对外公开 */
 void gc_addObjectData(struct af_ObjectData *obj, af_Environment *env);
 
+/* gc Reference 管理函数 : 涉及af_ObjectData 不对外公开 */
+void gc_addObjectDataReference(af_ObjectData *obj);
+void gc_delObjectDataReference(af_ObjectData *obj);
+
 /* gc 对象新增函数 : 涉及af_Core不对外公开 */
 void gc_addObjectDataByCore(struct af_ObjectData *obj, af_Core *core);
 void gc_addObjectByCore(struct af_Object *obj, af_Core *core);

+ 12 - 6
src/core/gc.c

@@ -237,7 +237,7 @@ static void freeValue(af_Core *core) {
     }
 }
 
-#define GC_ADD_FUNC_DEFINED(type) \
+#define GC_FUNC_DEFINED(type) \
 void gc_add##type(af_##type *obj, af_Environment *env) { \
     obj->gc.prev = NULL; \
     if (env->core->gc_##type != NULL) { \
@@ -250,14 +250,20 @@ void gc_add##type##ByCore(af_##type *obj, af_Core *core) { \
 obj->gc.prev = NULL; \
 obj->gc.next = core->gc_##type; \
 core->gc_##type = obj; \
+} \
+void gc_add##type##Reference(af_##type *obj) { \
+    obj->gc.info.reference++; \
+} \
+void gc_del##type##Reference(af_##type *obj) { \
+    obj->gc.info.reference--; \
 }
 
-GC_ADD_FUNC_DEFINED(ObjectData)
-GC_ADD_FUNC_DEFINED(Object)
-GC_ADD_FUNC_DEFINED(Var)
-GC_ADD_FUNC_DEFINED(VarSpace)
+GC_FUNC_DEFINED(ObjectData)
+GC_FUNC_DEFINED(Object)
+GC_FUNC_DEFINED(Var)
+GC_FUNC_DEFINED(VarSpace)
 
-#undef GC_ADD_FUNC_DEFINED
+#undef GC_FUNC_DEFINED
 
 bool gc_RunGC(af_Environment *env) {
     gc_Analyzed *analyzed;

+ 2 - 2
src/main.c

@@ -46,7 +46,8 @@ void testFunc(int *mark, af_Environment *env) {  // 测试用函数
 
     af_Object *obj = makeObject("Literal", true, makeObjectAPI(), true, NULL, NULL, env);
     af_Message *msg = makeMessage("NORMAL", sizeof(af_Object *));
-    *((af_Object **)(getMessageData(msg))) = obj;  // TODO-szh 没有gc
+    *((af_Object **)(getMessageData(msg))) = obj;
+    gc_addReference(obj);
     pushMessageDown(msg, env);
 }
 
@@ -170,7 +171,6 @@ int main() {
         af_Code *bt2 = makeVariableCode("func", 0, 1, NULL);
         connectCode(&bt1, bt2);
 
-        af_Code *bt3 = makeVariableCode("global", 0, 1, NULL);
         af_Code *bt5 = makeBlockCode(parentheses, NULL, 0, 1, NULL, NULL);
         connectCode(&bt2, bt5);