Browse Source

feat: ObjectData新增free_inherit字段

SongZihuan 3 years ago
parent
commit
82e758274a
7 changed files with 47 additions and 36 deletions
  1. 3 2
      include/core/object.h
  2. 3 1
      src/core/__object.h
  3. 1 1
      src/core/global_obj.c
  4. 16 8
      src/core/object.c
  5. 1 1
      src/runtime/base/str_obj.c
  6. 1 1
      src/runtime/runtime.c
  7. 22 22
      test/src/run_code.c

+ 3 - 2
include/core/object.h

@@ -16,8 +16,9 @@ DEFINE_DLC_SYMBOL(objectAPIFunc);
 #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);
+AFUN_CORE_EXPORT af_Object * makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit,
+                                        af_Object *belong, bool free_inherit, af_Inherit *inherit,
+                                        af_Environment *env);
 
 /* API表 创建与释放 */
 AFUN_CORE_EXPORT af_ObjectAPI *makeObjectAPI(void);

+ 3 - 1
src/core/__object.h

@@ -43,8 +43,10 @@ struct af_ObjectData {
     bool allow_inherit;  // 是否允许被继承
     bool free_api;  // 是否释放api
 
-    struct af_VarSpace *var_space;
     struct af_Inherit *inherit;  // 只有顶级继承对象的inherit属性可为NULL
+    bool free_inherit;  // 是否释放inherit
+
+    struct af_VarSpace *var_space;
 
     struct af_Object *base;  // 在gc机制中, 当对想要被释放前, 调用析构函数是对象以该base的身份出现
     pthread_rwlock_t lock;

+ 1 - 1
src/core/global_obj.c

@@ -72,5 +72,5 @@ af_Object *makeGlobalObject(af_Environment *env) {
     FREE_SYMBOL(get_share_vs);
     FREE_SYMBOL(get_gl);
 
-    return makeObject(global_id, true, api, true, NULL, NULL, env);
+    return makeObject(global_id, true, api, true, NULL, true, NULL, env);
 }

+ 16 - 8
src/core/object.c

@@ -31,6 +31,7 @@ static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI
 
     od->api = api;
     od->free_api = free_api;
+
     od->allow_inherit = allow_inherit;
 
     od->var_space = makeVarSpace(base_obj, 3, 2, 0, env);
@@ -69,17 +70,22 @@ static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, boo
  * 若处于初始化模式, 则belong, inherit等可以设置为NULL, 由后期统一填上
  */
 af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *belong,
-                      af_Inherit *inherit, af_Environment *env) {
-    if (api == NULL)
-        return NULL;
+                      bool free_inherit, af_Inherit *inherit, af_Environment *env){
+    if (api == NULL) {
+        api = makeObjectAPI();
+        free_api = true;
+    }
 
     af_Inherit *ih = NULL;
     if (inherit != NULL)
         ih = inherit;
-    else if (env->global != NULL)  // init模式生成: global
-        ih = makeInherit(env->global);
-    else if (env->status != core_creat)
-        return NULL;
+    else {
+        free_inherit = true;
+        if (env->global != NULL)
+            ih = makeInherit(env->global);
+        else if (env->status != core_creat)
+            return NULL;
+    }
 
     if (belong == NULL) {
         if (env->activity != NULL)
@@ -94,6 +100,7 @@ af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inh
 
     obj->belong = belong;
     obj->data->inherit = ih;
+    obj->data->free_inherit = free_inherit;
     return obj;
 }
 
@@ -132,7 +139,8 @@ void freeObjectData(af_ObjectData *od, af_Environment *env) {
     free(od->data);
     if (od->free_api)
         freeObjectAPI(od->api);
-    freeAllInherit(od->inherit);
+    if (od->free_inherit)
+        freeAllInherit(od->inherit);
     GC_FREE_EXCHANGE(od, ObjectData, env);
     pthread_rwlock_destroy(&od->lock);
     free(od);

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

@@ -70,7 +70,7 @@ static bool strFuncVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl,
 static af_FuncBody *strFuncBody(af_CallFuncInfo *cfi, af_Environment *env) {
     af_Object *obj = cfi->func;
     ObjectStrFunc *osf = getObjectData(obj);
-    af_Object *str = makeObject((char *)string_id, false, osf->api, false, NULL, makeInherit(obj), env);
+    af_Object *str = makeObject((char *) string_id, false, osf->api, false, NULL, true, makeInherit(obj), env);
     af_Message *msg = makeNORMALMessage(str);
     pushMessageDown(msg, env);
     return NULL;

+ 1 - 1
src/runtime/runtime.c

@@ -74,7 +74,7 @@ void makeObjectFromList(const ObjectDefineList obj_def[], af_Object *visitor, af
         if (api == NULL)
             api = makeAPIFromList(od->api_list);
 
-        af_Object *obj = makeObject(od->id, od->free_api, api, od->allow_inherit, od->belong, 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) {

+ 22 - 22
test/src/run_code.c

@@ -85,7 +85,7 @@ af_FuncBody *testFunc(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用
         DLC_SYMBOL(objectAPIFunc) literal_set = MAKE_SYMBOL(literalSet, objectAPIFunc);
         if (addAPI(literal_set, "obj_literalSetting", api) != 1)
             return NULL;
-        obj = makeObject("func", true, api, true, NULL, NULL, env);
+        obj = makeObject("func", true, api, true, NULL, true, NULL, env);
         FREE_SYMBOL(literal_set);
     }
 
@@ -142,7 +142,7 @@ af_FuncBody *testFunc2(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
         if (addAPI(get_gl, "obj_getGcList", api) != 1)
             return NULL;
 
-        obj = makeObject("func", true, api, true, NULL, NULL, env);
+        obj = makeObject("func", true, api, true, NULL, true, NULL, env);
         FREE_SYMBOL(getSize_2);
         FREE_SYMBOL(initData_2);
         FREE_SYMBOL(freeData_2);
@@ -182,7 +182,7 @@ af_FuncBody *testFunc4(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
         DLC_SYMBOL(objectAPIFunc) literal_set = MAKE_SYMBOL(literalSet, objectAPIFunc);
         if (addAPI(literal_set, "obj_literalSetting", api) != 1)
             return NULL;
-        obj = makeObject("func", true, api, true, NULL, NULL, env);
+        obj = makeObject("func", true, api, true, NULL, true, NULL, env);
         FREE_SYMBOL(literal_set);
     }
 
@@ -201,7 +201,7 @@ bool getInfo4(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
 af_FuncBody *testFunc9(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     af_FuncBody *fb;
-    obj = makeObject("obj", true, makeObjectAPI(), true, NULL, NULL, env);
+    obj = makeObject("obj", true, makeObjectAPI(), true, NULL, true, NULL, env);
     pushMessageDown(makeNORMALMessage(obj), env);
     printf("testFunc9(%p): I am testFunc9\n", obj);
 
@@ -224,7 +224,7 @@ bool getInfo9(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
 
 af_FuncBody *testFunc8(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
-    obj = makeObject("obj", true, makeObjectAPI(), true, NULL, NULL, env);
+    obj = makeObject("obj", true, makeObjectAPI(), true, NULL, true, NULL, env);
     pushMessageDown(makeNORMALMessage(obj), env);
     printf("testFunc8(%p): I am testFunc8\n", obj);
     fflush(stdout);
@@ -233,7 +233,7 @@ af_FuncBody *testFunc8(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
 
 af_FuncBody *testFunc7(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
-    obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);
+    obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
     pushMessageDown(makeNORMALMessage(obj), env);
     printf("testFunc7[des](%p): I am testFunc7\n", obj);
     fflush(stdout);
@@ -251,7 +251,7 @@ bool getInfo7(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
 af_FuncBody *testFunc6(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     af_Object *des;
-    obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);
+    obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
 
     {
         af_ObjectAPI *api = makeObjectAPI();
@@ -273,7 +273,7 @@ af_FuncBody *testFunc6(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
             return NULL;
         if (addAPI(get_gl, "obj_getGcList", api) != 1)
             return NULL;
-        des = makeObject("func-des", true, api, true, NULL, NULL, env);
+        des = makeObject("func-des", true, api, true, NULL, true, NULL, env);
         FREE_SYMBOL(get_vsl);
         FREE_SYMBOL(get_info7);
         FREE_SYMBOL(get_gl);
@@ -303,7 +303,7 @@ bool getInfo6(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *m
 af_FuncBody *testFunc5(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试用函数
     af_Object *obj;
     af_Object *des;
-    obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);
+    obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
 
     {
         af_ObjectAPI *api = makeObjectAPI();
@@ -325,7 +325,7 @@ af_FuncBody *testFunc5(af_CallFuncInfo *cfi, af_Environment *env) {  // 测试
             return NULL;
         if (addAPI(get_gl, "obj_getGcList", api) != 1)
             return NULL;
-        des = makeObject("func-des", true, api, true, NULL, NULL, env);
+        des = makeObject("func-des", true, api, true, NULL, true, NULL, env);
         FREE_SYMBOL(get_vsl);
         FREE_SYMBOL(get_info6);
         FREE_SYMBOL(get_gl);
@@ -442,7 +442,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("object", 3, 3, 3,
-                                        (obj = makeObject("object", true, api, true, NULL, NULL, env)),
+                                        (obj = makeObject("object", true, api, true, NULL, true, NULL, env)),
                                         env),
                                 env);
         FREE_SYMBOL(getSize_3);
@@ -487,7 +487,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -534,7 +534,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func2", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -580,7 +580,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func3", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -629,7 +629,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func4", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -676,7 +676,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func5", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -691,7 +691,7 @@ INIT_ERROR:
     }
 
     {
-        af_Object *obj = makeObject("func", true, makeObjectAPI(), true, NULL, NULL, env);
+        af_Object *obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
         af_Object *des;
 
         {
@@ -714,7 +714,7 @@ INIT_ERROR:
                 goto RETURN_2;
             if (addAPI(get_gl, "obj_getGcList", api) != 1)
                 goto RETURN_2;
-            des = makeObject("func-des", true, api, true, NULL, NULL, env);
+            des = makeObject("func-des", true, api, true, NULL, true, NULL, env);
             FREE_SYMBOL(get_vsl);
             FREE_SYMBOL(get_info6);
             FREE_SYMBOL(get_gl);
@@ -760,7 +760,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func7", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -809,7 +809,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func8", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -856,7 +856,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func9", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);
@@ -902,7 +902,7 @@ INIT_ERROR:
             goto RETURN_2;
 
         addVarToProtectVarSpace(makeVar("func10", 3, 3, 3,
-                                        (obj = makeObject("func", true, api, true, NULL, NULL, env)), env),
+                                        (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env),
                                 env);
         FREE_SYMBOL(get_alc);
         FREE_SYMBOL(get_vsl);