فهرست منبع

feat: 设置元组和列表

SongZihuan 4 سال پیش
والد
کامیت
cd48b96e65
18فایلهای تغییر یافته به همراه121 افزوده شده و 122 حذف شده
  1. 1 0
      include/inter.h
  2. 1 0
      ofunc/include/__ofunc.h
  3. 16 0
      ofunc/src/__ofunc.c
  4. 1 8
      ofunc/src/bool.c
  5. 1 8
      ofunc/src/dict.c
  6. 1 8
      ofunc/src/dictiter.c
  7. 1 8
      ofunc/src/error_.c
  8. 1 8
      ofunc/src/function.c
  9. 25 17
      ofunc/src/list.c
  10. 1 8
      ofunc/src/listiter.c
  11. 38 9
      ofunc/src/num.c
  12. 1 8
      ofunc/src/object.c
  13. 1 8
      ofunc/src/pass.c
  14. 1 8
      ofunc/src/str.c
  15. 1 8
      ofunc/src/vobject.c
  16. 1 0
      src/inter.c
  17. 19 14
      src/runcall.c
  18. 10 2
      src/value.c

+ 1 - 0
include/inter.h

@@ -25,6 +25,7 @@ struct Inter{
         struct Value *str;
         struct Value *bool_;
         struct Value *pass_;
+        struct Value *tuple;
         struct Value *list;
         struct Value *dict;
         struct Value *function;

+ 1 - 0
ofunc/include/__ofunc.h

@@ -7,6 +7,7 @@
 
 LinkValue *registeredFunctionCore(OfficialFunction of, char *name, struct LinkValue *belong, INTER_FUNCTIONSIG_CORE);
 void iterNameFunc(NameFunc list[],struct LinkValue *father, INTER_FUNCTIONSIG_CORE);
+void iterClassFunc(NameFunc list[], LinkValue *father, INTER_FUNCTIONSIG_CORE);
 Value *makeBaseChildClass(Value *inherit, Inter *inter);
 
 #endif //VIRTUALMATH___OFUNC_H

+ 16 - 0
ofunc/src/__ofunc.c

@@ -13,6 +13,22 @@ void iterNameFunc(NameFunc list[], LinkValue *father, INTER_FUNCTIONSIG_CORE){
     }
 }
 
+void iterClassFunc(NameFunc list[], LinkValue *father, INTER_FUNCTIONSIG_CORE){
+    VarList *object_backup = father->value->object.var->next;
+    VarList *object_var = father->value->object.var;
+    enum FunctionPtType bak = inter->data.default_pt_type;
+    object_var->next = var_list;
+    inter->data.default_pt_type = object_free_;
+    gc_freeze(inter, object_backup, NULL, true);
+    for (PASS; list->of != NULL; list++) {
+        LinkValue *value = registeredFunctionCore(list->of, list->name, father, CALL_INTER_FUNCTIONSIG_CORE(object_var));
+        value->value->data.function.function_data.pt_type = list->type;
+    }
+    gc_freeze(inter, object_backup, NULL, false);
+    object_var->next = object_backup;
+    inter->data.default_pt_type = bak;
+}
+
 Value *makeBaseChildClass(Value *inherit, Inter *inter) {
     Inherit *father_value = NULL;
     Value *num = NULL;

+ 1 - 8
ofunc/src/bool.c

@@ -2,17 +2,10 @@
 
 void registeredBool(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.bool_, inter->base_father, inter);
-//    VarList *object_var = object->value->object.var;
-//    VarList *object_backup = NULL;
 //    NameFunc tmp[] = {{NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("bool", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-//    object_backup = object_var->next;
-//    object_var->next = inter->var_list;
-//    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-//    object_var->next = object_backup;
-
+//    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/dict.c

@@ -79,20 +79,13 @@ ResultType dict_iter(OFFICAL_FUNCTIONSIG){
 
 void registeredDict(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.dict, inter->base_father, inter);
-    VarList *object_var = object->value->object.var;
-    VarList *object_backup = NULL;
     NameFunc tmp[] = {{"__down__", dict_down, object_free_},
                       {"keys", dict_keys, object_free_},
                       {"__iter__", dict_iter, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("dict", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-    object_backup = object_var->next;
-    object_var->next = inter->var_list;
-    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-    object_var->next = object_backup;
-
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/dictiter.c

@@ -109,20 +109,13 @@ ResultType dictiter_down(OFFICAL_FUNCTIONSIG){
 
 void registeredDictIter(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.dict_iter, inter->base_father, inter);
-    VarList *object_var = object->value->object.var;
-    VarList *object_backup = NULL;
     NameFunc tmp[] = {{"__init__", dictiter_init, object_free_},
                       {"__next__", dictiter_next, object_free_},
                       {"__down__", dictiter_down, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("dictiter", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-    object_backup = object_var->next;
-    object_var->next = inter->var_list;
-    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-    object_var->next = object_backup;
-
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/error_.c

@@ -47,18 +47,11 @@ void registeredExcIter(REGISTERED_FUNCTIONSIG){
                    {NULL, NULL}};
     {
         LinkValue *object = makeLinkValue(inter->data.base_exc, inter->base_father, inter);
-        VarList *object_var = object->value->object.var;
-        VarList *object_backup = NULL;
         NameFunc tmp[] = {{"__init__", base_exception_init, object_free_},
                           {NULL, NULL}};
         gc_addTmpLink(&object->gc_status);
         addStrVar("BaseException", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-        object_backup = object_var->next;
-        object_var->next = inter->var_list;
-        iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-        object_var->next = object_backup;  // TODO-szh 操作内嵌到 iterNameFunc
-
+        iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
         gc_freeTmpLink(&object->gc_status);
     }
     for (int i=0; setList[i].name != NULL; i++)

+ 1 - 8
ofunc/src/function.c

@@ -2,17 +2,10 @@
 
 void registeredFunction(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.function, inter->base_father, inter);
-//    VarList *object_var = object->value->object.var;
-//    VarList *object_backup = NULL;
 //    NameFunc tmp[] = {{NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("function", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-//    object_backup = object_var->next;
-//    object_var->next = inter->var_list;
-//    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-//    object_var->next = object_backup;
-
+//    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 25 - 17
ofunc/src/list.c

@@ -172,26 +172,34 @@ ResultType list_iter(OFFICAL_FUNCTIONSIG){
 }
 
 void registeredList(REGISTERED_FUNCTIONSIG){
-    LinkValue *object = makeLinkValue(inter->data.list, inter->base_father, inter);
-    VarList *object_var = object->value->object.var;
-    VarList *object_backup = NULL;
-    NameFunc tmp[] = {{"__down__", list_down, object_free_},
-                      {"__slice__", list_slice, object_free_},
-                      {"__down_assignment__", list_down_assignment, object_free_},
-                      {"__iter__", list_iter, object_free_},
-                      {NULL, NULL}};
-    gc_addTmpLink(&object->gc_status);
-    addStrVar("list", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-    object_backup = object_var->next;
-    object_var->next = inter->var_list;
-    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-    object_var->next = object_backup;
-
-    gc_freeTmpLink(&object->gc_status);
+    {
+        LinkValue *object = makeLinkValue(inter->data.tuple, inter->base_father, inter);
+        NameFunc tmp[] = {{"__down__", list_down, object_free_},
+                          {"__slice__", list_slice, object_free_},
+                          {"__iter__", list_iter, object_free_},
+                          {NULL, NULL}};
+        gc_addTmpLink(&object->gc_status);
+        addStrVar("tuple", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
+        iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
+        gc_freeTmpLink(&object->gc_status);
+    }
+
+    {
+        LinkValue *object = makeLinkValue(inter->data.list, inter->base_father, inter);
+        NameFunc tmp[] = {{"__down_assignment__", list_down_assignment, object_free_},
+                          {NULL, NULL}};
+        gc_addTmpLink(&object->gc_status);
+        addStrVar("list", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
+        iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
+        gc_freeTmpLink(&object->gc_status);
+    }
 }
 
 void makeBaseList(Inter *inter){
-    Value *list = makeBaseChildClass(inter->data.vobject, inter);
+    Value *tuple = makeBaseChildClass(inter->data.vobject, inter);
+    Value *list = makeBaseChildClass(tuple, inter);
+    gc_addStatementLink(&tuple->gc_status);
     gc_addStatementLink(&list->gc_status);
+    inter->data.tuple = tuple;
     inter->data.list = list;
 }

+ 1 - 8
ofunc/src/listiter.c

@@ -50,19 +50,12 @@ ResultType listiter_next(OFFICAL_FUNCTIONSIG){
 
 void registeredListIter(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.list_iter, inter->base_father, inter);
-    VarList *object_var = object->value->object.var;
-    VarList *object_backup = NULL;
     NameFunc tmp[] = {{"__init__", listiter_init, object_free_},
                       {"__next__", listiter_next, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("listiter", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-    object_backup = object_var->next;
-    object_var->next = inter->var_list;
-    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-    object_var->next = object_backup;
-
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 38 - 9
ofunc/src/num.c

@@ -1,18 +1,47 @@
 #include "__ofunc.h"
 
+ResultType num_init(OFFICAL_FUNCTIONSIG){
+    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
+                           {.type=name_value, .name="num", .must=1, .long_arg=false},
+                           {.must=-1}};
+    LinkValue *base = NULL;
+    setResultCore(result);
+    parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+    if (!CHECK_RESULT(result))
+        return result->type;
+    freeResult(result);
+
+    base = ap[0].value;
+    base->value->type = number;
+    switch (ap[1].value->value->type){
+        case number:
+            base->value->data.num.num = ap[1].value->value->data.num.num;
+            break;
+        case string:
+            base->value->data.num.num = strtoll(ap[1].value->value->data.str.str, NULL, 10);
+            break;
+        case bool_:
+            base->value->data.num.num = ap[1].value->value->data.bool_.bool_;
+            break;
+        case none:
+        case pass_:
+            base->value->data.num.num = 0;
+            break;
+        default:
+            setResultError(E_TypeException, "Get A Not Support Type For Int", 0, "sys", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+            return result->type;
+    }
+    setResultBase(result, inter, belong);
+    return result->type;
+}
+
 void registeredNum(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.num, inter->base_father, inter);
-//    VarList *object_var = object->value->object.var;
-//    VarList *object_backup = NULL;
-//    NameFunc tmp[] = {{NULL, NULL}};
+    NameFunc tmp[] = {{"__init__", num_init, object_free_},
+                      {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("num", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-//    object_backup = object_var->next;
-//    object_var->next = inter->var_list;
-//    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-//    object_var->next = object_backup;
-
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/object.c

@@ -47,17 +47,10 @@ ResultType object_new_(OFFICAL_FUNCTIONSIG){
 
 void registeredObject(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.object, inter->base_father, inter);
-    VarList *object_var = object->value->object.var;
-    VarList *object_backup = NULL;
     NameFunc tmp[] = {{"__new__", object_new_, class_static_}, {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("object", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-    object_backup = object_var->next;
-    object_var->next = inter->var_list;
-    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-    object_var->next = object_backup;
-
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/pass.c

@@ -2,17 +2,10 @@
 
 void registeredEllipisis(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.pass_, inter->base_father, inter);
-//    VarList *object_var = object->value->object.var;
-//    VarList *object_backup = NULL;
 //    NameFunc tmp[] = {{NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("ellipsis", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-//    object_backup = object_var->next;
-//    object_var->next = inter->var_list;
-//    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-//    object_var->next = object_backup;
-
+//    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/str.c

@@ -2,17 +2,10 @@
 
 void registeredStr(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.str, inter->base_father, inter);
-//    VarList *object_var = object->value->object.var;
-//    VarList *object_backup = NULL;
 //    NameFunc tmp[] = {{NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("str", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-//    object_backup = object_var->next;
-//    object_var->next = inter->var_list;
-//    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-//    object_var->next = object_backup;
-
+//    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 8
ofunc/src/vobject.c

@@ -92,8 +92,6 @@ ResultType vobject_div(OFFICAL_FUNCTIONSIG){
 
 void registeredVObject(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.vobject, inter->base_father, inter);
-    VarList *object_var = object->value->object.var;
-    VarList *object_backup = NULL;
     NameFunc tmp[] = {{"__add__", vobject_add, object_free_},
                       {"__sub__", vobject_sub, object_free_},
                       {"__mul__", vobject_mul, object_free_},
@@ -101,12 +99,7 @@ void registeredVObject(REGISTERED_FUNCTIONSIG){
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("vobject", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-
-    object_backup = object_var->next;
-    object_var->next = inter->var_list;
-    iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
-    object_var->next = object_backup;
-
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 1 - 0
src/inter.c

@@ -103,6 +103,7 @@ void freeBaseInterData(struct Inter *inter){
     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.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);

+ 19 - 14
src/runcall.c

@@ -3,31 +3,36 @@
 ResultType setClass(INTER_FUNCTIONSIG) {
     Argument *call = NULL;
     LinkValue *tmp = NULL;
-    Inherit *class_belong = NULL;
-    VarList *belong_var = NULL;
-    enum FunctionPtType pt_type_bak = inter->data.default_pt_type;
+    Inherit *class_inherit = NULL;
     setResultCore(result);
 
     call = getArgument(st->u.set_class.father, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
     if (!CHECK_RESULT(result))
         goto error_;
 
-    class_belong = setFather(call);
+    class_inherit = setFather(call);
     freeArgument(call, false);
-    tmp = makeLinkValue(makeClassValue(copyVarList(var_list, false, inter), inter, class_belong), belong, inter);
+    tmp = makeLinkValue(makeClassValue(copyVarList(var_list, false, inter), inter, class_inherit), belong, inter);
     gc_addTmpLink(&tmp->gc_status);
 
-    belong_var = tmp->value->object.var->next;
-    tmp->value->object.var->next = var_list;
     freeResult(result);
-    inter->data.default_pt_type = object_free_;
-    functionSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.set_class.st, tmp->value->object.var, result, tmp));
-    inter->data.default_pt_type = pt_type_bak;
-    tmp->value->object.var->next = belong_var;
-    if (!CHECK_RESULT(result))
-        goto error_;
+    {
+        enum FunctionPtType pt_type_bak = inter->data.default_pt_type;
+        VarList *var_backup = tmp->value->object.var->next;
+        inter->data.default_pt_type = object_free_;
+        tmp->value->object.var->next = var_list;
 
-    freeResult(result);
+        gc_freeze(inter, var_backup, NULL, true);
+        functionSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.set_class.st, tmp->value->object.var, result, tmp));
+        gc_freeze(inter, var_backup, NULL, false);
+
+        tmp->value->object.var->next = var_backup;
+        inter->data.default_pt_type = pt_type_bak;
+
+        if (!CHECK_RESULT(result))
+            goto error_;
+        freeResult(result);
+    }
     if (st->u.set_class.decoration != NULL){
         setDecoration(st->u.set_class.decoration, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
         if (!CHECK_RESULT(result))

+ 10 - 2
src/value.c

@@ -118,10 +118,18 @@ Value *makeClassValue(VarList *var_list, Inter *inter, Inherit *father) {
 }
 
 Value *makeListValue(Argument **arg_ad, Inter *inter, enum ListType type) {
-    Inherit *object_father = getInheritFromValue(inter->data.list, inter);
-    VarList *new_var = copyVarList(inter->data.list->object.out_var, false, inter);
+    Inherit *object_father = NULL;
+    VarList *new_var = NULL;
     Value *tmp;
     Argument *at = *arg_ad;
+    if (type == value_list) {
+        object_father = getInheritFromValue(inter->data.list, inter);
+        new_var = copyVarList(inter->data.list->object.out_var, false, inter);
+    }
+    else {
+        object_father = getInheritFromValue(inter->data.tuple, inter);
+        new_var = copyVarList(inter->data.tuple->object.out_var, false, inter);
+    }
     tmp = makeObject(inter, NULL, new_var, object_father);
     tmp->type = list;
     tmp->data.list.type = type;