Эх сурвалжийг харах

fix: 修复了object的__str__的bug

该方法中获取对象的__name__属性, 同时又重复调用__name__的__str__方法
SongZihuan 4 жил өмнө
parent
commit
076a7e5b18

+ 7 - 7
vmcore/ofunc/src/object.c

@@ -36,12 +36,12 @@ ResultType objectRepoStrCore(O_FUNC, bool is_repo){
     freeResult(result);
 
     if (name_value != NULL){
-        gc_addTmpLink(&name_value->gc_status);
-        name = getRepoStr(name_value, is_repo, LINEFILE, CNEXT_NT);
-        gc_freeTmpLink(&name_value->gc_status);
-        if (!CHECK_RESULT(result))
+        if (name_value->value->type == V_str)
+            name = name_value->value->data.str.str;
+        else {
+            setResultError(E_TypeException, ONLY_ACC(obj.__name__, str), LINEFILE, true, CNEXT_NT);
             return result->type;
-        freeResult(result);
+        }
     } else
         name = L"unknown";
 
@@ -50,11 +50,11 @@ ResultType objectRepoStrCore(O_FUNC, bool is_repo){
     } else {
         size_t len;
         if (ap[0].value->value->type == V_class)
-            type = L"V_class";
+            type = L"class";
         else
             type = L"object";
         len = memWidelen(name) + 30;
-        repo = memCalloc(len, sizeof(char ));
+        repo = memWide(len);
         swprintf(repo, len, L"(%ls: %ls on %p)", type, name, ap[0].value->value);
     }
 

+ 3 - 3
vmcore/ofunc/src/str.c

@@ -40,7 +40,7 @@ ResultType str_init(O_FUNC){
         memFree(base->value->data.str.str);
         base->value->data.str.str = memWidecpy(str);
     }
-    setResultBase(result, inter);
+    setResult(result, inter);
     return result->type;
 }
 
@@ -97,7 +97,7 @@ ResultType str_down(O_FUNC){
                            {.must=-1}};
     vint size;
     vint index;
-    wchar_t element[2];  // TODO-szh 设置为空
+    wchar_t element[2] = { NUL };
     setResultCore(result);
     parserArgumentUnion(ap, arg, CNEXT_NT);
     if (!CHECK_RESULT(result))
@@ -141,7 +141,7 @@ ResultType str_to_list(O_FUNC){
     {
         Argument *new_list = NULL;
         for (vint i = 0; i < size; i ++) {
-            wchar_t str[2] = { NUL };  // TODO-szh 设置为空
+            wchar_t str[2] = { NUL };
             str[0] = ap[0].value->value->data.str.str[i];
             makeStringValue(str, LINEFILE, CNEXT_NT);
             new_list = connectValueArgument(result->value, new_list);

+ 1 - 2
vmcore/src/runcall.c

@@ -8,7 +8,7 @@ ResultType setClass(FUNC) {
 
     call = getArgument(st->u.set_class.father, false, CNEXT_NT);
     if (!CHECK_RESULT(result))
-        goto error_return;
+        return result->type;
 
     class_inherit = setFather(call);
     freeArgument(call, false);
@@ -54,7 +54,6 @@ ResultType setClass(FUNC) {
 
     error_:
     gc_freeTmpLink(&tmp->gc_status);
-    error_return:
     setResultErrorSt(E_BaseException, NULL, false, st, CNEXT_NT);
     return result->type;
 }

+ 1 - 1
vmcore/src/runoperation.c

@@ -412,7 +412,7 @@ ResultType varAss(Statement *name, LinkValue *value, bool check_aut, bool settin
         goto error_;
     if (setting) {
         freeResult(result);
-        newObjectSetting(value, name->line, name->code_file, value, result, inter, var_list);
+        newObjectSetting(name_, name->line, name->code_file, value, result, inter, var_list);
         if (!CHECK_RESULT(result))
             goto error_;
     }