Prechádzať zdrojové kódy

feat: 封装了GET_RESULT宏

SongZihuan 4 rokov pred
rodič
commit
4e96329d19

+ 3 - 0
vmcore/include/value.h

@@ -14,6 +14,9 @@
 #define RETURN_ERROR(func, type) (wchar_t *) L###func L" func should return " L###type L" type data"
 #define KEY_INTERRUPT (wchar_t *) L"keyInterrupt"
 
+#define GET_RESULT(val, res) do {(val) = (res)->value; (res)->value=NULL; freeResult(res);} while(0)
+#define GET_RESULTONLY(val, res) do {(val) = (res)->value; (res)->value=NULL;} while(0)
+
 typedef struct Argument Argument;
 typedef struct Inter Inter;
 typedef struct VarList VarList;

+ 1 - 3
vmcore/ofunc/src/__ofunc.c

@@ -3,9 +3,7 @@
 LinkValue *registeredFunctionCore(OfficialFunction of, wchar_t *name, FUNC_NT) {
     LinkValue *value = NULL;
     makeCFunctionValue(of, LINEFILE, CNEXT_NT);
-    value = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(value, result);
     addStrVar(name, false, true, value, LINEFILE, false, CNEXT_NT);
     gc_freeTmpLink(&value->gc_status);
     return value;

+ 3 - 8
vmcore/ofunc/src/dictiter.c

@@ -33,17 +33,14 @@ ResultType dictiter_init(O_FUNC){
         freeResult(result);
         callBackCore(keys, NULL, LINEFILE, 0, CNEXT_NT);
         gc_freeTmpLink(&keys->gc_status);
-        if (!CHECK_RESULT(result)) {
+        if (!CHECK_RESULT(result))
             return R_error;
-        }
-        list = result->value;
-        result->value = NULL;
+        GET_RESULT(list, result);
 
         listiter_class = inter->data.base_obj[B_LISTITER];
         gc_addTmpLink(&listiter_class->gc_status);
 
         list_arg = makeValueArgument(list);
-        freeResult(result);
         callBackCore(listiter_class, list_arg, LINEFILE, 0,
                      CNEXT_NT);
         freeArgument(list_arg, true);
@@ -54,9 +51,7 @@ ResultType dictiter_init(O_FUNC){
             return R_error;
         }
 
-        list_iter = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(list_iter, result);
         gc_freeTmpLink(&list->gc_status);
         gc_freeTmpLink(&listiter_class->gc_status);
     }

+ 1 - 4
vmcore/ofunc/src/function.c

@@ -82,10 +82,7 @@ ResultType function_set(O_FUNC){  // 针对FFI设置vaargs
         makeListValue(ap[1].arg, LINEFILE, L_tuple, CNEXT_NT);
         if (!CHECK_RESULT(result))
             return result->type;
-        list = result->value;
-        result->value = NULL;
-        freeResult(result);
-
+        GET_RESULT(list, result);
         addAttributes(L"vaargs", false, list, LINEFILE, true, CFUNC_NT(var_list, result, func));
         gc_freeTmpLink(&list->gc_status);
     }

+ 2 - 3
vmcore/ofunc/src/lib_.c

@@ -98,9 +98,8 @@ ResultType lib_addCore(wchar_t *name_, LinkValue *clib, FUNC_NT) {
     } else {
         makeFFunctionValue(FFI_FN(func), LINEFILE, CFUNC_NT(var_list, result, clib));
         if (CHECK_RESULT(result)) {
-            LinkValue *func_value = result->value;
-            result->value = NULL;
-            freeResult(result);
+            LinkValue *func_value;
+            GET_RESULT(func_value, result);
             addAttributes(name_, false, func_value, LINEFILE, false, CFUNC_NT(var_list, result, clib));
             gc_freeTmpLink(&func_value->gc_status);
             if (CHECK_RESULT(result))

+ 1 - 3
vmcore/ofunc/src/list.c

@@ -110,9 +110,7 @@ ResultType list_slice_assignment(O_FUNC){
     getIter(ap[1].value, 1, LINEFILE, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return result->type;
-    iter_obj = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(iter_obj, result);
 
     first = 0;
     second = size;

+ 2 - 4
vmcore/ofunc/src/str.c

@@ -174,10 +174,8 @@ ResultType str_iter(O_FUNC){
     callBackCore(to_list, NULL, LINEFILE, 0, CNEXT_NT);
     gc_freeTmpLink(&to_list->gc_status);
     if (CHECK_RESULT(result)) {  // 若没有出现Exception
-        LinkValue *str_list = NULL;
-        str_list = result->value;
-        result->value = NULL;
-        freeResult(result);
+        LinkValue *str_list;
+        GET_RESULT(str_list, result);
         getIter(str_list, 1, LINEFILE, CNEXT_NT);
         gc_freeTmpLink(&str_list->gc_status);
     }

+ 2 - 8
vmcore/src/__run.c

@@ -348,10 +348,7 @@ void addStrVar(wchar_t *name, bool free_old, bool setting, LinkValue *value, fli
     makeStringValue(name, line, file, CNEXT_NT);
     if (!CHECK_RESULT(result))
         goto return_;
-
-    name_ = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(name_, result);
     addStrVarCore(setting, var_name, name_, line, file, NULL, CFUNC_NT(var_list, result, value));
     gc_freeTmpLink(&name_->gc_status);
 
@@ -384,10 +381,7 @@ bool addAttributes(wchar_t *name, bool free_old, LinkValue *value, fline line, c
     makeStringValue(name, line, file, CNEXT_NT);
     if (!CHECK_RESULT(result))
         goto return_;
-
-    name_ = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(name_, result);
 
     gc_freeze(inter, var_list, belong->value->object.var, true);
     addStrVarCore(false, var_name, name_, line, file, var_list, CFUNC_NT(belong->value->object.var, result, value));

+ 12 - 31
vmcore/src/parameter.c

@@ -192,10 +192,8 @@ Argument *listToArgument(LinkValue *list_value, long line, char *file, FUNC_NT){
     getIter(list_value, 1, line, file, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
-    iter = result->value;
-    result->value = NULL;
+    GET_RESULT(iter, result);
     while (true) {
-        freeResult(result);
         getIter(iter, 0, line, file, CNEXT_NT);
         if (is_iterStop(result->value, inter)){
             freeResult(result);
@@ -207,6 +205,7 @@ Argument *listToArgument(LinkValue *list_value, long line, char *file, FUNC_NT){
             goto return_;
         }
         at = connectValueArgument(result->value, at);
+        freeResult(result);
     }
     setResult(result, inter);
     return_:
@@ -221,13 +220,11 @@ Argument *dictToArgument(LinkValue *dict_value, long line, char *file, FUNC_NT)
     getIter(dict_value, 1, line, file, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
-    iter = result->value;
-    result->value = NULL;
+    GET_RESULT(iter, result);
     while (true) {
         LinkValue *name_ = NULL;
         wchar_t *name = NULL;
 
-        freeResult(result);
         getIter(iter, 0, line, file, CNEXT_NT);
         if (is_iterStop(result->value, inter)){
             freeResult(result);
@@ -238,9 +235,7 @@ Argument *dictToArgument(LinkValue *dict_value, long line, char *file, FUNC_NT)
             at = NULL;
             goto return_;
         }
-        name_ = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(name_, result);
 
         getElement(iter, name_, line, file, CNEXT_NT);
         if (!CHECK_RESULT(result)) {
@@ -253,6 +248,7 @@ Argument *dictToArgument(LinkValue *dict_value, long line, char *file, FUNC_NT)
         at = connectCharNameArgument(result->value, name_, name, at);
         gc_freeTmpLink(&name_->gc_status);
         memFree(name);
+        freeResult(result);
     }
     setResult(result, inter);
     return_:
@@ -277,10 +273,7 @@ ResultType defaultParameter(Parameter **function_ad, vint *num, FUNC_NT) {
         LinkValue *value = NULL;
         if(operationSafeInterStatement(CFUNC(function->data.value, var_list, result, belong)))
             goto return_;
-
-        value = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(value, result);
         assCore(function->data.name, value, false, false, CNEXT_NT);
         gc_freeTmpLink(&value->gc_status);
         if (!CHECK_RESULT(result))
@@ -349,11 +342,7 @@ ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, vint
             makeDictValue(NULL, false, LINEFILE, CNEXT_NT);
             if (!CHECK_RESULT(result))
                 return result->type;
-
-            value = result->value;
-            result->value = NULL;
-            freeResult(result);
-
+            GET_RESULT(value, result);
             value->value->data.dict.dict = var_list->hashtable;
             value->value->data.dict.size = max - *num;
             *status = true;
@@ -469,9 +458,7 @@ ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, FUNC
         else if (call->type == args_par){
             LinkValue *start = NULL;
             Argument *tmp_at = NULL;
-            start = result->value;
-            result->value = NULL;
-            freeResult(result);
+            GET_RESULT(start, result);
             tmp_at = listToArgument(start, LINEFILE, CNEXT_NT);
             gc_freeTmpLink(&start->gc_status);
             if (!CHECK_RESULT(result))
@@ -481,9 +468,7 @@ ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, FUNC
         else if (call->type == kwargs_par){
             LinkValue *start = NULL;
             Argument *tmp_at = NULL;
-            start = result->value;
-            result->value = NULL;
-            freeResult(result);
+            GET_RESULT(start, result);
             tmp_at = dictToArgument(start, LINEFILE, CNEXT_NT);
             gc_freeTmpLink(&start->gc_status);
             if (!CHECK_RESULT(result))
@@ -629,9 +614,7 @@ ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *f
                     makeListValue(NULL, LINEFILE, L_tuple, CNEXT_NT);
 
                 returnResult(result);
-                tmp = result->value;
-                result->value = NULL;
-                freeResult(result);
+                GET_RESULT(tmp, result);
 
                 assCore(function->data.value, tmp, false, false, CFUNC_NT(function_var, result, belong));
                 gc_freeTmpLink(&tmp->gc_status);
@@ -643,9 +626,7 @@ ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *f
                 LinkValue *tmp;
                 makeDictValue(NULL, true, LINEFILE, CNEXT_NT);
                 returnResult(result);
-                tmp = result->value;
-                result->value = NULL;
-                freeResult(result);
+                GET_RESULT(tmp, result);
 
                 assCore(function->data.value, tmp, false, false, CFUNC_NT(function_var, result, belong));
                 gc_freeTmpLink(&tmp->gc_status);
@@ -880,7 +861,7 @@ void setArgumentFFI(ArgumentFFI *af, unsigned int size) {
 
 void freeArgumentFFI(ArgumentFFI *af) {
     for (unsigned int i=0; i < af->size; i++) {
-        switch (af->type[i]) {  // TODO-szh 改为if-else分支
+        switch (af->type[i]) {
             case af_wstr:
             case af_str:
                 if (af->arg_v[i] != NULL)

+ 10 - 29
vmcore/src/runbranch.c

@@ -353,21 +353,15 @@ static int getForHeard(LinkValue **iter, LinkValue **first_yield, StatementList
         return -1;
     if (result->is_yield){
         iter = NULL;
-        *first_yield = result->value;
-        result->value = NULL;
+        GET_RESULTONLY(*first_yield, result);
         return 1;
     }
-
-    tmp = result->value;
-    result->value = NULL;
-    freeResult(result);
-
+    GET_RESULT(tmp, result);
     getIter(tmp, 1, line, file, CNEXT_NT);
     gc_freeTmpLink(&tmp->gc_status);
     if (!CHECK_RESULT(result))
         return -1;
-    *iter = result->value;
-    result->value = NULL;
+    GET_RESULTONLY(*iter, result);
     return 0;
 }
 
@@ -382,17 +376,13 @@ static int runForHeard(LinkValue *iter, LinkValue *first_yield, StatementList *f
             } else
                 return -1;
         }
-        element = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(element, result);
     } else if (first_yield != NULL)
         element = first_yield;
     else {
         if (operationSafeInterStatement(CFUNC(for_list->condition, var_list, result, belong)))
             return -1;
-        element = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(element, result);
         if (!result->is_yield)
             return 1;
     }
@@ -592,9 +582,7 @@ static int runWithList(StatementList *with_list, LinkValue **with_belong, LinkVa
     if (operationSafeInterStatement(CFUNC(with_list->condition, var_list, result, belong)))
         return -1;
 
-    *value = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(*value, result);
     if (with_list->var == NULL) {
         *with_belong = *value;
         gc_addTmpLink(&(*with_belong)->gc_status);
@@ -856,9 +844,7 @@ ResultType tryBranch(FUNC) {
                 else_st = NULL;
             } else {
                 int status;
-                error_value = result->value;
-                result->value = NULL;
-                freeResult(result);
+                GET_RESULT(error_value, result);
 
                 except_list = st->u.try_branch.except_list;
                 status = checkError(&except_list, error_value, CNEXT_NT);
@@ -1067,10 +1053,7 @@ ResultType assertCode(FUNC){
 
     if (operationSafeInterStatement(CFUNC(st->u.raise_code.value, var_list, result, belong)) || inter->data.assert_run == assert_run)
         return result->type;
-
-    opt = result->value;  // TODO-szh封装为宏
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(opt, result);
 
     result_ = checkBool(opt, st->line, st->code_file, CNEXT_NT);
     gc_freeTmpLink(&opt->gc_status);
@@ -1124,10 +1107,8 @@ ResultType gotoLabel(FUNC){
 }
 
 ResultType runLabel(FUNC) {
-    LinkValue *goto_value = result->value;  // goto的值通过result传入, 因此不能进行setResultCore
-    result->value = NULL;
-    freeResult(result);
-
+    LinkValue *goto_value;
+    GET_RESULT(goto_value, result);  // goto的值通过result传入, 因此不能进行setResultCore
     if (st->u.label_.as != NULL)
         assCore(st->u.label_.as, goto_value, false, false, CNEXT_NT);
 

+ 9 - 22
vmcore/src/runcall.c

@@ -40,9 +40,7 @@ ResultType setClass(FUNC) {
         if (!CHECK_RESULT(result))
             goto error_;
         gc_freeTmpLink(&tmp->gc_status);
-        tmp = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(tmp, result);
     }
 
     assCore(st->u.set_class.name, tmp, false, true, CNEXT_NT);
@@ -65,9 +63,7 @@ ResultType setFunction(FUNC) {
     makeVMFunctionValue(st->u.set_function.function, st->u.set_function.parameter, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return result->type;
-    func = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(func, result);
 
     {
         enum FunctionPtType pt_type_bak = inter->data.default_pt_type;
@@ -88,9 +84,7 @@ ResultType setFunction(FUNC) {
         if (!CHECK_RESULT(result))
             goto error_;
         gc_freeTmpLink(&func->gc_status);
-        func = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(func, result);
     }
     assCore(st->u.set_function.name, func, false, true, CNEXT_NT);
     if (CHECK_RESULT(result))  // 若没有出现错误则设定none
@@ -119,9 +113,7 @@ ResultType elementSlice(FUNC) {
     setResultCore(result);
     if (operationSafeInterStatement(CFUNC(st->u.slice_.element, var_list, result, belong)))
         return result->type;
-    element = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(element, result);
 
     func_name = st->u.slice_.type == SliceType_down_ ? inter->data.mag_func[M_DOWN] : inter->data.mag_func[M_SLICE];
     _func_ = findAttributes(func_name, false, LINEFILE, true, CFUNC_NT(var_list, result, element));
@@ -143,16 +135,14 @@ ResultType elementSlice(FUNC) {
 }
 
 ResultType callBack(FUNC) {
-    LinkValue *function_value = NULL;
+    LinkValue *func = NULL;
     setResultCore(result);
     if (operationSafeInterStatement(CFUNC(st->u.call_function.function, var_list, result, belong)))
         return result->type;
-    function_value = result->value;
-    result->value = NULL;
-    freeResult(result);
-    callBackCorePt(function_value, st->u.call_function.parameter, st->line, st->code_file, CNEXT_NT);
+    GET_RESULT(func, result);
+    callBackCorePt(func, st->u.call_function.parameter, st->line, st->code_file, CNEXT_NT);
     setResultErrorSt(E_BaseException, NULL, false, st, CNEXT_NT);  // 显式执行函数才进行错误回溯
-    gc_freeTmpLink(&function_value->gc_status);
+    gc_freeTmpLink(&func->gc_status);
     return result->type;
 }
 
@@ -588,10 +578,7 @@ ResultType setDecoration(DecorationStatement *ds, LinkValue *value, FUNC_NT) {
         if (operationSafeInterStatement(CFUNC(ds->decoration, var_list, result, belong)))
             break;
         pt = makeValueParameter(makeBaseLinkValueStatement(value, ds->decoration->line, ds->decoration->code_file));
-        decall = result->value;
-        result->value = NULL;
-
-        freeResult(result);
+        GET_RESULT(decall, result);
         callBackCorePt(decall, pt, ds->decoration->line, ds->decoration->code_file, CNEXT_NT);
         gc_freeTmpLink(&decall->gc_status);
         freeParameter(pt, true);

+ 2 - 5
vmcore/src/runfile.c

@@ -283,7 +283,7 @@ ResultType fromImportFile(FUNC) {
     Statement *file = st->u.from_import_file.file;
     char *split_path = NULL;
     char *path = NULL;
-    char md5_str[MD5_STRING];  // TODO-szh 设置为空字符串
+    char md5_str[MD5_STRING] = { NUL };
     VarList *imp_var = NULL;
     LinkValue *imp_value;
     Parameter *pt = st->u.from_import_file.pt;
@@ -307,10 +307,7 @@ ResultType fromImportFile(FUNC) {
         wcs = memStrToWcs(split_path, false);
         makeStringValue(wcs, st->line, st->code_file, CFUNC_NT(var_list, result, imp_value));
         memFree(wcs);
-
-        string = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(string, result);
 
         newObjectSetting(string, st->line, st->code_file, CFUNC_NT(var_list, result, imp_value));
         gc_freeTmpLink(&string->gc_status);

+ 9 - 28
vmcore/src/runoperation.c

@@ -129,9 +129,7 @@ ResultType boolNotOperation(FUNC) {
     setResultCore(result);
     if (operationSafeInterStatement(CFUNC(st->u.operation.left, var_list, result, belong)))
         return result->type;
-    left = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(left, result);
 
     new = !checkBool(left, st->line, st->code_file, CNEXT_NT);
     gc_freeTmpLink(&left->gc_status);
@@ -150,9 +148,7 @@ ResultType boolOperation(FUNC) {
 
     if (operationSafeInterStatement(CFUNC(st->u.operation.left, var_list, result, belong)))
         return result->type;
-    left = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(left, result);
 
     left_bool = checkBool(left, st->line, st->code_file, CNEXT_NT);
     gc_freeTmpLink(&left->gc_status);
@@ -180,9 +176,7 @@ ResultType pointOperation(FUNC) {
     setResultCore(result);
     if (operationSafeInterStatement(CFUNC(st->u.operation.left, var_list, result, belong)) || result->value->value->type == V_none)
         return result->type;
-    left = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(left, result);
 
     if (st->u.operation.OperationType == OPT_POINT)
         object = left->value->object.var;
@@ -300,9 +294,7 @@ ResultType downDel(Statement *name, FUNC_NT) {
     setResultCore(result);
     if (operationSafeInterStatement(CFUNC(name->u.slice_.element, var_list, result, belong)))
         return result->type;
-    iter = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(iter, result);
 
     if (name->u.slice_.type == SliceType_down_)
         _func_ = findAttributes(inter->data.mag_func[M_DOWN_DEL], false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
@@ -344,9 +336,7 @@ ResultType assOperation(FUNC) {
         return_st->u.return_code.value = NULL;
         freeStatement(return_st);
 
-        func = result->value;
-        result->value = NULL;
-        freeResult(result);
+        GET_RESULT(func, result);
         assCore(st->u.operation.left->u.call_function.function, func, false, true, CNEXT_NT);
         gc_freeTmpLink(&func->gc_status);
     }
@@ -392,10 +382,7 @@ ResultType varAss(Statement *name, LinkValue *value, bool check_aut, bool settin
         memFree(str_name);
         return result->type;
     }
-    name_ = result->value;
-    result->value = NULL;
-    freeResult(result);
-
+    GET_RESULT(name_, result);
     if (name->aut != auto_aut)
         value->aut = name->aut;
 
@@ -459,9 +446,7 @@ ResultType downAss(Statement *name, LinkValue *value, FUNC_NT) {
     setResultCore(result);
     if (operationSafeInterStatement(CFUNC(name->u.slice_.element, var_list, result, belong)))
         return result->type;
-    iter = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(iter, result);
 
     if (name->u.slice_.type == SliceType_down_)
         _func_ = findAttributes(inter->data.mag_func[M_DOWN_ASSIGMENT], false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
@@ -576,9 +561,7 @@ ResultType getVar(FUNC, VarInfo var_info) {
         return result->type;
     }
 
-    val = result->value;
-    result->value = NULL;
-    freeResult(result);
+    GET_RESULT(val, result);
     var = findFromVarList(name, int_times, get_var, CFUNC_CORE(var_list));
 
     if (var == NULL) {
@@ -734,9 +717,7 @@ ResultType operationCore2(FUNC, wchar_t *name) {
 
     if (operationSafeInterStatement(CFUNC(st->u.operation.left, var_list, result, belong)))
         return result->type;
-    left = result->value;
-    result->value = NULL;  // 不使用freeResult, 不需要多余的把result.value设置为none
-
+    GET_RESULTONLY(left, result);  // 不使用freeResult, 不需要多余的把result.value设置为none
     runOperationFromValue(left, NULL, name, st->line, st->code_file, CNEXT_NT);
     gc_freeTmpLink(&left->gc_status);
     return result->type;

+ 1 - 3
vmcore/src/value.c

@@ -384,9 +384,7 @@ void callException(LinkValue *exc, wchar_t *message, fline line, char *file, FUN
 
         gc_addTmpLink(&_new_->gc_status);
         callBackCore(_new_, arg, line, file, 0, CNEXT_NT);
-        error = result->value;
-        result->value = NULL;
-        freeResult(result);  // 没有释放error的tmp link, 等于error的tmp link添加了两次
+        GET_RESULT(error, result);  // 没有释放error的tmp link, 等于error的tmp link添加了两次
 
         gc_freeTmpLink(&_new_->gc_status);
         freeArgument(arg, true);