Pārlūkot izejas kodu

feat: 添加VarSpace权限管理

SongZihuan 3 gadi atpakaļ
vecāks
revīzija
c2579603c7
9 mainītis faili ar 69 papildinājumiem un 24 dzēšanām
  1. 5 3
      include/core/var.h
  2. 3 2
      src/core/__var.h
  3. 1 1
      src/core/env.c
  4. 1 1
      src/core/global_obj.c
  5. 1 1
      src/core/object.c
  6. 55 13
      src/core/var.c
  7. 1 1
      src/main.c
  8. 1 1
      test/src/env_init.c
  9. 1 1
      test/src/run_code.c

+ 5 - 3
include/core/var.h

@@ -17,16 +17,18 @@ AFUN_CORE_EXPORT void freeVar(af_Var *var, 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, af_Environment *env);
+AFUN_CORE_EXPORT af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char p_external, af_Environment *env);
 AFUN_CORE_EXPORT void freeVarSpace(af_VarSpace *vs, af_Environment *env);
 
 /* 变量定义函数 */
 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);
+                                        af_Object *visitor, af_Environment *env);
 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);
+                                            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);

+ 3 - 2
src/core/__var.h

@@ -30,9 +30,10 @@ struct af_VarCup {
 };
 
 struct af_VarSpace {
-    bool is_protect;  // 是否为保护变量空间
+    bool is_protect;  // 是否为保护变量空间 (对VarSpaceList的操作都跳过保护空间)
     struct af_VarCup *(var[VAR_HASHTABLE_SIZE]);
     struct af_Object *belong;  // 属主
+    char permissions[3];  // 可定义(2),可删除(1) [自身权限 后代权限 外部权限]
     GC_VarSpace gc;
 };
 
@@ -42,7 +43,7 @@ struct af_VarSpaceListNode {  // 变量链
 };
 
 /* 变量空间创建与释放 */
-AFUN_CORE_NO_EXPORT af_VarSpace *makeVarSpaceByCore(af_Object *belong, af_Core *core);
+AFUN_CORE_NO_EXPORT af_VarSpace *makeVarSpaceByCore(af_Object *belong, char p_self, char p_posterity, char p_external, af_Core *core);
 AFUN_CORE_NO_EXPORT void freeVarSpaceByCore(af_VarSpace *vs, af_Core *core);
 
 /* 变量创建与释放 */

+ 1 - 1
src/core/env.c

@@ -65,7 +65,7 @@ static bool isInfixFunc(af_Code *code, af_Environment *env);
 static af_Core *makeCore(enum GcRunTime grt) {
     af_Core *core = calloc(1, sizeof(af_Core));
     core->status = core_creat;
-    core->protect = makeVarSpaceByCore(NULL, core);
+    core->protect = makeVarSpaceByCore(NULL, 3, 3, 3, core);
     core->gc_run = grt;
     core->gc_count_max = DEFAULT_GC_COUNT_MAX;
     return core;

+ 1 - 1
src/core/global_obj.c

@@ -6,7 +6,7 @@ static size_t getSize(af_Object *obj) {
 }
 
 static void initData(af_Object *obj, af_VarSpace **data, af_Environment *env) {
-    *data = makeVarSpace(obj, env);
+    *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
 static void freeData(af_Object *obj, af_VarSpace **data, af_Environment *env) {

+ 1 - 1
src/core/object.c

@@ -33,7 +33,7 @@ static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI
     od->free_api = free_api;
     od->allow_inherit = allow_inherit;
 
-    od->var_space = makeVarSpace(base_obj, env);
+    od->var_space = makeVarSpace(base_obj, 3, 2, 0, env);
     od->inherit = NULL;
 
     obj_getDataSize *func = findAPI("obj_getDataSize", api);

+ 55 - 13
src/core/var.c

@@ -16,8 +16,8 @@ static void freeAllVarCup(af_VarCup *vp);
 static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpace *vs);
 
 /* 变量权限函数 */
-static bool checkReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
-static bool checkWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
+static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
+static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
 
 static af_VarNode *makeVarNode(af_Object *obj, char *id) {
     af_VarNode *vn = calloc(1, sizeof(af_VarNode));
@@ -100,22 +100,28 @@ static void freeAllVarCup(af_VarCup *vp) {
         vp = freeVarCup(vp);
 }
 
-af_VarSpace *makeVarSpace(af_Object *belong, af_Environment *env) {
+af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char p_external, af_Environment *env){
     if (env->core->status != core_creat && belong == NULL)
         return NULL;
 
     af_VarSpace *vs = calloc(1, sizeof(af_VarSpace));
     vs->belong = belong;
+    vs->permissions[0] = p_self;
+    vs->permissions[1] = p_posterity;
+    vs->permissions[2] = p_external;
     gc_addVarSpace(vs, env);
     return vs;
 }
 
-af_VarSpace *makeVarSpaceByCore(af_Object *belong, af_Core *core) {
+af_VarSpace *makeVarSpaceByCore(af_Object *belong, char p_self, char p_posterity, char p_external, af_Core *core) {
     if (core->status != core_creat && belong == NULL)
         return NULL;
 
     af_VarSpace *vs = calloc(1, sizeof(af_VarSpace));
     vs->belong = belong;
+    vs->permissions[0] = p_self;
+    vs->permissions[1] = p_posterity;
+    vs->permissions[2] = p_external;
     gc_addVarSpaceByCore(vs, core);
     return vs;
 }
@@ -166,6 +172,17 @@ bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *vsl) {
     return true;
 }
 
+static bool checkVarSpaceDefinePermissions(af_Object *visitor, af_VarSpace *vs){
+    char p = vs->permissions[2];  // 默认外部权限
+
+    if (vs->belong == NULL || (visitor != NULL && vs->belong->data == visitor->data))  // (无权限设定或ObjectData匹配) 应用自身权限
+        p = vs->permissions[0];
+    else if (visitor != NULL && checkPosterity(vs->belong, visitor))  // 应用后代权限
+        p = vs->permissions[1];
+
+    return p == 2 || p == 3;
+}
+
 /*
  * 函数名: addVarToVarSpace
  * 目标: 把var添加到VarSpace中
@@ -179,7 +196,7 @@ bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs) {
     if (vs->is_protect)
         return false;
 
-    if (vs->belong != NULL && (visitor == NULL || visitor->data != vs->belong->data))
+    if (!checkVarSpaceDefinePermissions(visitor, vs))
         return false;
 
     for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
@@ -228,6 +245,31 @@ bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_ext
     return addVarToVarSpaceList(makeVar(name, p_self, p_posterity, p_external, obj, env), visitor, vsl);
 }
 
+/*
+ * 函数名: makeVarToProtectVarSpace
+ * 目标: 创建一个新的var变量添加到保护空间中
+ * 若已存在同名Var则返回false不作修改
+ * 否则返回true
+ * 调用 addVarToVarSpace
+ */
+bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env){
+    env->core->protect->is_protect = false;
+    bool re = addVarToVarSpace(makeVar(name, p_self, p_posterity, p_external, obj, env), env->activity->belong, env->core->protect);
+    env->core->protect->is_protect = true;
+    return re;
+}
+
+static bool checkVarSpaceDelPermissions(af_Object *visitor, af_VarSpace *vs){
+    char p = vs->permissions[2];  // 默认外部权限
+
+    if (vs->belong == NULL || (visitor != NULL && vs->belong->data == visitor->data))  // (无权限设定或ObjectData匹配) 应用自身权限
+        p = vs->permissions[0];
+    else if (visitor != NULL && checkPosterity(vs->belong, visitor))  // 应用后代权限
+        p = vs->permissions[1];
+
+    return p == 1 || p == 3;
+}
+
 /*
  * 函数名: delVarFromVarSpace
  * 目标: 从VarSpace中删除指定的变量
@@ -241,7 +283,7 @@ bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs) {
     if (vs->is_protect)
         return false;
 
-    if (vs->belong != NULL && (visitor == NULL || visitor->data != vs->belong->data))
+    if (!checkVarSpaceDelPermissions(visitor, vs))
         return false;
 
     for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
@@ -278,7 +320,7 @@ static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpac
     return NULL;
 }
 
-static bool checkReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
+static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
     char p = var->permissions[2];  // 默认外部权限
 
     if (vs->belong == NULL || (visitor != NULL && vs->belong->data == visitor->data))  // (无权限设定或ObjectData匹配) 应用自身权限
@@ -299,7 +341,7 @@ af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs){
     if (var == NULL)
         return NULL;
 
-    if (checkReadPermissions(var, visitor, vs))
+    if (checkVarReadPermissions(var, visitor, vs))
         return var;
     return NULL;
 }
@@ -316,7 +358,7 @@ af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *
     for (NULL; vsl != NULL; vsl = vsl->next) {
         var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
         if (var != NULL) {
-            if (checkReadPermissions(var, visitor, vsl->vs))
+            if (checkVarReadPermissions(var, visitor, vsl->vs))
                 return var;
             return NULL;
         }
@@ -325,7 +367,7 @@ af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *
     return NULL;
 }
 
-static bool checkWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
+static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
     char p = var->permissions[2];  // 默认外部权限
 
     if (vs->belong == NULL || (visitor != NULL && vs->belong->data == visitor->data))  // (无权限设定或ObjectData匹配) 应用自身权限
@@ -346,7 +388,7 @@ bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpac
     if (var == NULL)
         return false;
 
-    if (checkWritePermissions(var, visitor, vs)) {
+    if (checkVarWritePermissions(var, visitor, vs)) {
         var->vn->obj = obj;
         return true;
     }
@@ -365,7 +407,7 @@ bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpace
     for (NULL; vsl != NULL; vsl = vsl->next) {
         var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
         if (var != NULL) {
-            if (checkWritePermissions(var, visitor, vsl->vs)) {
+            if (checkVarWritePermissions(var, visitor, vsl->vs)) {
                 var->vn->obj = obj;
                 return true;
             }
@@ -376,7 +418,7 @@ 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 *new = makeVarSpaceList(makeVarSpace(belong, env));
+    af_VarSpaceListNode *new = makeVarSpaceList(makeVarSpace(belong, 3, 2, 0, env));
     new->next = base;
     return new;
 }

+ 1 - 1
src/main.c

@@ -33,7 +33,7 @@ size_t getSize3(af_Object *obj) {
 }
 
 void initData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
-    *data = makeVarSpace(obj, env);
+    *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
 void freeData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {

+ 1 - 1
test/src/env_init.c

@@ -20,7 +20,7 @@ size_t getSize3(af_Object *obj) {
 }
 
 void initData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
-    *data = makeVarSpace(obj, env);
+    *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
 void freeData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {

+ 1 - 1
test/src/run_code.c

@@ -33,7 +33,7 @@ size_t getSize3(af_Object *obj) {
 }
 
 void initData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {
-    *data = makeVarSpace(obj, env);
+    *data = makeVarSpace(obj, 3, 2, 0, env);
 }
 
 void freeData3(af_Object *obj, af_VarSpace **data, af_Environment *env) {