Преглед на файлове

fix & feat: 修复访问权限设置的bug

修复copyStatement未赋值访问权限的问题
提取访问权限判断函数
SongZihuan преди 4 години
родител
ревизия
f9c3c19167
променени са 7 файла, в които са добавени 53 реда и са изтрити 78 реда
  1. 1 6
      main.c
  2. 1 2
      parser/grammar.c
  3. 24 1
      src/__run.c
  4. 1 0
      src/include/__run.h
  5. 5 13
      src/parameter.c
  6. 20 56
      src/runoperation.c
  7. 1 0
      src/statement.c

+ 1 - 6
main.c

@@ -20,9 +20,4 @@ int main(int argc, char *argv[]) {
 
     args_error: freeArgs();
     return 0;
-}
-
-/** TODO-szh List
- * 官方函数
- * 官方类
- */
+}

+ 1 - 2
parser/grammar.c

@@ -1495,8 +1495,7 @@ void parserBaseValue(PASERSSIGNATURE){
                 goto return_;
             }
             delToken(pm);
-            if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &st,
-                                    "Don't get Base Value after aut token")) {
+            if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &st, "Don't get Base Value after aut token")) {
                 freeToken(value_token, true);
                 goto return_;
             }

+ 24 - 1
src/__run.c

@@ -307,7 +307,6 @@ ResultType getIter(LinkValue *value, int status, fline line, char *file, INTER_F
 
 bool checkBool(LinkValue *value, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST){
     LinkValue *_bool_ = findAttributes(inter->data.object_bool, false, value, inter);
-    setResultCore(result);
     if (_bool_ != NULL){
         gc_addTmpLink(&_bool_->gc_status);
         callBackCore(_bool_, NULL, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
@@ -353,3 +352,27 @@ bool is_iterStop(LinkValue *value, Inter *inter) {
 bool is_quitExc(LinkValue *value, Inter *inter) {
     return value->value == inter->data.quit_exc || checkAttribution(value->value, inter->data.quit_exc);
 }
+
+bool checkAut(enum ValueAuthority value, enum ValueAuthority base, fline line, char *file, char *name, bool pri_auto, INTER_FUNCTIONSIG_NOT_ST) {
+    if ((value == public_aut || (!pri_auto && value == auto_aut)) && (base != public_aut && base != auto_aut)) {
+        if (name == NULL)
+            setResultError(E_PermissionsException, "Wrong Permissions: access variables as public", line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+        else {
+            char *message = memStrcat("Wrong Permissions: access variables as public: ", name, false, false);
+            setResultError(E_PermissionsException, message, line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+            memFree(message);
+        }
+        return false;
+    }
+    else if ((value == protect_aut) && (base == private_aut)) {
+        if (name == NULL)
+            setResultError(E_PermissionsException, "Wrong Permissions: access variables as protect", line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+        else {
+            char *message = memStrcat("Wrong Permissions: access variables as protect: ", name, false, false);
+            setResultError(E_PermissionsException, message, line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+            memFree(message);
+        }
+        return false;
+    }
+    return true;
+}

+ 1 - 0
src/include/__run.h

@@ -34,4 +34,5 @@ bool checkBool(LinkValue *value, fline line, char *file, INTER_FUNCTIONSIG_NOT_S
 char *getRepoStr(LinkValue *value, bool is_repot, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
 bool is_iterStop(LinkValue *value, Inter *inter);
 bool is_quitExc(LinkValue *value, Inter *inter);
+bool checkAut(enum ValueAuthority value, enum ValueAuthority base, fline line, char *file, char *name, bool pri_auto, INTER_FUNCTIONSIG_NOT_ST);
 #endif //VIRTUALMATH___RUN_H

+ 5 - 13
src/parameter.c

@@ -197,7 +197,7 @@ Argument *listToArgument(LinkValue *list_value, long line, char *file, INTER_FUN
             freeResult(result);
             break;
         }
-        else if (!CHECK_RESULT(result)) {  // TODO-szh 处理迭代其的result 通过getIter找到迭代器
+        else if (!CHECK_RESULT(result)) {
             freeArgument(at, true);
             at = NULL;
             goto return_;
@@ -365,18 +365,10 @@ ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, vnum
                 goto not_return;
             }
             setResultErrorSt(E_ArgumentException, FEW_ARG, true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-            goto reutnr_;
-        }
-        else if ((name->aut == public_aut || name->aut == auto_aut) && (value->aut != public_aut && value->aut != auto_aut)) {
-            setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true,
-                             name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-            goto reutnr_;
-        }
-        else if ((name->aut == protect_aut) && (value->aut == private_aut)) {
-            setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true,
-                             name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-            goto reutnr_;
+            goto return_;
         }
+        else if (!checkAut(name->aut, value->aut, name->line, name->code_file, NULL, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
+            goto return_;
 
         not_return:
         freeResult(result);
@@ -394,7 +386,7 @@ ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, vnum
     }
 
     setResult(result, inter, belong);
-    reutnr_:
+    return_:
     *function_ad = function;
     return result->type;
 }

+ 20 - 56
src/runoperation.c

@@ -84,17 +84,11 @@ ResultType pointOperation(INTER_FUNCTIONSIG) {
     object = left->value->object.var;
     gc_freeze(inter, var_list, object, true);
     operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.operation.right, object, result, left));
-    if (!CHECK_RESULT(result))
-        goto return_;
-    else if ((left->aut == public_aut || left->aut == auto_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut))
-        setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-    else if ((left->aut == protect_aut) && (result->value->aut == private_aut))
-        setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-
-    if (result->value->belong == NULL || result->value->belong->value != left->value && checkAttribution(left->value, result->value->belong->value))
+    if (!CHECK_RESULT(result) || !checkAut(left->aut, result->value->aut, st->line, st->code_file, NULL, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
+        PASS;
+    else if (result->value->belong == NULL || result->value->belong->value != left->value && checkAttribution(left->value, result->value->belong->value))
         result->value->belong = left;
 
-    return_:
     gc_freeze(inter, var_list, object, false);
     gc_freeTmpLink(&left->gc_status);
     return result->type;
@@ -142,15 +136,9 @@ ResultType varDel(Statement *name, bool check_aut, INTER_FUNCTIONSIG_NOT_ST) {
     }
     if (check_aut) {
         LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-        if (tmp != NULL) {
-            if ((name->aut == public_aut || name->aut == auto_aut) && (tmp->aut != public_aut && tmp->aut != auto_aut)) {  // TODO-szh 封装位函数
-                setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-                goto return_;
-            }
-            else if ((name->aut == protect_aut) && (tmp->aut == private_aut)) {
-                setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-                goto return_;
-            }
+        freeResult(result);
+        if (tmp != NULL && !checkAut(name->aut, tmp->aut, name->line, name->code_file, NULL, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong))) {
+            goto return_;
         }
     }
     findFromVarList(str_name, int_times, del_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
@@ -283,27 +271,14 @@ ResultType varAss(Statement *name, LinkValue *value, bool check_aut, bool settin
         var_value->aut = name->aut;
     if (check_aut) {
         LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-        if (tmp != NULL) {
-            if ((value->aut == public_aut || value->aut == auto_aut) && (tmp->aut != public_aut && tmp->aut != auto_aut)) {
-                setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as public", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-                goto return_;
-            }
-            else if ((value->aut == protect_aut) && (tmp->aut == private_aut)) {
-                setResultErrorSt(E_PermissionsException, "Wrong Permissions: access variables as protect", true, name, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-                goto return_;
-            }
-            else
-                varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-        } else
-            varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-    } else {
-        if (name->aut != auto_aut) {
-            LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-            if (tmp != NULL)
-                tmp->aut = name->aut;
-        }
-        varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+        if (tmp != NULL && !checkAut(value->aut, tmp->aut, name->line, name->code_file, NULL, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
+            goto return_;
+    } else if (name->aut != auto_aut){
+        LinkValue *tmp = findFromVarList(str_name, int_times, read_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+        if (tmp != NULL)
+            tmp->aut = name->aut;
     }
+    varAssCore(str_name, result->value, int_times, var_value, setting, CALL_INTER_FUNCTIONSIG_CORE(var_list));
     freeResult(result);
     result->type = operation_return;
     result->value = value;
@@ -399,6 +374,7 @@ ResultType pointAss(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST)
 ResultType getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
     int int_times = 0;
     char *name = NULL;
+    LinkValue *var;
 
     setResultCore(result);
     var_info(&name, &int_times, CALL_INTER_FUNCTIONSIG(st, var_list, result, belong));
@@ -408,28 +384,16 @@ ResultType getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
     }
 
     freeResult(result);
-    result->type = operation_return;
-    result->value = findFromVarList(name, int_times, get_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-    if (result->value == NULL) {
+    var = findFromVarList(name, int_times, get_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+    gc_addTmpLink(&var->gc_status);
+    if (var == NULL) {
         char *info = memStrcat("Variable not found: ", name, false, false);
         setResultErrorSt(E_NameExceptiom, info, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
         memFree(info);
     }
-    else if ((st->aut == public_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut)){
-        setResultCore(result);
-        char *info = memStrcat("Wrong Permissions: access variables as public ", name, false, false);
-        setResultErrorSt(E_PermissionsException, info, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-        memFree(info);
-    }
-    else if ((st->aut == protect_aut) && (result->value->aut == private_aut)){
-        setResultCore(result);
-        char *info = memStrcat("Wrong Permissions: access variables as protect ", name, false, false);
-        setResultErrorSt(E_PermissionsException, info, true, st, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-        memFree(info);
-    }
-    else
-        setResultOperationBase(result, result->value);
-
+    else if (checkAut(st->aut, var->aut, st->line, st->code_file, NULL, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
+        setResultOperationBase(result, var);
+    gc_freeTmpLink(&var->gc_status);
     memFree(name);
     return result->type;
 }

+ 1 - 0
src/statement.c

@@ -512,6 +512,7 @@ Statement *copyStatement(Statement *st){
 Statement *copyStatementCore(Statement *st){
     Statement *new = makeStatement(st->line, st->code_file);
     new->type = st->type;
+    new->aut = st->aut;
     new->next = NULL;
     switch (st->type) {
         case base_value: