Forráskód Böngészése

fix: 修复callException的result和gc问题

callException没有把Exception写入到result.value中
callException的gc机制没有做合适处理(Exception被重复写入tmp link)
已经修复上述问题
SongZihuan 4 éve
szülő
commit
53dabf2eb8

+ 7 - 3
VirtulMathCore/ofunc/src/str.c

@@ -198,18 +198,22 @@ void registeredStr(R_FUNC){
 }
 
 LinkValue *callClassOf(LinkValue *obj, Inter *inter, LinkValue *new_func, LinkValue *init_func) {
-    Argument *arg = makeValueArgument(obj);
+    Argument *arg;
+    Argument *init_arg;
     Result result;
     LinkValue *new_name;
     setResultCore(&result);
 
+    arg = makeValueArgument(obj);
     new_func->value->data.function.of(arg, obj, &result, inter, new_func->value->object.out_var);
     new_name = result.value;
     freeResult(&result);
+    freeArgument(arg, true);
 
-    init_func->value->data.function.of(arg, new_name, &result, inter, init_func->value->object.out_var);
+    init_arg = makeValueArgument(new_name);
+    init_func->value->data.function.of(init_arg, new_name, &result, inter, init_func->value->object.out_var);
     freeResult(&result);
-    freeArgument(arg, true);
+    freeArgument(init_arg, true);
 
     return new_name;
 }

+ 0 - 1
VirtulMathCore/src/__run.c

@@ -532,7 +532,6 @@ static int init_new(LinkValue *obj, Argument *arg, fline line, char *file, FUNC_
         return -1;
     freeResult(result);
 
-
     if (_init_ == NULL) {
         if (arg != NULL) {
             setResultError(E_ArgumentException, MANY_ARG, line, file, true, CNEXT_NT);

+ 0 - 1
VirtulMathCore/src/run.c

@@ -45,7 +45,6 @@ ResultType runStatement(FUNC) {
             break;
         case call_function:
             type = callBack(CNEXT);
-            printf("TAG A\n");
             break;
         case if_branch:
             type = ifBranch(CNEXT);

+ 5 - 1
VirtulMathCore/src/value.c

@@ -380,7 +380,8 @@ void callException(LinkValue *exc, wchar_t *message, fline line, char *file, FUN
         callBackCore(_new_, arg, line, file, 0, CNEXT_NT);
         error = result->value;
         result->value = NULL;
-        freeResult(result);
+        freeResult(result);  // 没有释放error的tmp link, 等于error的tmp link添加了两次
+
         gc_freeTmpLink(&_new_->gc_status);
         freeArgument(arg, true);
 
@@ -392,6 +393,8 @@ void callException(LinkValue *exc, wchar_t *message, fline line, char *file, FUN
         if (!CHECK_RESULT(result))
             goto return_;
         freeResult(result);
+        setResultOperation(result, error);  // 自动再次添加error的tmp link, error目前tmp link被添加了两次
+        gc_freeTmpLink(&error->gc_status);  // 释放error的tmp link
     }
     else {
         result->value = exc;
@@ -414,6 +417,7 @@ void setResultError(BaseErrorType type, wchar_t *error_message, fline line, char
             exc = inter->data.base_exc;
         freeResult(result);
         callException(exc, error_message, line, file, CNEXT_NT);
+        printf("result is %p hhh\n", result->value);
     }
     else
         result->error = connectError(makeError(NULL, NULL, line, file), result->error);