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

fix: 修复了形参赋值的问题

SongZihuan преди 4 години
родител
ревизия
61d2053eed
променени са 3 файла, в които са добавени 29 реда и са изтрити 9 реда
  1. 5 4
      VirtulMathCore/parser/__grammar.c
  2. 2 1
      VirtulMathCore/parser/grammar.c
  3. 22 4
      VirtulMathCore/src/parameter.c

+ 5 - 4
VirtulMathCore/parser/__grammar.c

@@ -30,10 +30,6 @@ inline void twoOperation(PASERSSIGNATURE, PasersFunction callBack, GetSymbolFunc
         }
         left_token = popNewToken(pm->tm);
         line = left_token->line;
-        if (checkleft != NULL && !checkleft(CALLPASERSSIGNATURE, left_token->data.st)) {
-            freeToken(left_token, true);
-            goto return_;
-        }
 
         if (getSymbol(CALLPASERSSIGNATURE, readBackToken(pm), &st))
             delToken(pm);
@@ -42,6 +38,11 @@ inline void twoOperation(PASERSSIGNATURE, PasersFunction callBack, GetSymbolFunc
             goto return_;
         }
 
+        if (checkleft != NULL && !checkleft(CALLPASERSSIGNATURE, left_token->data.st)) {
+            freeToken(left_token, true);
+            goto return_;
+        }
+
         callBack(CALLPASERSSIGNATURE);  // 获得右值
         if (!call_success(pm) || readBackToken(pm) != call_type){  // 若非正确数值
             syntaxError(pm, syntax_error, line, 5, "ERROR from ", self_name, "(get right ", call_name, ")");

+ 2 - 1
VirtulMathCore/parser/grammar.c

@@ -1117,7 +1117,7 @@ void parserOperation(PASERSSIGNATURE){
  */
 bool checkAssignmentLeft(PASERSSIGNATURE, Statement *left){
     if (left->type == call_function && !checkFormal(left->u.call_function.parameter)){
-        syntaxError(pm, syntax_error, left->line, 1, "Don't get success function definition from Assignment");
+        syntaxError(pm, syntax_error, left->line, 1, "Don't get success function definition from Assignment22");
         return false;
     }
     return true;
@@ -1133,6 +1133,7 @@ bool switchAssignment(PASERSSIGNATURE, int symbol, Statement **st){
     }
     return true;
 }
+
 void parserAssignment(PASERSSIGNATURE){
     return twoOperation(CALLPASERSSIGNATURE, parserTuple, switchAssignment, checkAssignmentLeft, TUPLE, ASSIGNMENT,
                         "polynomial", "assignment", true);

+ 22 - 4
VirtulMathCore/src/parameter.c

@@ -275,10 +275,13 @@ ResultType defaultParameter(Parameter **function_ad, vnum *num, INTER_FUNCTIONSI
             goto return_;
 
         value = result->value;
+        result->value = NULL;
         freeResult(result);
         assCore(function->data.name, value, false, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+        gc_freeTmpLink(&value->gc_status);
         if (!CHECK_RESULT(result))
             goto return_;
+        freeResult(result);
     }
     setResult(result, inter, belong);
 
@@ -586,24 +589,39 @@ ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *f
                 break;
             }
             case mul_par: {
-                LinkValue *tmp = NULL;
-                makeListValue(call, 0, "sys", value_tuple, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-                for (PASS; call != NULL && call->type == value_arg; call = call->next)
+                LinkValue *tmp;
+                Argument *backup;
+                Argument *base = call;
+                for (PASS; call->next != NULL && call->next->type == value_arg; call = call->next)
                     PASS;
+
+                backup = call->next;
+                call->next = NULL;  // 断开Argument,只把value_arg部分传入makeListValue
+                makeListValue(base, 0, "sys", value_tuple, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+                call->next = backup;
+                call = backup;
+
                 returnResult(result);
+                tmp = result->value;
+                result->value = NULL;
                 freeResult(result);
 
                 assCore(function->data.value, tmp, false, false, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
+                gc_freeTmpLink(&tmp->gc_status);
                 returnResult(result);
                 function = function->next;
                 break;
             }
             case space_kwargs:{
-                LinkValue *tmp = makeLinkValue(makeDictValue(NULL, true, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)), belong, inter);
+                LinkValue *tmp;
+                makeDictValue(NULL, true, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
                 returnResult(result);
+                tmp = result->value;
+                result->value = NULL;
                 freeResult(result);
 
                 assCore(function->data.value, tmp, false, false, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
+                gc_freeTmpLink(&tmp->gc_status);
                 returnResult(result);
                 function = function->next;
                 break;