Procházet zdrojové kódy

refactor: 修改inter结构体内部成员为数组

SongZihuan před 4 roky
rodič
revize
19e7fa9380

+ 66 - 72
VirtulMathCore/include/inter.h

@@ -3,6 +3,68 @@
 
 struct Result;
 
+#define BASEOBJSZIE (17)
+#define VARNAMESIZE (8)
+#define BASEEXCESIZE (19)
+#define MAGFUNCSIZE (27)
+
+#define B_OBJECT (0)
+#define B_VOBJECT (1)
+#define B_INT_ (2)
+#define B_DOU (3)
+#define B_STR (4)
+#define B_BOOL (5)
+#define B_PASS (6)
+#define B_LIB (7)
+#define B_FILE (8)
+#define B_TUPLE (9)
+#define B_LIST (10)
+#define B_DICT (11)
+#define B_FUNCTION (12)
+#define B_NONE (13)
+#define B_LISTITER (14)
+#define B_DICTITER (15)
+#define B_POINTER (16)
+
+#define VN_str (0)
+#define VN_num (1)
+#define VN_bool (2)
+#define VN_file (3)
+#define VN_none (4)
+#define VN_pass (5)
+#define VN_class (6)
+#define VN_obj (7)
+
+#define M_INIT (0)
+#define M_NEW (1)
+#define M_CALL (2)
+#define M_ENTER (3)
+#define M_EXIT (4)
+#define M_ADD (5)
+#define M_SUB (6)
+#define M_MUL (7)
+#define M_DIV (8)
+#define M_DEL (9)
+#define M_DOWN (10)
+#define M_SLICE (11)
+#define M_ITER (12)
+#define M_NEXT (13)
+#define M_REPO (14)
+#define M_BOOL (15)
+#define M_NAME (16)
+#define M_SELF (17)
+#define M_FATHER (18)
+#define M_MESSAGE (19)
+#define M_STR (20)
+#define M_DOWN_ASSIGMENT (21)
+#define M_SLICE_ASSIGMENT (22)
+#define M_DOWN_DEL (23)
+#define M_SLICE_DEL (24)
+#define M_ATTR (25)
+#define M_VAL (26)
+
+// TODO-szh 添加val
+
 struct Inter{
     struct Value *base;
     struct LinkValue *link_base;
@@ -20,79 +82,11 @@ struct Inter{
         bool is_stderr;
         bool is_stdin;
 
-        struct LinkValue *object;
-        struct LinkValue *vobject;
-        struct LinkValue *int_;
-        struct LinkValue *dou;
-        struct LinkValue *str;
-        struct LinkValue *bool_;
-        struct LinkValue *pass_;
-        struct LinkValue *lib_;
-        struct LinkValue *file;
-        struct LinkValue *tuple;
-        struct LinkValue *list;
-        struct LinkValue *dict;
-        struct LinkValue *function;
-        struct LinkValue *none;
-        struct LinkValue *list_iter;
-        struct LinkValue *dict_iter;
-        struct LinkValue *pointer;
-
-        struct LinkValue *base_exc;
-        struct LinkValue *sys_exc;
-        struct LinkValue *keyInterrupt_exc;
-        struct LinkValue *quit_exc;
-        struct LinkValue *exc;
-        struct LinkValue *type_exc;
-        struct LinkValue *arg_exc;
-        struct LinkValue *per_exc;
-        struct LinkValue *name_exc;
-        struct LinkValue *goto_exc;
-        struct LinkValue *result_exc;
-        struct LinkValue *assert_exc;
-
-        struct LinkValue *key_exc;
-        struct LinkValue *index_exc;
-        struct LinkValue *stride_exc;
-        struct LinkValue *super_exc;
-        struct LinkValue *iterstop_exc;
-        struct LinkValue *import_exc;
-        struct LinkValue *include_exp;
+        struct LinkValue *base_obj[BASEOBJSZIE];
+        struct LinkValue *base_exc[BASEEXCESIZE];
 
-        wchar_t *var_str_prefix;
-        wchar_t *var_int_prefix;
-        wchar_t *var_bool_prefix;
-        wchar_t *var_file_prefix;
-        wchar_t *var_none;
-        wchar_t *var_pass;
-        wchar_t *var_class_prefix;
-        wchar_t *var_object_prefix;
-        wchar_t *object_init;
-        wchar_t *object_new;
-        wchar_t *object_call;
-        wchar_t *object_enter;
-        wchar_t *object_exit;
-        wchar_t *object_add;
-        wchar_t *object_sub;
-        wchar_t *object_mul;
-        wchar_t *object_div;
-        wchar_t *object_del;
-        wchar_t *object_down;
-        wchar_t *object_slice;
-        wchar_t *object_iter;
-        wchar_t *object_next;
-        wchar_t *object_repo;
-        wchar_t *object_bool;
-        wchar_t *object_name;
-        wchar_t *object_self;
-        wchar_t *object_father;
-        wchar_t *object_message;
-        wchar_t *object_str;
-        wchar_t *object_down_assignment;
-        wchar_t *object_slice_assignment;
-        wchar_t *object_down_del;
-        wchar_t *object_slice_del;
-        wchar_t *object_attr;
+        wchar_t *var_name[VARNAMESIZE];
+        wchar_t *mag_func[MAGFUNCSIZE];
 
         int default_pt_type;
     } data;

+ 1 - 1
VirtulMathCore/include/value.h

@@ -205,7 +205,7 @@ struct Package {
 };
 
 enum BaseErrorType{
-    E_BaseException,
+    E_BaseException = 0,
     E_Exception,
     E_TypeException,
     E_ArgumentException,

+ 5 - 5
VirtulMathCore/ofunc/src/bool.c

@@ -44,9 +44,9 @@ ResultType bool_init(O_FUNC){
 }
 
 void registeredBool(R_FUNC){
-    LinkValue *object = inter->data.bool_;
-    NameFunc tmp[] = {{inter->data.object_new, bool_new, class_free_},
-                      {inter->data.object_init, bool_init, object_free_},
+    LinkValue *object = inter->data.base_obj[B_BOOL];
+    NameFunc tmp[] = {{inter->data.mag_func[M_NEW], bool_new, class_free_},
+                      {inter->data.mag_func[M_INIT], bool_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"bool", object, belong, inter);
@@ -55,7 +55,7 @@ void registeredBool(R_FUNC){
 }
 
 void makeBaseBool(Inter *inter){
-    LinkValue *bool_ = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *bool_ = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&bool_->gc_status);
-    inter->data.bool_ = bool_;
+    inter->data.base_obj[B_BOOL] = bool_;
 }

+ 11 - 11
VirtulMathCore/ofunc/src/dict.c

@@ -154,7 +154,7 @@ ResultType dict_iter(O_FUNC){
     }
     {
         Argument *dict_iter_arg = makeValueArgument(ap[0].value);
-        callBackCore(inter->data.dict_iter, dict_iter_arg, LINEFILE, 0,
+        callBackCore(inter->data.base_obj[B_DICTITER], dict_iter_arg, LINEFILE, 0,
                      CNEXT_NT);
         freeArgument(dict_iter_arg, true);
     }
@@ -245,15 +245,15 @@ ResultType dict_str(O_FUNC){
 }
 
 void registeredDict(R_FUNC){
-    LinkValue *object = inter->data.dict;
+    LinkValue *object = inter->data.base_obj[B_DICT];
     NameFunc tmp[] = {{L"keys", dict_keys, object_free_},
-                      {inter->data.object_new, dict_new, class_free_},
-                      {inter->data.object_down, dict_down, object_free_},
-                      {inter->data.object_iter, dict_iter, object_free_},
-                      {inter->data.object_repo, dict_repo, object_free_},
-                      {inter->data.object_str, dict_str, object_free_},
-                      {inter->data.object_down_assignment, dict_down_assignment, object_free_},
-                      {inter->data.object_down_del, dict_down_del, object_free_},
+                      {inter->data.mag_func[M_NEW], dict_new, class_free_},
+                      {inter->data.mag_func[M_DOWN], dict_down, object_free_},
+                      {inter->data.mag_func[M_ITER], dict_iter, object_free_},
+                      {inter->data.mag_func[M_REPO], dict_repo, object_free_},
+                      {inter->data.mag_func[M_STR], dict_str, object_free_},
+                      {inter->data.mag_func[M_DOWN_ASSIGMENT], dict_down_assignment, object_free_},
+                      {inter->data.mag_func[M_DOWN_DEL], dict_down_del, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"dict", object, belong, inter);
@@ -262,7 +262,7 @@ void registeredDict(R_FUNC){
 }
 
 void makeBaseDict(Inter *inter){
-    LinkValue *dict = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *dict = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&dict->gc_status);
-    inter->data.dict = dict;
+    inter->data.base_obj[B_DICT] = dict;
 }

+ 8 - 8
VirtulMathCore/ofunc/src/dictiter.c

@@ -39,7 +39,7 @@ ResultType dictiter_init(O_FUNC){
         list = result->value;
         result->value = NULL;
 
-        listiter_class = inter->data.list_iter;
+        listiter_class = inter->data.base_obj[B_LISTITER];
         gc_addTmpLink(&listiter_class->gc_status);
 
         list_arg = makeValueArgument(list);
@@ -90,7 +90,7 @@ ResultType dictiter_next(O_FUNC){
     }
 
     freeResult(result);
-    list_next = findAttributes(inter->data.object_next, false, LINEFILE, true, CFUNC_NT(var_list, result, list_));
+    list_next = findAttributes(inter->data.mag_func[M_NEXT], false, LINEFILE, true, CFUNC_NT(var_list, result, list_));
     if (!CHECK_RESULT(result))
         return result->type;
     if (list_next == NULL){
@@ -128,10 +128,10 @@ ResultType dictiter_down(O_FUNC){
 }
 
 void registeredDictIter(R_FUNC){
-    LinkValue *object = inter->data.dict_iter;
-    NameFunc tmp[] = {{inter->data.object_init, dictiter_init, object_free_},
-                      {inter->data.object_next, dictiter_next, object_free_},
-                      {inter->data.object_down, dictiter_down, object_free_},
+    LinkValue *object = inter->data.base_obj[B_DICTITER];
+    NameFunc tmp[] = {{inter->data.mag_func[M_INIT], dictiter_init, object_free_},
+                      {inter->data.mag_func[M_NEXT], dictiter_next, object_free_},
+                      {inter->data.mag_func[M_DOWN], dictiter_down, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"dictiter", object, belong, inter);
@@ -140,7 +140,7 @@ void registeredDictIter(R_FUNC){
 }
 
 void makeBaseDictIter(Inter *inter){
-    LinkValue *dict_iter = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *dict_iter = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&dict_iter->gc_status);
-    inter->data.dict_iter = dict_iter;
+    inter->data.base_obj[B_DICTITER] = dict_iter;
 }

+ 5 - 5
VirtulMathCore/ofunc/src/dou.c

@@ -64,9 +64,9 @@ ResultType dou_init(O_FUNC){
 }
 
 void registeredDou(R_FUNC){
-    LinkValue *object = inter->data.dou;
-    NameFunc tmp[] = {{inter->data.object_new, dou_new, class_free_},
-                      {inter->data.object_init, dou_init, object_free_},
+    LinkValue *object = inter->data.base_obj[B_DOU];
+    NameFunc tmp[] = {{inter->data.mag_func[M_NEW], dou_new, class_free_},
+                      {inter->data.mag_func[M_INIT], dou_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"dou", object, belong, inter);
@@ -75,7 +75,7 @@ void registeredDou(R_FUNC){
 }
 
 void makeBaseDou(Inter *inter){
-    LinkValue *dou = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *dou = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&dou->gc_status);
-    inter->data.dou = dou;
+    inter->data.base_obj[B_DOU] = dou;
 }

+ 40 - 40
VirtulMathCore/ofunc/src/error_.c

@@ -15,8 +15,7 @@ ResultType base_exception_init(O_FUNC){
     if (!CHECK_RESULT(result))
         return result->type;
     freeResult(result);
-    if (addAttributes(inter->data.object_message, false, ap[1].value, LINEFILE, true,
-                      CFUNC_NT(var_list, result, ap[0].value)))
+    if (addAttributes(inter->data.mag_func[M_MESSAGE], false, ap[1].value, LINEFILE, true, CFUNC_NT(var_list, result, ap[0].value)))
         setResult(result, inter);
     return result->type;
 }
@@ -25,27 +24,27 @@ void registeredExcIter(R_FUNC){
     struct {
         wchar_t *name;
         LinkValue *value;
-    } setList[] = {{L"Exception", inter->data.exc},
-                   {L"SystemException", inter->data.sys_exc},
-                   {L"KeyboardInterrupt", inter->data.keyInterrupt_exc},
-                   {L"QuitException", inter->data.quit_exc},
-                   {L"TypeException", inter->data.type_exc},
-                   {L"ArgumentException", inter->data.arg_exc},
-                   {L"PermissionsException", inter->data.per_exc},
-                   {L"ResultException", inter->data.result_exc},
-                   {L"GotoException", inter->data.goto_exc},
-                   {L"NameException", inter->data.name_exc},
-                   {L"AssertException", inter->data.assert_exc},
-                   {L"IndexException", inter->data.index_exc},
-                   {L"KeyException", inter->data.key_exc},
-                   {L"StrideException", inter->data.stride_exc},
-                   {L"IncludeException", inter->data.include_exp},
-                   {L"ImportException", inter->data.import_exc},
-                   {L"IterStopException", inter->data.iterstop_exc},
-                   {L"SuperException", inter->data.super_exc},
+    } setList[] = {{L"Exception", inter->data.base_exc[E_Exception]},
+                   {L"SystemException", inter->data.base_exc[E_SystemException]},
+                   {L"KeyboardInterrupt", inter->data.base_exc[E_KeyInterrupt]},
+                   {L"QuitException", inter->data.base_exc[E_QuitException]},
+                   {L"TypeException", inter->data.base_exc[E_TypeException]},
+                   {L"ArgumentException", inter->data.base_exc[E_ArgumentException]},
+                   {L"PermissionsException", inter->data.base_exc[E_PermissionsException]},
+                   {L"ResultException", inter->data.base_exc[E_ResultException]},
+                   {L"GotoException", inter->data.base_exc[E_GotoException]},
+                   {L"NameException", inter->data.base_exc[E_NameExceptiom]},
+                   {L"AssertException", inter->data.base_exc[E_AssertException]},
+                   {L"IndexException", inter->data.base_exc[E_IndexException]},
+                   {L"KeyException", inter->data.base_exc[E_KeyException]},
+                   {L"StrideException", inter->data.base_exc[E_StrideException]},
+                   {L"IncludeException", inter->data.base_exc[E_IndexException]},
+                   {L"ImportException", inter->data.base_exc[E_ImportException]},
+                   {L"IterStopException", inter->data.base_exc[E_StopIterException]},
+                   {L"SuperException", inter->data.base_exc[E_SuperException]},
                    {NULL, NULL}};
     {
-        LinkValue *object = inter->data.base_exc;
+        LinkValue *object = inter->data.base_exc[E_BaseException];
         NameFunc tmp[] = {{L"__init__", base_exception_init, object_free_},
                           {NULL, NULL}};
         gc_addTmpLink(&object->gc_status);
@@ -58,27 +57,28 @@ void registeredExcIter(R_FUNC){
 }
 
 void makeExcIter(Inter *inter){
-    inter->data.base_exc = makeException(inter->data.object, inter);
-    inter->data.sys_exc = makeException(inter->data.base_exc, inter);
-    inter->data.exc = makeException(inter->data.base_exc, inter);
+    inter->data.base_exc[E_BaseException] = makeException(inter->data.base_obj[B_OBJECT], inter);
 
-    inter->data.keyInterrupt_exc = makeException(inter->data.sys_exc, inter);
-    inter->data.quit_exc = makeException(inter->data.sys_exc, inter);
+    inter->data.base_exc[E_SystemException] = makeException(inter->data.base_exc[E_BaseException], inter);
+    inter->data.base_exc[E_Exception] = makeException(inter->data.base_exc[E_BaseException], inter);
 
-    inter->data.type_exc = makeException(inter->data.exc, inter);
-    inter->data.arg_exc = makeException(inter->data.exc, inter);
-    inter->data.per_exc = makeException(inter->data.exc, inter);
-    inter->data.result_exc = makeException(inter->data.exc, inter);
-    inter->data.goto_exc = makeException(inter->data.exc, inter);
-    inter->data.name_exc = makeException(inter->data.exc, inter);
-    inter->data.assert_exc = makeException(inter->data.exc, inter);
+    inter->data.base_exc[E_KeyInterrupt] = makeException(inter->data.base_exc[E_SystemException], inter);
+    inter->data.base_exc[E_QuitException] = makeException(inter->data.base_exc[E_SystemException], inter);
 
-    inter->data.key_exc = makeException(inter->data.exc, inter);
-    inter->data.index_exc = makeException(inter->data.exc, inter);
-    inter->data.stride_exc = makeException(inter->data.exc, inter);
+    inter->data.base_exc[E_TypeException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_ArgumentException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_PermissionsException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_ResultException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_GotoException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_NameExceptiom] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_AssertException] = makeException(inter->data.base_exc[E_Exception], inter);
 
-    inter->data.iterstop_exc = makeException(inter->data.exc, inter);
-    inter->data.super_exc = makeException(inter->data.exc, inter);
-    inter->data.import_exc = makeException(inter->data.exc, inter);
-    inter->data.include_exp = makeException(inter->data.exc, inter);
+    inter->data.base_exc[E_KeyException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_IndexException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_StrideException] = makeException(inter->data.base_exc[E_Exception], inter);
+
+    inter->data.base_exc[E_StopIterException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_SuperException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_ImportException] = makeException(inter->data.base_exc[E_Exception], inter);
+    inter->data.base_exc[E_IncludeException] = makeException(inter->data.base_exc[E_Exception], inter);
 }

+ 8 - 8
VirtulMathCore/ofunc/src/file_.c

@@ -203,15 +203,15 @@ ResultType file_enter(O_FUNC){
 }
 
 void registeredFile(R_FUNC){
-    LinkValue *object = inter->data.file;
+    LinkValue *object = inter->data.base_obj[B_FILE];
     NameFunc tmp[] = {{L"read", file_read, object_free_},
                       {L"write", file_write, object_free_},
                       {L"close", file_close, object_free_},
-                      {inter->data.object_enter, file_enter, object_free_},
-                      {inter->data.object_del, file_close, object_free_},
-                      {inter->data.object_exit, file_close, object_free_},
-                      {inter->data.object_new, file_new, class_free_},
-                      {inter->data.object_init, file_init, object_free_},
+                      {inter->data.mag_func[M_ENTER], file_enter, object_free_},
+                      {inter->data.mag_func[M_DEL], file_close, object_free_},
+                      {inter->data.mag_func[M_EXIT], file_close, object_free_},
+                      {inter->data.mag_func[M_NEW], file_new, class_free_},
+                      {inter->data.mag_func[M_INIT], file_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"file", object, belong, inter);
@@ -220,7 +220,7 @@ void registeredFile(R_FUNC){
 }
 
 void makeBaseFile(Inter *inter){
-    LinkValue *file = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *file = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&file->gc_status);
-    inter->data.file = file;
+    inter->data.base_obj[B_FILE] = file;
 }

+ 6 - 6
VirtulMathCore/ofunc/src/function.c

@@ -19,7 +19,7 @@ ResultType function_new(O_FUNC){
     }
 
     {
-        Inherit *object_father = getInheritFromValueCore(inter->data.function);
+        Inherit *object_father = getInheritFromValueCore(inter->data.base_obj[B_FUNCTION]);
         VarList *new_var = copyVarList(var_list, false, inter);
         Value *new_object = makeObject(inter, NULL, new_var, object_father);
         value = makeLinkValue(new_object, belong, inter);
@@ -98,7 +98,7 @@ ResultType function_set(O_FUNC){  // 针对FFI设置vaargs
 }
 
 void registeredFunction(R_FUNC){
-    LinkValue *object = inter->data.function;
+    LinkValue *object = inter->data.base_obj[B_FUNCTION];
     NameFunc tmp[] = {{L"set", function_set, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
@@ -108,9 +108,9 @@ void registeredFunction(R_FUNC){
 }
 
 void makeBaseFunction(Inter *inter){
-    LinkValue *function = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *function = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&function->gc_status);
-    inter->data.function = function;
+    inter->data.base_obj[B_FUNCTION] = function;
 }
 
 void functionPresetting(LinkValue *func, LinkValue **func_new, LinkValue **func_init, Inter *inter) {
@@ -125,8 +125,8 @@ void functionPresettingLast(LinkValue *func, LinkValue *func_new, LinkValue *fun
     VarList *object_var = func->value->object.var;
     setResultCore(&result);
 
-    addStrVar(inter->data.object_new, false, true, func_new, LINEFILE, false, CFUNC_NT(object_var, &result, func));
+    addStrVar(inter->data.mag_func[M_NEW], false, true, func_new, LINEFILE, false, CFUNC_NT(object_var, &result, func));
     freeResult(&result);
-    addStrVar(inter->data.object_init, false, true, func_init, LINEFILE, false, CFUNC_NT(object_var, &result, func));
+    addStrVar(inter->data.mag_func[M_INIT], false, true, func_init, LINEFILE, false, CFUNC_NT(object_var, &result, func));
     freeResult(&result);
 }

+ 5 - 5
VirtulMathCore/ofunc/src/int.c

@@ -64,9 +64,9 @@ ResultType int_init(O_FUNC){
 }
 
 void registeredInt(R_FUNC){
-    LinkValue *object = inter->data.int_;
-    NameFunc tmp[] = {{inter->data.object_new,  int_new,  class_free_},
-                      {inter->data.object_init, int_init, object_free_},
+    LinkValue *object = inter->data.base_obj[B_INT_];
+    NameFunc tmp[] = {{inter->data.mag_func[M_NEW],  int_new,  class_free_},
+                      {inter->data.mag_func[M_INIT], int_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"int", object, belong, inter);
@@ -75,7 +75,7 @@ void registeredInt(R_FUNC){
 }
 
 void makeBaseInt(Inter *inter){
-    LinkValue *int_ = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *int_ = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&int_->gc_status);
-    inter->data.int_ = int_;
+    inter->data.base_obj[B_INT_] = int_;
 }

+ 8 - 8
VirtulMathCore/ofunc/src/lib_.c

@@ -152,7 +152,7 @@ ResultType lib_attr(O_FUNC){
         return R_error;
     }
 
-    error = findAttributes(L"val", false, LINEFILE, true, CFUNC_NT(var_list, result, ap[1].value));
+    error = findAttributes(inter->data.mag_func[M_VAL], false, LINEFILE, true, CFUNC_NT(var_list, result, ap[1].value));
     if (!CHECK_RESULT(result))
         return result->type;
     freeResult(result);
@@ -172,13 +172,13 @@ ResultType lib_attr(O_FUNC){
 }
 
 void registeredLib(R_FUNC){
-    LinkValue *object = inter->data.lib_;
+    LinkValue *object = inter->data.base_obj[B_LIB];
     NameFunc tmp[] = {{L"close", lib_close, object_free_},
                       {L"add", lib_add, object_free_},
-                      {inter->data.object_new, lib_new, class_free_},
-                      {inter->data.object_init, lib_init, object_free_},
-                      {inter->data.object_del, lib_close, object_free_},
-                      {inter->data.object_attr, lib_attr, object_free_},
+                      {inter->data.mag_func[M_NEW], lib_new, class_free_},
+                      {inter->data.mag_func[M_INIT], lib_init, object_free_},
+                      {inter->data.mag_func[M_DEL], lib_close, object_free_},
+                      {inter->data.mag_func[M_ATTR], lib_attr, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"clib", object, belong, inter);
@@ -187,7 +187,7 @@ void registeredLib(R_FUNC){
 }
 
 void makeBaseLib(Inter *inter){
-    LinkValue *lib_ = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *lib_ = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&lib_->gc_status);
-    inter->data.lib_ = lib_;
+    inter->data.base_obj[B_LIB] = lib_;
 }

+ 17 - 18
VirtulMathCore/ofunc/src/list.c

@@ -335,8 +335,7 @@ ResultType list_iter(O_FUNC){
     }
     {
         Argument *list_iter_arg = makeValueArgument(ap[0].value);
-        callBackCore(inter->data.list_iter, list_iter_arg, LINEFILE, 0,
-                     CNEXT_NT);
+        callBackCore(inter->data.base_obj[B_LISTITER], list_iter_arg, LINEFILE, 0, CNEXT_NT);
         freeArgument(list_iter_arg, true);
     }
     return result->type;
@@ -421,15 +420,15 @@ ResultType list_str(O_FUNC){
 
 void registeredList(R_FUNC){
     {
-        LinkValue *object = inter->data.tuple;
-        NameFunc tmp[] = {{inter->data.object_new, tuple_new, class_free_},
-                          {inter->data.object_down, list_down, object_free_},
-                          {inter->data.object_slice, list_slice, object_free_},
-                          {inter->data.object_iter, list_iter, object_free_},
-                          {inter->data.object_repo, list_repo, object_free_},
-                          {inter->data.object_str, list_str, object_free_},
-                          {inter->data.object_down_del, list_down_del, object_free_},
-                          {inter->data.object_slice_del, list_slice_del, object_free_},
+        LinkValue *object = inter->data.base_obj[B_TUPLE];
+        NameFunc tmp[] = {{inter->data.mag_func[M_NEW], tuple_new, class_free_},
+                          {inter->data.mag_func[M_DOWN], list_down, object_free_},
+                          {inter->data.mag_func[M_SLICE], list_slice, object_free_},
+                          {inter->data.mag_func[M_ITER], list_iter, object_free_},
+                          {inter->data.mag_func[M_REPO], list_repo, object_free_},
+                          {inter->data.mag_func[M_STR], list_str, object_free_},
+                          {inter->data.mag_func[M_DOWN_DEL], list_down_del, object_free_},
+                          {inter->data.mag_func[M_SLICE_DEL], list_slice_del, object_free_},
                           {NULL, NULL}};
         gc_addTmpLink(&object->gc_status);
         addBaseClassVar(L"tuple", object, belong, inter);
@@ -438,10 +437,10 @@ void registeredList(R_FUNC){
     }
 
     {
-        LinkValue *object = inter->data.list;
-        NameFunc tmp[] = {{inter->data.object_new, list_new, class_free_},
-                          {inter->data.object_down_assignment, list_down_assignment, object_free_},
-                          {inter->data.object_slice_assignment, list_slice_assignment, object_free_},
+        LinkValue *object = inter->data.base_obj[B_LIST];
+        NameFunc tmp[] = {{inter->data.mag_func[M_NEW], list_new, class_free_},
+                          {inter->data.mag_func[M_DOWN_ASSIGMENT], list_down_assignment, object_free_},
+                          {inter->data.mag_func[M_SLICE_ASSIGMENT], list_slice_assignment, object_free_},
                           {NULL, NULL}};
         gc_addTmpLink(&object->gc_status);
         addBaseClassVar(L"list", object, belong, inter);
@@ -451,10 +450,10 @@ void registeredList(R_FUNC){
 }
 
 void makeBaseList(Inter *inter){
-    LinkValue *tuple = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *tuple = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     LinkValue *list = makeBaseChildClass(tuple, inter);
     gc_addStatementLink(&tuple->gc_status);
     gc_addStatementLink(&list->gc_status);
-    inter->data.tuple = tuple;
-    inter->data.list = list;
+    inter->data.base_obj[B_TUPLE] = tuple;
+    inter->data.base_obj[B_LIST] = list;
 }

+ 5 - 5
VirtulMathCore/ofunc/src/listiter.c

@@ -89,9 +89,9 @@ ResultType listiter_next(O_FUNC){
 }
 
 void registeredListIter(R_FUNC){
-    LinkValue *object = inter->data.list_iter;
-    NameFunc tmp[] = {{inter->data.object_init, listiter_init, object_free_},
-                      {inter->data.object_next, listiter_next, object_free_},
+    LinkValue *object = inter->data.base_obj[B_LISTITER];
+    NameFunc tmp[] = {{inter->data.mag_func[M_INIT], listiter_init, object_free_},
+                      {inter->data.mag_func[M_NEXT], listiter_next, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"listiter", object, belong, inter);
@@ -100,7 +100,7 @@ void registeredListIter(R_FUNC){
 }
 
 void makeBaseListIter(Inter *inter){
-    LinkValue *list_iter = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *list_iter = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&list_iter->gc_status);
-    inter->data.list_iter = list_iter;
+    inter->data.base_obj[B_LISTITER] = list_iter;
 }

+ 9 - 9
VirtulMathCore/ofunc/src/object.c

@@ -30,7 +30,7 @@ ResultType objectRepoStrCore(O_FUNC, bool is_repo){
         return result->type;
     freeResult(result);
 
-    name_value = findAttributes(inter->data.object_name, false, LINEFILE, true, CFUNC_NT(var_list, result, ap[0].value));
+    name_value = findAttributes(inter->data.mag_func[M_NAME], false, LINEFILE, true, CFUNC_NT(var_list, result, ap[0].value));
     if (!CHECK_RESULT(result))
         return result->type;
     freeResult(result);
@@ -72,10 +72,10 @@ ResultType object_str(O_FUNC){
 }
 
 void registeredObject(R_FUNC){
-    LinkValue *object = inter->data.object;
-    NameFunc tmp[] = {{inter->data.object_new,  object_new,  class_free_},
-                      {inter->data.object_repo, object_repo, all_free_},
-                      {inter->data.object_str,  object_str,  all_free_},
+    LinkValue *object = inter->data.base_obj[B_OBJECT];
+    NameFunc tmp[] = {{inter->data.mag_func[M_NEW],  object_new,  class_free_},
+                      {inter->data.mag_func[M_REPO], object_repo, all_free_},
+                      {inter->data.mag_func[M_STR],  object_str,  all_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"object", object, belong, inter);
@@ -94,8 +94,8 @@ void makeBaseObject(Inter *inter, LinkValue *belong){
         gc_addStatementLink(&inter->base_belong->gc_status);
     }
 
-    inter->data.object = makeLinkValue(object, g_belong, inter);
-    gc_addStatementLink(&inter->data.object->gc_status);
+    inter->data.base_obj[B_OBJECT] = makeLinkValue(object, g_belong, inter);
+    gc_addStatementLink(&inter->data.base_obj[B_OBJECT]->gc_status);
     for (Inherit *ih=g_belong->value->object.inherit; ih != NULL; ih = ih->next) {
         if (ih->value->value == object)
             ih->value->belong = g_belong;
@@ -109,8 +109,8 @@ void makeBaseObject(Inter *inter, LinkValue *belong){
         object_new(CO_FUNC(arg, inter->var_list, &result, g_belong));
 
         result.value->value->type = V_none;
-        inter->data.none = result.value;
-        gc_addStatementLink(&inter->data.none->gc_status);
+        inter->data.base_obj[B_NONE] = result.value;
+        gc_addStatementLink(&inter->data.base_obj[B_NONE]->gc_status);
 
         freeArgument(arg, true);
         freeResult(&result);

+ 4 - 4
VirtulMathCore/ofunc/src/pass.c

@@ -19,8 +19,8 @@ ResultType pass_new(O_FUNC){
 }
 
 void registeredEllipisis(R_FUNC){
-    LinkValue *object = inter->data.pass_;
-    NameFunc tmp[] = {{inter->data.object_new, pass_new, class_free_},
+    LinkValue *object = inter->data.base_obj[B_PASS];
+    NameFunc tmp[] = {{inter->data.mag_func[M_NEW], pass_new, class_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"ellipsis", object, belong, inter);
@@ -29,7 +29,7 @@ void registeredEllipisis(R_FUNC){
 }
 
 void makeBaseEllipisis(Inter *inter){
-    LinkValue *pass_ = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *pass_ = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&pass_->gc_status);
-    inter->data.pass_ = pass_;
+    inter->data.base_obj[B_PASS] = pass_;
 }

+ 5 - 5
VirtulMathCore/ofunc/src/pointer.c

@@ -52,9 +52,9 @@ ResultType pointer_init(O_FUNC){
 }
 
 void registeredPointer(R_FUNC){
-    LinkValue *object = inter->data.pointer;
-    NameFunc tmp[] = {{inter->data.object_new, pointer_new, class_free_},
-                      {inter->data.object_init, pointer_init, object_free_},
+    LinkValue *object = inter->data.base_obj[B_POINTER];
+    NameFunc tmp[] = {{inter->data.mag_func[M_NEW], pointer_new, class_free_},
+                      {inter->data.mag_func[M_INIT], pointer_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"pointer", object, belong, inter);
@@ -63,7 +63,7 @@ void registeredPointer(R_FUNC){
 }
 
 void makeBasePointer(Inter *inter){
-    LinkValue *pointer = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *pointer = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&pointer->gc_status);
-    inter->data.pointer = pointer;
+    inter->data.base_obj[B_POINTER] = pointer;
 }

+ 11 - 11
VirtulMathCore/ofunc/src/str.c

@@ -185,11 +185,11 @@ ResultType str_iter(O_FUNC){
 }
 
 void registeredStr(R_FUNC){
-    LinkValue *object = inter->data.str;
+    LinkValue *object = inter->data.base_obj[B_STR];
     NameFunc tmp[] = {{L"to_list", str_to_list, object_free_},
-                      {inter->data.object_iter, str_iter, object_free_},
-                      {inter->data.object_down, str_down, object_free_},
-                      {inter->data.object_slice, str_slice, object_free_},
+                      {inter->data.mag_func[M_ITER], str_iter, object_free_},
+                      {inter->data.mag_func[M_DOWN], str_down, object_free_},
+                      {inter->data.mag_func[M_SLICE], str_slice, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     iterBaseClassFunc(tmp, object, CFUNC_CORE(inter->var_list));
@@ -240,15 +240,15 @@ LinkValue *makeFunctionFromValue(LinkValue *func, LinkValue *new, LinkValue *ini
 }
 
 void strFunctionPresetting(LinkValue *func, LinkValue *func_new, LinkValue *func_init, Inter *inter) {
-    LinkValue *obj = inter->data.str;
+    LinkValue *obj = inter->data.base_obj[B_STR];
 
     LinkValue *new_func = NULL;
     LinkValue *new_name = NULL;
-    wchar_t *new_name_ = setStrVarName(inter->data.object_new, false, inter);
+    wchar_t *new_name_ = setStrVarName(inter->data.mag_func[M_NEW], false, inter);
 
     LinkValue *init_func = NULL;
     LinkValue *init_name = NULL;
-    wchar_t *init_name_ = setStrVarName(inter->data.object_init, false, inter);
+    wchar_t *init_name_ = setStrVarName(inter->data.mag_func[M_INIT], false, inter);
 
     new_func = makeFunctionFromValue(func, func_new, func_init, str_new, obj, obj->value->object.var, inter);
     new_func->value->data.function.function_data.pt_type = class_free_;
@@ -256,8 +256,8 @@ void strFunctionPresetting(LinkValue *func, LinkValue *func_new, LinkValue *func
     init_func->value->data.function.function_data.pt_type = object_free_;
 
 
-    new_name = makeStrFromOf(obj, new_func, init_func, inter->data.object_new, inter);
-    init_name = makeStrFromOf(obj, new_func, init_func, inter->data.object_init, inter);
+    new_name = makeStrFromOf(obj, new_func, init_func, inter->data.mag_func[M_NEW], inter);
+    init_name = makeStrFromOf(obj, new_func, init_func, inter->data.mag_func[M_INIT], inter);
 
     addFromVarList(new_name_, new_name, 0, new_func, CFUNC_CORE(obj->value->object.var));
     addFromVarList(init_name_, init_name, 0, init_func, CFUNC_CORE(obj->value->object.var));
@@ -269,7 +269,7 @@ void strFunctionPresetting(LinkValue *func, LinkValue *func_new, LinkValue *func
 }
 
 void makeBaseStr(Inter *inter){
-    LinkValue *str = makeBaseChildClass(inter->data.vobject, inter);
+    LinkValue *str = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
     gc_addStatementLink(&str->gc_status);
-    inter->data.str = str;
+    inter->data.base_obj[B_STR] = str;
 }

+ 1 - 1
VirtulMathCore/ofunc/src/sys.c

@@ -137,7 +137,7 @@ ResultType vm_quit(O_FUNC){
 }
 
 ResultType vm_open(O_FUNC){
-    return callBackCore(inter->data.file, arg, LINEFILE, 0, CNEXT_NT);
+    return callBackCore(inter->data.base_obj[B_FILE], arg, LINEFILE, 0, CNEXT_NT);
 }
 
 ResultType vm_exec(O_FUNC){

+ 10 - 10
VirtulMathCore/ofunc/src/vobject.c

@@ -231,14 +231,14 @@ ResultType vobject_repo(O_FUNC){
 }
 
 void registeredVObject(R_FUNC){
-    LinkValue *object = inter->data.vobject;
-    NameFunc tmp[] = {{inter->data.object_add, vobject_add, object_free_},
-                      {inter->data.object_sub, vobject_sub, object_free_},
-                      {inter->data.object_mul, vobject_mul, object_free_},
-                      {inter->data.object_div, vobject_div, object_free_},
-                      {inter->data.object_bool, vobject_bool, object_free_},
-                      {inter->data.object_repo, vobject_repo, object_free_},
-                      {inter->data.object_str, vobject_repo, object_free_},
+    LinkValue *object = inter->data.base_obj[B_VOBJECT];
+    NameFunc tmp[] = {{inter->data.mag_func[M_ADD], vobject_add, object_free_},
+                      {inter->data.mag_func[M_SUB], vobject_sub, object_free_},
+                      {inter->data.mag_func[M_MUL], vobject_mul, object_free_},
+                      {inter->data.mag_func[M_DIV], vobject_div, object_free_},
+                      {inter->data.mag_func[M_BOOL], vobject_bool, object_free_},
+                      {inter->data.mag_func[M_REPO], vobject_repo, object_free_},
+                      {inter->data.mag_func[M_STR], vobject_repo, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"vobject", object, belong, inter);
@@ -247,7 +247,7 @@ void registeredVObject(R_FUNC){
 }
 
 void makeBaseVObject(Inter *inter){
-    LinkValue *vobject = makeBaseChildClass(inter->data.object, inter);
+    LinkValue *vobject = makeBaseChildClass(inter->data.base_obj[B_OBJECT], inter);
     gc_addStatementLink(&vobject->gc_status);
-    inter->data.vobject = vobject;
+    inter->data.base_obj[B_VOBJECT] = vobject;
 }

+ 24 - 25
VirtulMathCore/src/__run.c

@@ -62,25 +62,25 @@ ResultType getVarInfo(wchar_t **name, int *times, FUNC){
 }
 
 wchar_t *setStrVarName(wchar_t *old, bool free_old, Inter *inter) {
-    return memWidecat(inter->data.var_str_prefix, old, false, free_old);
+    return memWidecat(inter->data.var_name[VN_str], old, false, free_old);
 }
 
 wchar_t *setIntVarName(vint num, struct Inter *inter) {
     wchar_t name[50];
     swprintf(name, 50, L"%lld", num);
-    return memWidecat(inter->data.var_int_prefix, name, false, false);
+    return memWidecat(inter->data.var_name[VN_num], name, false, false);
 }
 
 wchar_t *setDouVarName(vdou num, struct Inter *inter) {
     wchar_t name[50];
     swprintf(name, 50, L"%Lf", num);
-    return memWidecat(inter->data.var_int_prefix, name, false, false);
+    return memWidecat(inter->data.var_name[VN_num], name, false, false);
 }
 
 wchar_t *setPointerVarName(void *num, struct Inter *inter) {
     wchar_t name[50];
     swprintf(name, 50, L"%p", num);
-    return memWidecat(inter->data.var_int_prefix, name, false, false);
+    return memWidecat(inter->data.var_name[VN_num], name, false, false);
 }
 
 wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
@@ -95,29 +95,29 @@ wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
             return setPointerVarName(value->data.pointer.pointer, inter);
         case V_bool:
             if (value->data.bool_.bool_)
-                return memWidecat(inter->data.var_bool_prefix, L"true", false, false);
+                return memWidecat(inter->data.var_name[VN_bool], L"true", false, false);
             else
-                return memWidecat(inter->data.var_bool_prefix, L"false", false, false);
+                return memWidecat(inter->data.var_name[VN_bool], L"false", false, false);
         case V_none:
-            return memWidecpy(inter->data.var_none);
+            return memWidecpy(inter->data.var_name[VN_none]);
         case V_ell:
-            return memWidecpy(inter->data.var_pass);
+            return memWidecpy(inter->data.var_name[VN_pass]);
         case V_file:
-            return memWidecat(inter->data.var_file_prefix, memStrToWcs(value->data.file.path, false), false, true);
+            return memWidecat(inter->data.var_name[VN_file], memStrToWcs(value->data.file.path, false), false, true);
         case V_class:{
-            size_t len = memWidelen(inter->data.var_class_prefix) + 20;  // 预留20个字节给指针
+            size_t len = memWidelen(inter->data.var_name[VN_class]) + 20;  // 预留20个字节给指针
             wchar_t *name = memWide(len);
             wchar_t *return_ = NULL;
-            swprintf(name, len, L"%ls%p", inter->data.var_class_prefix, value);
+            swprintf(name, len, L"%ls%p", inter->data.var_name[VN_class], value);
             return_ = memWidecpy(name);  // 再次复制去除多余的空字节
             memFree(name);
             return return_;
         }
         default:{
-            size_t len = memWidelen(inter->data.var_object_prefix) + 20;
+            size_t len = memWidelen(inter->data.var_name[VN_obj]) + 20;
             wchar_t *name = memWide(len);
             wchar_t *return_ = NULL;
-            swprintf(name, len, L"%ls%p", inter->data.var_object_prefix, value);
+            swprintf(name, len, L"%ls%p", inter->data.var_name[VN_obj], value);  // TODO-szh 修改指针为value.value
             return_ = memWidecpy(name);  // 再次复制去除多余的空字节
             memFree(name);
             return return_;
@@ -385,16 +385,15 @@ bool addAttributes(wchar_t *name, bool free_old, LinkValue *value, fline line, c
 
 void newObjectSetting(LinkValue *name, fline line, char *file, FUNC_NT) {
     setResultCore(result);
-    addAttributes(inter->data.object_name, false, name, line, file, false, CNEXT_NT);
+    addAttributes(inter->data.mag_func[M_NAME], false, name, line, file, false, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return;
     freeResult(result);
 
-    addAttributes(inter->data.object_self, false, belong, line, file, false, CNEXT_NT);
+    addAttributes(inter->data.mag_func[M_SELF], false, belong, line, file, false, CNEXT_NT);
     if (!CHECK_RESULT(result) && belong->value->object.inherit != NULL) {
         freeResult(result);
-        addAttributes(inter->data.object_father, false, belong->value->object.inherit->value, line, file, false,
-                      CNEXT_NT);
+        addAttributes(inter->data.mag_func[M_FATHER], false, belong->value->object.inherit->value, line, file, false, CNEXT_NT);
     }
 }
 
@@ -405,7 +404,7 @@ ResultType getElement(LinkValue *from, LinkValue *index, fline line, char *file,
     gc_addTmpLink(&from->gc_status);
     gc_addTmpLink(&index->gc_status);
 
-    _func_ = findAttributes(inter->data.object_down, false, LINEFILE, true, CFUNC_NT(var_list, result, from));
+    _func_ = findAttributes(inter->data.mag_func[M_DOWN], false, LINEFILE, true, CFUNC_NT(var_list, result, from));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);
@@ -432,9 +431,9 @@ ResultType getIter(LinkValue *value, int status, fline line, char *file, FUNC_NT
     gc_addTmpLink(&value->gc_status);
 
     if (status == 1)
-        _func_ = findAttributes(inter->data.object_iter, false, LINEFILE, true, CFUNC_NT(var_list, result, value));
+        _func_ = findAttributes(inter->data.mag_func[M_ITER], false, LINEFILE, true, CFUNC_NT(var_list, result, value));
     else
-        _func_ = findAttributes(inter->data.object_next, false, LINEFILE, true, CFUNC_NT(var_list, result, value));
+        _func_ = findAttributes(inter->data.mag_func[M_NEXT], false, LINEFILE, true, CFUNC_NT(var_list, result, value));
 
     if (!CHECK_RESULT(result))
         goto return_;
@@ -453,7 +452,7 @@ ResultType getIter(LinkValue *value, int status, fline line, char *file, FUNC_NT
 }
 
 bool checkBool(LinkValue *value, fline line, char *file, FUNC_NT){
-    LinkValue *_bool_ = findAttributes(inter->data.object_bool, false, LINEFILE, true, CFUNC_NT(var_list, result, value));
+    LinkValue *_bool_ = findAttributes(inter->data.mag_func[M_BOOL], false, LINEFILE, true, CFUNC_NT(var_list, result, value));
     if (!CHECK_RESULT(result))
         return false;
     freeResult(result);
@@ -479,7 +478,7 @@ wchar_t *getRepoStr(LinkValue *value, bool is_repo, fline line, char *file, FUNC
     setResultCore(result);
     gc_addTmpLink(&value->gc_status);
 
-    _repo_ = findAttributes(is_repo ? inter->data.object_repo : inter->data.object_str, false, LINEFILE, true, CFUNC_NT(var_list, result, value));
+    _repo_ = findAttributes(is_repo ? inter->data.mag_func[M_REPO] : inter->data.mag_func[M_STR], false, LINEFILE, true, CFUNC_NT(var_list, result, value));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);
@@ -505,11 +504,11 @@ wchar_t *getRepoStr(LinkValue *value, bool is_repo, fline line, char *file, FUNC
 }
 
 bool is_iterStop(LinkValue *value, Inter *inter) {
-    return value->value == inter->data.iterstop_exc->value || checkAttribution(value->value, inter->data.iterstop_exc->value);
+    return value->value == inter->data.base_exc[E_StopIterException]->value || checkAttribution(value->value, inter->data.base_exc[E_StopIterException]->value);
 }
 
 bool is_indexException(LinkValue *value, Inter *inter) {
-    return value->value == inter->data.index_exc->value || checkAttribution(value->value, inter->data.index_exc->value);
+    return value->value == inter->data.base_exc[E_IndexException]->value || checkAttribution(value->value, inter->data.base_exc[E_IndexException]->value);
 }
 
 bool checkAut(enum ValueAuthority value, enum ValueAuthority base, fline line, char *file, char *name, bool pri_auto, FUNC_NT) {
@@ -547,7 +546,7 @@ static int init_new(LinkValue *obj, Argument *arg, fline line, char *file, FUNC_
     LinkValue *_init_ = NULL;
     setResultCore(result);
 
-    _init_ = findAttributes(inter->data.object_init, false, LINEFILE, true, CFUNC_NT(var_list, result, obj));
+    _init_ = findAttributes(inter->data.mag_func[M_INIT], false, LINEFILE, true, CFUNC_NT(var_list, result, obj));
     if (!CHECK_RESULT(result))
         return -1;
     freeResult(result);

+ 48 - 110
VirtulMathCore/src/inter.c

@@ -53,121 +53,59 @@ Inter *makeInter(char *out, char *error_, char *in, LinkValue *belong) {
 }
 
 void setBaseInterData(struct Inter *inter){
-    inter->data.var_str_prefix = setName("str_");
-    inter->data.var_int_prefix = setName("num_");
-    inter->data.var_file_prefix = setName("file_");
-    inter->data.var_none = setName("none");
-    inter->data.var_pass = setName("ellipsis");
-    inter->data.var_bool_prefix = setName("bool_");
-    inter->data.var_class_prefix = setName("class_");
-    inter->data.var_object_prefix = setName("obj_");
-    inter->data.object_init = setName("__init__");
-    inter->data.object_enter = setName("__enter__");
-    inter->data.object_exit = setName("__exit__");
-    inter->data.object_new = setName("__new__");
-    inter->data.object_add = setName("__add__");
-    inter->data.object_sub = setName("__sub__");
-    inter->data.object_mul = setName("__mul__");
-    inter->data.object_div = setName("__div__");
-    inter->data.object_call = setName("__call__");
-    inter->data.object_del = setName("__del__");
-    inter->data.object_down = setName("__down__");
-    inter->data.object_slice = setName("__slice__");
-    inter->data.object_iter = setName("__iter__");
-    inter->data.object_next = setName("__next__");
-    inter->data.object_repo = setName("__repo__");
-    inter->data.object_bool = setName("__bool__");
-    inter->data.object_self = setName("__self__");
-    inter->data.object_name = setName("__name__");
-    inter->data.object_father = setName("__father__");
-    inter->data.object_message = setName("__message__");
-    inter->data.object_str = setName("__str__");
-    inter->data.object_down_assignment = setName("__down_assignment__");
-    inter->data.object_slice_assignment = setName("__slice_assignment__");
-    inter->data.object_down_del = setName("__down_del__");
-    inter->data.object_slice_del = setName("__slice_del__");
-    inter->data.object_attr = setName("__attr__");
+    inter->data.var_name[VN_str] = setName("str_");
+    inter->data.var_name[VN_num] = setName("num_");
+    inter->data.var_name[VN_file] = setName("file_");
+    inter->data.var_name[VN_none] = setName("none");
+    inter->data.var_name[VN_pass] = setName("ellipsis");
+    inter->data.var_name[VN_bool] = setName("bool_");
+    inter->data.var_name[VN_class] = setName("class_");
+    inter->data.var_name[VN_obj] = setName("obj_");
+
+    inter->data.mag_func[M_INIT] = setName("__init__");
+    inter->data.mag_func[M_ENTER] = setName("__enter__");
+    inter->data.mag_func[M_EXIT] = setName("__exit__");
+    inter->data.mag_func[M_NEW] = setName("__new__");
+    inter->data.mag_func[M_ADD] = setName("__add__");
+    inter->data.mag_func[M_SUB] = setName("__sub__");
+    inter->data.mag_func[M_MUL] = setName("__mul__");
+    inter->data.mag_func[M_DIV] = setName("__div__");
+    inter->data.mag_func[M_CALL] = setName("__call__");
+    inter->data.mag_func[M_DEL] = setName("__del__");
+    inter->data.mag_func[M_DOWN] = setName("__down__");
+    inter->data.mag_func[M_SLICE] = setName("__slice__");
+    inter->data.mag_func[M_ITER] = setName("__iter__");
+    inter->data.mag_func[M_NEXT] = setName("__next__");
+    inter->data.mag_func[M_REPO] = setName("__repo__");
+    inter->data.mag_func[M_BOOL] = setName("__bool__");
+    inter->data.mag_func[M_SELF] = setName("__self__");
+    inter->data.mag_func[M_NAME] = setName("__name__");
+    inter->data.mag_func[M_FATHER] = setName("__father__");
+    inter->data.mag_func[M_MESSAGE] = setName("__message__");
+    inter->data.mag_func[M_STR] = setName("__str__");
+    inter->data.mag_func[M_DOWN_ASSIGMENT] = setName("__down_assignment__");
+    inter->data.mag_func[M_SLICE_ASSIGMENT] = setName("__slice_assignment__");
+    inter->data.mag_func[M_DOWN_DEL] = setName("__down_del__");
+    inter->data.mag_func[M_SLICE_DEL] = setName("__slice_del__");
+    inter->data.mag_func[M_ATTR] = setName("__attr__");
+    inter->data.mag_func[M_VAL] = setName("__val__");
+
     inter->data.default_pt_type = free_;
 }
 
 void freeBaseInterData(struct Inter *inter){
     gc_freeStatementLink(&inter->base_belong->gc_status);
-    gc_freeStatementLink(&inter->data.object->gc_status);
-    gc_freeStatementLink(&inter->data.vobject->gc_status);
-    gc_freeStatementLink(&inter->data.int_->gc_status);
-    gc_freeStatementLink(&inter->data.dou->gc_status);
-    gc_freeStatementLink(&inter->data.pointer->gc_status);
-    gc_freeStatementLink(&inter->data.str->gc_status);
-    gc_freeStatementLink(&inter->data.bool_->gc_status);
-    gc_freeStatementLink(&inter->data.function->gc_status);
-    gc_freeStatementLink(&inter->data.pass_->gc_status);
-    gc_freeStatementLink(&inter->data.lib_->gc_status);
-    gc_freeStatementLink(&inter->data.file->gc_status);
-    gc_freeStatementLink(&inter->data.tuple->gc_status);
-    gc_freeStatementLink(&inter->data.list->gc_status);
-    gc_freeStatementLink(&inter->data.dict->gc_status);
-    gc_freeStatementLink(&inter->data.list_iter->gc_status);
-    gc_freeStatementLink(&inter->data.dict_iter->gc_status);
-    gc_freeStatementLink(&inter->data.none->gc_status);
-
-    gc_freeStatementLink(&inter->data.base_exc->gc_status);
-
-    gc_freeStatementLink(&inter->data.sys_exc->gc_status);
-    gc_freeStatementLink(&inter->data.keyInterrupt_exc->gc_status);
-    gc_freeStatementLink(&inter->data.quit_exc->gc_status);
-
-    gc_freeStatementLink(&inter->data.exc->gc_status);
-    gc_freeStatementLink(&inter->data.type_exc->gc_status);
-    gc_freeStatementLink(&inter->data.arg_exc->gc_status);
-    gc_freeStatementLink(&inter->data.per_exc->gc_status);
-    gc_freeStatementLink(&inter->data.result_exc->gc_status);
-    gc_freeStatementLink(&inter->data.goto_exc->gc_status);
-    gc_freeStatementLink(&inter->data.name_exc->gc_status);
-    gc_freeStatementLink(&inter->data.assert_exc->gc_status);
-
-    gc_freeStatementLink(&inter->data.key_exc->gc_status);
-    gc_freeStatementLink(&inter->data.index_exc->gc_status);
-    gc_freeStatementLink(&inter->data.stride_exc->gc_status);
-    gc_freeStatementLink(&inter->data.iterstop_exc->gc_status);
-    gc_freeStatementLink(&inter->data.super_exc->gc_status);
-    gc_freeStatementLink(&inter->data.import_exc->gc_status);
-    gc_freeStatementLink(&inter->data.include_exp->gc_status);
-
-    memFree(inter->data.var_int_prefix);
-    memFree(inter->data.var_str_prefix);
-    memFree(inter->data.var_file_prefix);
-    memFree(inter->data.var_object_prefix);
-    memFree(inter->data.var_class_prefix);
-    memFree(inter->data.var_bool_prefix);
-    memFree(inter->data.var_pass);
-    memFree(inter->data.var_none);
-    memFree(inter->data.object_init);
-    memFree(inter->data.object_enter);
-    memFree(inter->data.object_exit);
-    memFree(inter->data.object_new);
-    memFree(inter->data.object_add);
-    memFree(inter->data.object_sub);
-    memFree(inter->data.object_mul);
-    memFree(inter->data.object_div);
-    memFree(inter->data.object_call);
-    memFree(inter->data.object_del);
-    memFree(inter->data.object_down);
-    memFree(inter->data.object_slice);
-    memFree(inter->data.object_iter);
-    memFree(inter->data.object_next);
-
-    memFree(inter->data.object_repo);
-    memFree(inter->data.object_bool);
-    memFree(inter->data.object_name);
-    memFree(inter->data.object_self);
-    memFree(inter->data.object_father);
-    memFree(inter->data.object_message);
-    memFree(inter->data.object_str);
-    memFree(inter->data.object_down_assignment);
-    memFree(inter->data.object_slice_assignment);
-    memFree(inter->data.object_down_del);
-    memFree(inter->data.object_slice_del);
-    memFree(inter->data.object_attr);
+    for (int i=0; i < BASEOBJSZIE; i ++)
+        gc_freeStatementLink(&inter->data.base_obj[i]->gc_status);
+
+    for (int i=0; i < BASEEXCESIZE; i ++)
+        gc_freeStatementLink(&inter->data.base_exc[i]->gc_status);
+
+    for (int i=0; i < VARNAMESIZE; i ++)
+        memFree(inter->data.var_name[i]);
+
+    for (int i=0; i < MAGFUNCSIZE; i ++)
+        memFree(inter->data.mag_func[i]);
 
     if (!inter->data.is_stdout)
         fclose(inter->data.inter_stdout);

+ 1 - 1
VirtulMathCore/src/ofunc.c

@@ -26,7 +26,7 @@ void registeredBaseFunction(struct LinkValue *father, Inter *inter){
 }
 
 void presetting(Inter *inter) {
-    LinkValue *func = inter->data.function;
+    LinkValue *func = inter->data.base_obj[B_FUNCTION];
     LinkValue *func_new = NULL;
     LinkValue *func_init = NULL;
 

+ 1 - 1
VirtulMathCore/src/run.c

@@ -355,5 +355,5 @@ Statement *checkLabel(Statement *base, wchar_t *label){
 }
 
 bool is_quitExc(LinkValue *value, Inter *inter) {
-    return value->value == inter->data.quit_exc->value || checkAttribution(value->value, inter->data.quit_exc->value);
+    return value->value == inter->data.base_exc[E_QuitException]->value || checkAttribution(value->value, inter->data.base_exc[E_QuitException]->value);
 }

+ 4 - 4
VirtulMathCore/src/runbranch.c

@@ -567,12 +567,12 @@ ResultType forBranch(FUNC) {
 static bool getEnterExit(LinkValue *value, LinkValue **_enter_, LinkValue **_exit_, fline line, char *file, FUNC_NT) {
     setResultCore(result);
 
-    *_enter_ = findAttributes(inter->data.object_enter, false, LINEFILE, true, CFUNC_NT(var_list, result, value));
+    *_enter_ = findAttributes(inter->data.mag_func[M_ENTER], false, LINEFILE, true, CFUNC_NT(var_list, result, value));
     if (!CHECK_RESULT(result))
         return false;
     freeResult(result);
 
-    *_exit_ = findAttributes(inter->data.object_exit, false, LINEFILE, true, CFUNC_NT(var_list, result, value));
+    *_exit_ = findAttributes(inter->data.mag_func[M_EXIT], false, LINEFILE, true, CFUNC_NT(var_list, result, value));
     if (!CHECK_RESULT(result))
         return false;
     freeResult(result);
@@ -609,12 +609,12 @@ static int runWithList(StatementList *with_list, LinkValue **with_belong, LinkVa
         *with_belong = belong;
         gc_addTmpLink(&(*with_belong)->gc_status);
 
-        *_enter_ = findAttributes(inter->data.object_enter, false, LINEFILE, true, CFUNC_NT(var_list, result, *value));
+        *_enter_ = findAttributes(inter->data.mag_func[M_ENTER], false, LINEFILE, true, CFUNC_NT(var_list, result, *value));
         if (!CHECK_RESULT(result))
             goto error_;
         freeResult(result);
 
-        *_exit_ = findAttributes(inter->data.object_exit, false, LINEFILE, true, CFUNC_NT(var_list, result, *value));
+        *_exit_ = findAttributes(inter->data.mag_func[M_EXIT], false, LINEFILE, true, CFUNC_NT(var_list, result, *value));
         if (!CHECK_RESULT(result))
             goto error_;
         freeResult(result);

+ 3 - 3
VirtulMathCore/src/runcall.c

@@ -124,7 +124,7 @@ ResultType elementSlice(FUNC) {
     result->value = NULL;
     freeResult(result);
 
-    func_name = st->u.slice_.type == SliceType_down_ ? inter->data.object_down : inter->data.object_slice;
+    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));
     if (!CHECK_RESULT(result))
         goto return_;
@@ -187,7 +187,7 @@ static ResultType callClass(LinkValue *class_value, Argument *arg, fline line, c
     setResultCore(result);
     gc_addTmpLink(&class_value->gc_status);
 
-    _new_ = findAttributes(inter->data.object_new, false, LINEFILE, true, CFUNC_NT(var_list, result, class_value));
+    _new_ = findAttributes(inter->data.mag_func[M_NEW], false, LINEFILE, true, CFUNC_NT(var_list, result, class_value));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);
@@ -210,7 +210,7 @@ static ResultType callObject(LinkValue *object_value, Argument *arg, fline line,
     setResultCore(result);
     gc_addTmpLink(&object_value->gc_status);
 
-    _call_ = findAttributes(inter->data.object_call, false, LINEFILE, true, CFUNC_NT(var_list, result, object_value));
+    _call_ = findAttributes(inter->data.mag_func[M_CALL], false, LINEFILE, true, CFUNC_NT(var_list, result, object_value));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);

+ 10 - 10
VirtulMathCore/src/runoperation.c

@@ -17,16 +17,16 @@ ResultType operationStatement(FUNC) {
     setResultCore(result);
     switch (st->u.operation.OperationType) {
         case OPT_ADD:
-            operationCore(CNEXT, inter->data.object_add);
+            operationCore(CNEXT, inter->data.mag_func[M_ADD]);
             break;
         case OPT_SUB:
-            operationCore(CNEXT, inter->data.object_sub);
+            operationCore(CNEXT, inter->data.mag_func[M_SUB]);
             break;
         case OPT_MUL:
-            operationCore(CNEXT, inter->data.object_mul);
+            operationCore(CNEXT, inter->data.mag_func[M_MUL]);
             break;
         case OPT_DIV:
-            operationCore(CNEXT, inter->data.object_div);
+            operationCore(CNEXT, inter->data.mag_func[M_DIV]);
             break;
         case OPT_ASS:
             assOperation(CNEXT);
@@ -225,9 +225,9 @@ ResultType downDel(Statement *name, FUNC_NT) {
     freeResult(result);
 
     if (name->u.slice_.type == SliceType_down_)
-        _func_ = findAttributes(inter->data.object_down_del, false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
+        _func_ = findAttributes(inter->data.mag_func[M_DOWN_DEL], false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
     else
-        _func_ = findAttributes(inter->data.object_slice_del, false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
+        _func_ = findAttributes(inter->data.mag_func[M_DOWN_DEL], false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);
@@ -384,9 +384,9 @@ ResultType downAss(Statement *name, LinkValue *value, FUNC_NT) {
     freeResult(result);
 
     if (name->u.slice_.type == SliceType_down_)
-        _func_ = findAttributes(inter->data.object_down_assignment, false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
+        _func_ = findAttributes(inter->data.mag_func[M_DOWN_ASSIGMENT], false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
     else
-        _func_ = findAttributes(inter->data.object_slice_assignment, false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
+        _func_ = findAttributes(inter->data.mag_func[M_SLICE_ASSIGMENT], false, LINEFILE, true, CFUNC_NT(var_list, result, iter));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);
@@ -468,7 +468,7 @@ ResultType getVar(FUNC, VarInfo var_info) {
             Result tmp;
             LinkValue *_attr_;
             setResultCore(&tmp);
-            addAttributes(L"val", false, val, st->line, st->code_file, true, CFUNC_NT(var_list, &tmp, result->value));
+            addAttributes(inter->data.mag_func[M_VAL], false, val, st->line, st->code_file, true, CFUNC_NT(var_list, &tmp, result->value));
             if (!RUN_TYPE(tmp.type)) {
                 freeResult(result);
                 *result = tmp;
@@ -476,7 +476,7 @@ ResultType getVar(FUNC, VarInfo var_info) {
             }
 
             freeResult(&tmp);
-            _attr_ = findAttributes(inter->data.object_attr, false, LINEFILE, true, CFUNC_NT(var_list, &tmp, belong));
+            _attr_ = findAttributes(inter->data.mag_func[M_ATTR], false, LINEFILE, true, CFUNC_NT(var_list, &tmp, belong));
             if (!RUN_TYPE(tmp.type)) {
                 freeResult(result);
                 *result = tmp;

+ 22 - 63
VirtulMathCore/src/value.c

@@ -6,8 +6,8 @@ Value *makeObject(Inter *inter, VarList *object, VarList *out_var, Inherit *inhe
     setGC(&tmp->gc_status);
     tmp->type = V_obj;
     tmp->gc_next = NULL;
-    if (inter->data.object != NULL && inherit == NULL)
-        inherit = makeInherit(inter->data.object);
+    if (inter->data.base_obj[B_OBJECT] != NULL && inherit == NULL)
+        inherit = makeInherit(inter->data.base_obj[B_OBJECT]);
     if (out_var == NULL && inherit != NULL)
         out_var = copyVarList(inherit->value->value->object.out_var, false, inter);
     tmp->object.var = makeObjectVarList(inherit, inter, object);
@@ -30,7 +30,7 @@ Value *makeObject(Inter *inter, VarList *object, VarList *out_var, Inherit *inhe
 }
 
 Value *useNoneValue(Inter *inter, Result *result) {
-    LinkValue *tmp = inter->data.none;
+    LinkValue *tmp = inter->data.base_obj[B_NONE];
     if (result != NULL) {
         setResultCore(result);
         result->type = R_opt;
@@ -43,7 +43,7 @@ Value *useNoneValue(Inter *inter, Result *result) {
 Value *makeBoolValue(bool bool_num, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
     setResultCore(result);
-    callBackCore(inter->data.bool_, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_BOOL], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -54,7 +54,7 @@ Value *makeBoolValue(bool bool_num, fline line, char *file, FUNC_NT) {
 Value *makePassValue(fline line, char *file, FUNC_NT){  // TODO-szh 让切片支持该语法 检查语法解析器支持 a[::]的语法
     Value *tmp = NULL;
     setResultCore(result);
-    callBackCore(inter->data.pass_, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_PASS], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -64,7 +64,7 @@ Value *makePassValue(fline line, char *file, FUNC_NT){  // TODO-szh 让切片支
 Value *makeIntValue(vint num, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
     setResultCore(result);
-    callBackCore(inter->data.int_, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_INT_], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -79,7 +79,7 @@ Value *makeDouValue(vdou num, fline line, char *file, FUNC_NT) {
         setResultError(E_TypeException, L"decimal exception / [inf/nan]", LINEFILE, true, CNEXT_NT);
         return NULL;
     }
-    callBackCore(inter->data.dou, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_DOU], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -90,7 +90,7 @@ Value *makeDouValue(vdou num, fline line, char *file, FUNC_NT) {
 Value *makePointerValue(void *p, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
     setResultCore(result);
-    callBackCore(inter->data.pointer, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_POINTER], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -101,7 +101,7 @@ Value *makePointerValue(void *p, fline line, char *file, FUNC_NT) {
 Value *makeStringValue(wchar_t *str, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
     setResultCore(result);
-    callBackCore(inter->data.str, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_STR], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
 
@@ -113,7 +113,7 @@ Value *makeStringValue(wchar_t *str, fline line, char *file, FUNC_NT) {
 
 Value *makeVMFunctionValue(Statement *st, Parameter *pt, FUNC_NT) {
     Value *tmp = NULL;
-    callBackCore(inter->data.function, NULL, st->line, st->code_file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_FUNCTION], NULL, st->line, st->code_file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -131,7 +131,7 @@ Value *makeVMFunctionValue(Statement *st, Parameter *pt, FUNC_NT) {
 
 Value *makeCFunctionValue(OfficialFunction of, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
-    callBackCore(inter->data.function, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_FUNCTION], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -150,7 +150,7 @@ Value *makeCFunctionValue(OfficialFunction of, fline line, char *file, FUNC_NT)
 
 Value *makeFFunctionValue(void (*ffunc)(), fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
-    callBackCore(inter->data.function, NULL, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_FUNCTION], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -208,9 +208,9 @@ Value *makeListValue(Argument *arg, fline line, char *file, enum ListType type,
     Value *tmp = NULL;
     setResultCore(result);
     if (type == L_list)
-        callBackCore(inter->data.list, arg, line, file, 0, CNEXT_NT);
+        callBackCore(inter->data.base_obj[B_LIST], arg, line, file, 0, CNEXT_NT);
     else
-        callBackCore(inter->data.tuple, arg, line, file, 0, CNEXT_NT);
+        callBackCore(inter->data.base_obj[B_TUPLE], arg, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -220,7 +220,7 @@ Value *makeListValue(Argument *arg, fline line, char *file, enum ListType type,
 Value *makeDictValue(Argument *arg, bool new_hash, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
     setResultCore(result);
-    callBackCore(inter->data.dict, arg, line, file, 0, CNEXT_NT);
+    callBackCore(inter->data.base_obj[B_DICT], arg, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;
     tmp = result->value->value;
@@ -338,53 +338,12 @@ void setResultErrorSt(BaseErrorType type, wchar_t *error_message, bool new, Stat
     setResultError(type, error_message, st->line, st->code_file, new, CNEXT_NT);
 }
 
-LinkValue *findBaseError(BaseErrorType type, Inter *inter){
-    switch (type) {
-        case E_BaseException:
-            return inter->data.base_exc;
-        case E_Exception:
-            return inter->data.exc;
-        case E_TypeException:
-            return inter->data.type_exc;
-        case E_ArgumentException:
-            return inter->data.arg_exc;
-        case E_PermissionsException:
-            return inter->data.per_exc;
-        case E_GotoException:
-            return inter->data.goto_exc;
-        case E_ResultException:
-            return inter->data.result_exc;
-        case E_NameExceptiom:
-            return inter->data.name_exc;
-        case E_AssertException:
-            return inter->data.assert_exc;
-        case E_IndexException:
-            return inter->data.index_exc;
-        case E_KeyException:
-            return inter->data.key_exc;
-        case E_StrideException:
-            return inter->data.stride_exc;
-        case E_StopIterException:
-            return inter->data.iterstop_exc;
-        case E_SuperException:
-            return inter->data.super_exc;
-        case E_ImportException:
-            return inter->data.import_exc;
-        case E_IncludeException:
-            return inter->data.include_exp;
-        case E_SystemException:
-            return inter->data.sys_exc;
-        case E_KeyInterrupt:
-            return inter->data.keyInterrupt_exc;
-        case E_QuitException:
-            return inter->data.quit_exc;
-        default:
-            return NULL;
-    }
+LinkValue *findBaseError(BaseErrorType type, Inter *inter){  // TODO-szh 撤销该函数
+    return inter->data.base_exc[type];
 }
 
 static wchar_t *getErrorInfo(LinkValue *exc, int type, FUNC_NT){
-    wchar_t *str_name = type == 1 ? inter->data.object_name : inter->data.object_message;
+    wchar_t *str_name = type == 1 ? inter->data.mag_func[M_NAME] : inter->data.mag_func[M_MESSAGE];
     LinkValue *_info_;
     setResultCore(result);
     gc_addTmpLink(&exc->gc_status);
@@ -407,7 +366,7 @@ void callException(LinkValue *exc, wchar_t *message, fline line, char *file, FUN
     setResultCore(result);
     gc_addTmpLink(&exc->gc_status);
 
-    _new_ = findAttributes(inter->data.object_new, false, LINEFILE, true, CFUNC_NT(var_list, result, exc));
+    _new_ = findAttributes(inter->data.mag_func[M_NEW], false, LINEFILE, true, CFUNC_NT(var_list, result, exc));
     if (!CHECK_RESULT(result))
         goto return_;
     freeResult(result);
@@ -459,7 +418,7 @@ void setResultError(BaseErrorType type, wchar_t *error_message, fline line, char
     if (new) {
         LinkValue *exc = findBaseError(type, inter);
         if (exc == NULL)
-            exc = inter->data.base_exc;
+            exc = inter->data.base_exc[E_BaseException];
         freeResult(result);
         callException(exc, error_message, line, file, CNEXT_NT);
     }
@@ -642,7 +601,7 @@ Value *checkPackage(Package *base, char *md5, char *name) {
 }
 
 bool needDel(Value *object_value, Inter *inter) {
-    LinkValue *_del_ = checkStrVar(inter->data.object_del, false, CFUNC_CORE(object_value->object.var));
+    LinkValue *_del_ = checkStrVar(inter->data.mag_func[M_DEL], false, CFUNC_CORE(object_value->object.var));
     enum FunctionPtType type;
     if (_del_ == NULL)
         return false;
@@ -655,7 +614,7 @@ bool needDel(Value *object_value, Inter *inter) {
 }
 
 bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_list) {
-    LinkValue *_del_ = findStrVarOnly(inter->data.object_del, false, CFUNC_CORE(object_value->object.var));
+    LinkValue *_del_ = findStrVarOnly(inter->data.mag_func[M_DEL], false, CFUNC_CORE(object_value->object.var));
     setResultCore(result);
 
     if (_del_ != NULL){