浏览代码

refactor: 提取了obj的__new__函数

SongZihuan 4 年之前
父节点
当前提交
66245532c6

+ 1 - 1
VirtulMathCore/CMakeLists.txt

@@ -13,7 +13,7 @@ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/file FILE_LIST)
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/gc GC_LIST)
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/ofunc/src OFUNC_LIST)
-AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/ofunc/c_lib CLIB_LIST)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/ofunc/clib CLIB_LIST)
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/signalhandler HANDLER_LIST)
 
 ADD_LIBRARY(VirtualMathCore STATIC ${SRC_LIST} ${GC_LIST} ${PASER_LIST} ${MEM_LIST} ${FILE_LIST} ${ARGUMENT_LIST} ${OFUNC_LIST} ${HANDLER_LIST} ${CLIB_LIST})

+ 0 - 0
VirtulMathCore/ofunc/c_lib/manager.c → VirtulMathCore/ofunc/clib/manager.c


+ 26 - 27
VirtulMathCore/ofunc/src/object.c

@@ -1,5 +1,22 @@
 #include "__ofunc.h"
 
+//ResultType object_new(OFFICAL_FUNCTIONSIG){
+//    LinkValue *value = NULL;
+//    setResultCore(result);
+//    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
+//                           {.must=-1}};
+//    int status = 1;
+//    arg = parserValueArgument(ap, arg, &status, NULL);
+//    if (status != 1){
+//        setResultError(E_ArgumentException, FEW_ARG, 0, "object", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+//        return error_return;
+//    }
+//
+//    value = make_new(inter, belong, ap[0].value);
+//    init_new(value, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+//    return result->type;
+//}
+
 ResultType object_new(OFFICAL_FUNCTIONSIG){
     LinkValue *value = NULL;
     LinkValue *_init_ = NULL;
@@ -13,34 +30,16 @@ ResultType object_new(OFFICAL_FUNCTIONSIG){
         return error_return;
     }
 
-    {
-        Inherit *object_father = getInheritFromValueCore(ap[0].value);
-        VarList *new_var = copyVarList(ap[0].value->value->object.out_var, false, inter);
-        Value *new_object = makeObject(inter, NULL, new_var, object_father);
-        value = makeLinkValue(new_object, belong, inter);
-        setResultOperation(result, value);
-    }
-
-    _init_ = findAttributes(inter->data.object_init, false, value, inter);
+    value = make_new(inter, belong, ap[0].value);
 
-    if (_init_ != NULL){
-        Result _init_result;
-        setResultCore(&_init_result);
-        _init_->belong = value;
-
-        gc_addTmpLink(&_init_->gc_status);
-        callBackCore(_init_, arg, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &_init_result, value));
-        gc_freeTmpLink(&_init_->gc_status);
-        if (!RUN_TYPE(_init_result.type)){
+    switch (init_new(value, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong))) {
+        case 1:
             freeResult(result);
-            *result = _init_result;
-            goto return_;
-        }
-        freeResult(&_init_result);
-    } else if (arg != NULL)
-        setResultError(E_ArgumentException, MANY_ARG, 0, "object", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
-
-    return_:
+            setResultOperation(result, value);
+            break;
+        default:
+            break;
+    }
     return result->type;
 }
 
@@ -74,7 +73,7 @@ ResultType objectRepoStrCore(OFFICAL_FUNCTIONSIG, bool is_repo){
     else
         type = "object";
 
-    len = memStrlen(name) + 26;
+    len = memStrlen(name) + 30;
     repo = memCalloc(len, sizeof(char ));
     snprintf(repo, len, "(%s: %s on %p)", type, name, ap[0].value->value);
     setResultOperationBase(result, makeLinkValue(makeStringValue(repo, inter), belong, inter));

+ 4 - 3
VirtulMathCore/parser/syntax.c

@@ -413,9 +413,10 @@ int getMatherStatus(LexFile *file, LexMathers *mathers) {
 }
 
 int lexFilter(LexFile *file, int status){
-    if (status == MATHER_SPACE || status == MATHER_NOTENTER || status == MATHER_COMMENT)
-        return -1;
-    if (file->filter_data.enter != 0 && status == MATHER_ENTER)
+    if (status == MATHER_SPACE ||
+        status == MATHER_NOTENTER ||
+        status == MATHER_COMMENT ||
+        file->filter_data.enter != 0 && status == MATHER_ENTER)
         return -1;
     return status;
 }

+ 23 - 0
VirtulMathCore/src/__run.c

@@ -372,3 +372,26 @@ bool checkAut(enum ValueAuthority value, enum ValueAuthority base, fline line, c
     }
     return true;
 }
+
+LinkValue *make_new(Inter *inter, LinkValue *belong, LinkValue *class){
+    Inherit *object_father = getInheritFromValueCore(class);
+    VarList *new_var = copyVarList(class->value->object.out_var, false, inter);
+    Value *new_object = makeObject(inter, NULL, new_var, object_father);
+    return makeLinkValue(new_object, belong, inter);
+}
+
+int init_new(LinkValue *obj, Argument *arg, INTER_FUNCTIONSIG_NOT_ST){
+    LinkValue *_init_ = NULL;
+    _init_ = findAttributes(inter->data.object_init, false, obj, inter);
+
+    if (_init_ == NULL) {
+        setResultError(E_ArgumentException, MANY_ARG, 0, "object", true,
+                       CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+        return 0;
+    }
+    _init_->belong = obj;
+    gc_addTmpLink(&_init_->gc_status);
+    callBackCore(_init_, arg, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, obj));
+    gc_freeTmpLink(&_init_->gc_status);
+    return CHECK_RESULT(result) ? 1 : -1;
+}

+ 2 - 0
VirtulMathCore/src/include/__run.h

@@ -34,4 +34,6 @@ 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 checkAut(enum ValueAuthority value, enum ValueAuthority base, fline line, char *file, char *name, bool pri_auto, INTER_FUNCTIONSIG_NOT_ST);
+LinkValue *make_new(Inter *inter, LinkValue *belong, LinkValue *class);
+int init_new(LinkValue *obj, Argument *arg, INTER_FUNCTIONSIG_NOT_ST);
 #endif //VIRTUALMATH___RUN_H