Explorar o código

feat: __bool__等魔法函数名写入inter

SongZihuan %!s(int64=4) %!d(string=hai) anos
pai
achega
10358e0950
Modificáronse 15 ficheiros con 158 adicións e 134 borrados
  1. 7 0
      include/inter.h
  2. 1 1
      ofunc/src/bool.c
  3. 4 4
      ofunc/src/dict.c
  4. 3 3
      ofunc/src/dictiter.c
  5. 1 1
      ofunc/src/error_.c
  6. 5 5
      ofunc/src/list.c
  7. 2 2
      ofunc/src/listiter.c
  8. 1 1
      ofunc/src/num.c
  9. 2 2
      ofunc/src/object.c
  10. 1 1
      ofunc/src/str.c
  11. 6 6
      ofunc/src/vobject.c
  12. 9 7
      src/__run.c
  13. 15 0
      src/inter.c
  14. 1 1
      src/runoperation.c
  15. 100 100
      src/value.c

+ 7 - 0
include/inter.h

@@ -72,6 +72,13 @@ struct Inter{
         char *object_slice;
         char *object_iter;
         char *object_next;
+        char *object_repo;
+        char *object_bool;
+        char *object_name;
+        char *object_self;
+        char *object_father;
+        char *object_message;
+        char *object_down_assignment;
         int default_pt_type;
     } data;
 };

+ 1 - 1
ofunc/src/bool.c

@@ -24,7 +24,7 @@ ResultType bool_init(OFFICAL_FUNCTIONSIG){
 
 void registeredBool(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.bool_, inter->base_father, inter);
-    NameFunc tmp[] = {{"__init__", bool_init, object_free_},
+    NameFunc tmp[] = {{inter->data.object_init, bool_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("bool", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));

+ 4 - 4
ofunc/src/dict.c

@@ -164,10 +164,10 @@ ResultType dict_repo(OFFICAL_FUNCTIONSIG){
 void registeredDict(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.dict, inter->base_father, inter);
     NameFunc tmp[] = {{"keys", dict_keys, object_free_},
-                      {"__down__", dict_down, object_free_},
-                      {"__iter__", dict_iter, object_free_},
-                      {"__repo__", dict_repo, object_free_},
-                      {"__down_assignment__", dict_down_assignment, object_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_down_assignment, dict_down_assignment, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("dict", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));

+ 3 - 3
ofunc/src/dictiter.c

@@ -109,9 +109,9 @@ ResultType dictiter_down(OFFICAL_FUNCTIONSIG){
 
 void registeredDictIter(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.dict_iter, inter->base_father, inter);
-    NameFunc tmp[] = {{"__init__", dictiter_init, object_free_},
-                      {"__next__", dictiter_next, object_free_},
-                      {"__down__", dictiter_down, object_free_},
+    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_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("dictiter", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));

+ 1 - 1
ofunc/src/error_.c

@@ -20,7 +20,7 @@ ResultType base_exception_init(OFFICAL_FUNCTIONSIG){
     if (!CHECK_RESULT(result))
         return result->type;
     freeResult(result);
-    addAttributes("__message__", false, ap[1].value, ap[0].value, inter);  // TODO-szh 设置inter的__mesage__
+    addAttributes(inter->data.object_message, false, ap[1].value, ap[0].value, inter);
     setResultBase(result, inter, belong);
     return result->type;
 }

+ 5 - 5
ofunc/src/list.c

@@ -231,10 +231,10 @@ ResultType list_repo(OFFICAL_FUNCTIONSIG){
 void registeredList(REGISTERED_FUNCTIONSIG){
     {
         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_},
-                          {"__repo__", list_repo, object_free_},
+        NameFunc tmp[] = {{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_},
                           {NULL, NULL}};
         gc_addTmpLink(&object->gc_status);
         addStrVar("tuple", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
@@ -244,7 +244,7 @@ void registeredList(REGISTERED_FUNCTIONSIG){
 
     {
         LinkValue *object = makeLinkValue(inter->data.list, inter->base_father, inter);
-        NameFunc tmp[] = {{"__down_assignment__", list_down_assignment, object_free_},
+        NameFunc tmp[] = {{inter->data.object_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));

+ 2 - 2
ofunc/src/listiter.c

@@ -50,8 +50,8 @@ ResultType listiter_next(OFFICAL_FUNCTIONSIG){
 
 void registeredListIter(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.list_iter, inter->base_father, inter);
-    NameFunc tmp[] = {{"__init__", listiter_init, object_free_},
-                      {"__next__", listiter_next, object_free_},
+    NameFunc tmp[] = {{inter->data.object_init, listiter_init, object_free_},
+                      {inter->data.object_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));

+ 1 - 1
ofunc/src/num.c

@@ -37,7 +37,7 @@ ResultType num_init(OFFICAL_FUNCTIONSIG){
 
 void registeredNum(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.num, inter->base_father, inter);
-    NameFunc tmp[] = {{"__init__", num_init, object_free_},
+    NameFunc tmp[] = {{inter->data.object_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));

+ 2 - 2
ofunc/src/object.c

@@ -60,8 +60,8 @@ ResultType object_repo_(OFFICAL_FUNCTIONSIG){
 
 void registeredObject(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.object, inter->base_father, inter);
-    NameFunc tmp[] = {{"__new__", object_new_, class_free_},
-                      {"__repo__", object_repo_, object_free_},
+    NameFunc tmp[] = {{inter->data.object_new, object_new_, class_free_},
+                      {inter->data.object_repo, object_repo_, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("object", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));

+ 1 - 1
ofunc/src/str.c

@@ -24,7 +24,7 @@ ResultType str_init(OFFICAL_FUNCTIONSIG){
 
 void registeredStr(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.str, inter->base_father, inter);
-    NameFunc tmp[] = {{"__init__", str_init, object_free_},
+    NameFunc tmp[] = {{inter->data.object_init, str_init, object_free_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("str", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));

+ 6 - 6
ofunc/src/vobject.c

@@ -191,12 +191,12 @@ ResultType vobject_repo(OFFICAL_FUNCTIONSIG){
 
 void registeredVObject(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.vobject, inter->base_father, inter);
-    NameFunc tmp[] = {{"__add__", vobject_add, object_free_},
-                      {"__sub__", vobject_sub, object_free_},
-                      {"__mul__", vobject_mul, object_free_},
-                      {"__div__", vobject_div, object_free_},
-                      {"__bool__", vobject_bool, object_free_},
-                      {"__repo__", vobject_repo, object_free_},
+    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_},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("vobject", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));

+ 9 - 7
src/__run.c

@@ -232,10 +232,10 @@ void addAttributes(char *name, bool free_old, LinkValue *value, LinkValue *belon
 }
 
 void newObjectSetting(LinkValue *name, LinkValue *belong, Inter *inter) {
-    addAttributes("__name__", false, name, belong, inter);
-    addAttributes("__self__", false, belong, belong, inter);
+    addAttributes(inter->data.object_name, false, name, belong, inter);
+    addAttributes(inter->data.object_self, false, belong, belong, inter);
     if (belong->value->object.inherit != NULL)
-        addAttributes("__father__", false, belong->value->object.inherit->value, belong, inter);
+        addAttributes(inter->data.object_father, false, belong->value->object.inherit->value, belong, inter);
 }
 
 
@@ -282,7 +282,7 @@ ResultType getIter(LinkValue *value, int status, fline line, char *file, INTER_F
 }
 
 bool checkBool(LinkValue *value, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST){
-    LinkValue *_bool_ = findAttributes("__bool__", false, value, inter);
+    LinkValue *_bool_ = findAttributes(inter->data.object_bool, false, value, inter);
     setResultCore(result);
     if (_bool_ != NULL){
         gc_addTmpLink(&_bool_->gc_status);
@@ -292,13 +292,15 @@ bool checkBool(LinkValue *value, fline line, char *file, INTER_FUNCTIONSIG_NOT_S
             setResultError(E_TypeException, "__bool__ function should return bool type data", line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
         else
             return result->value->value->data.bool_.bool_;
-    } else
-        setResultError(E_TypeException, "Object does not support __bool__ function", line, file, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+    } else {
+        setResultOperationBase(result, makeLinkValue(makeBoolValue(true, inter), belong, inter));
+        return true;
+    }
     return false;
 }
 
 char *getRepo(LinkValue *value, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST){
-    LinkValue *_repo_ = findAttributes("__repo__", false, value, inter);
+    LinkValue *_repo_ = findAttributes(inter->data.object_repo, false, value, inter);
     setResultCore(result);
     if (_repo_ != NULL){
         gc_addTmpLink(&_repo_->gc_status);

+ 15 - 0
src/inter.c

@@ -91,6 +91,13 @@ void setBaseInterData(struct Inter *inter){
     inter->data.object_slice = memStrcpy("__slice__");
     inter->data.object_iter = memStrcpy("__iter__");
     inter->data.object_next = memStrcpy("__next__");
+    inter->data.object_repo = memStrcpy("__repo__");
+    inter->data.object_bool = memStrcpy("__bool__");
+    inter->data.object_self = memStrcpy("__self__");
+    inter->data.object_name = memStrcpy("__name__");
+    inter->data.object_father = memStrcpy("__father__");
+    inter->data.object_message = memStrcpy("__message__");
+    inter->data.object_down_assignment = memStrcpy("__down_assignment__");
     inter->data.default_pt_type = free_;
 }
 
@@ -150,6 +157,14 @@ void freeBaseInterData(struct Inter *inter){
     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_down_assignment);
+
     if (!inter->data.is_stdout)
         fclose(inter->data.inter_stdout);
     if (!inter->data.is_stderr)

+ 1 - 1
src/runoperation.c

@@ -236,7 +236,7 @@ ResultType downAss(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST)
     iter = result->value;
     result->value = NULL;
     freeResult(result);
-    _down_assignment_ = findAttributes("__down_assignment__", false, iter, inter);  // TODO-szh __down_assignment__
+    _down_assignment_ = findAttributes(inter->data.object_down_assignment, false, iter, inter);
     if (_down_assignment_ != NULL){
         Argument *arg = makeValueArgument(value);
         gc_addTmpLink(&_down_assignment_->gc_status);

+ 100 - 100
src/value.c

@@ -307,7 +307,7 @@ Value *findBaseError(BaseErrorType type, Inter *inter){
 }
 
 char *getErrorInfo(LinkValue *exc, int type, Inter *inter){
-    char *str_name = type == 1 ? "__name__" : "__message__";
+    char *str_name = type == 1 ? inter->data.object_name : inter->data.object_message;
     LinkValue *_info_ = findAttributes(str_name, false, exc, inter);
     if (_info_ != NULL && _info_->value->type == string)
         return memStrcpy(_info_->value->data.str.str);
@@ -391,105 +391,6 @@ void freeResultSafe(Result *ru){
     ru->error = NULL;
 }
 
-void printValue(Value *value, FILE *debug, bool print_father, bool print_in) {
-    switch (value->type){
-        case number:
-            fprintf(debug, "%lld", value->data.num.num);
-            break;
-        case string:
-            fprintf(debug, "%s", value->data.str.str);
-            break;
-        case function:
-            if (print_father)
-                fprintf(debug, "function");
-            else
-                fprintf(debug, "(function on %p)", value);
-            break;
-        case list:
-            if (print_in){
-                fprintf(debug, "[");
-                for (int i = 0; i < value->data.list.size; i++) {
-                    if (i > 0)
-                        fprintf(debug, ", ", NULL);
-                    printValue(value->data.list.list[i]->value, debug, false, false);
-                }
-                fprintf(debug, " ]", NULL);
-            } else
-                fprintf(debug, "[list]", NULL);
-            break;
-        case dict:
-            if (print_in){
-                Var *tmp = NULL;
-                bool print_comma = false;
-                fprintf(debug, "{");
-                for (int i = 0; i < MAX_SIZE; i++) {
-                    for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
-                        if (print_comma)
-                            fprintf(debug, ", ", NULL);
-                        else
-                            print_comma = true;
-                        printValue(tmp->name_->value, debug, false, false);
-                        fprintf(debug, " ['%s'] : ", tmp->name);
-                        printValue(tmp->value->value, debug, false, false);
-                    }
-                }
-                fprintf(debug, " }", NULL);
-            } else
-                fprintf(debug, "[dict]", NULL);
-            break;
-        case none:
-            fprintf(debug, "(null)", NULL);
-            break;
-        case class:
-            if (print_father)
-                fprintf(debug, "class");
-            else
-                fprintf(debug, "(class on %p)", value);
-            break;
-        case object_:
-            if (print_father)
-                fprintf(debug, "object");
-            else
-                fprintf(debug, "(object on %p)", value);
-            break;
-        case bool_:
-            if (value->data.bool_.bool_)
-                fprintf(debug, "true");
-            else
-                fprintf(debug, "false");
-            break;
-        case pass_:
-            fprintf(debug, "...");
-            break;
-        default:
-            fprintf(debug, "unknown");
-            break;
-    }
-    if (print_father){
-        fprintf(debug, "(");
-        printf("<%p>", value);
-        for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
-            printf(" -> ");
-            printValue(fv->value->value, debug, false, false);
-        }
-        fprintf(debug, ")");
-    }
-
-}
-
-void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
-    if (value == NULL)
-        return;
-    fprintf(debug, "%s", first);
-    if (value->belong != NULL) {
-        printLinkValue(value->belong, "", "", debug);
-        fprintf(debug, " . ", NULL);
-    }
-    if (value->value != NULL)
-        printValue(value->value, debug, true, true);
-    fprintf(debug, "%s", last);
-}
-
 Error *makeError(char *type, char *message, fline line, char *file) {
     Error *tmp = memCalloc(1, sizeof(Error));
     tmp->line = line;
@@ -640,3 +541,102 @@ bool checkAttribution(Value *self, Value *father){
             return true;
     return false;
 }
+
+void printValue(Value *value, FILE *debug, bool print_father, bool print_in) {
+    switch (value->type){
+        case number:
+            fprintf(debug, "%lld", value->data.num.num);
+            break;
+        case string:
+            fprintf(debug, "%s", value->data.str.str);
+            break;
+        case function:
+            if (print_father)
+                fprintf(debug, "function");
+            else
+                fprintf(debug, "(function on %p)", value);
+            break;
+        case list:
+            if (print_in){
+                fprintf(debug, "[");
+                for (int i = 0; i < value->data.list.size; i++) {
+                    if (i > 0)
+                        fprintf(debug, ", ", NULL);
+                    printValue(value->data.list.list[i]->value, debug, false, false);
+                }
+                fprintf(debug, " ]", NULL);
+            } else
+                fprintf(debug, "[list]", NULL);
+            break;
+        case dict:
+            if (print_in){
+                Var *tmp = NULL;
+                bool print_comma = false;
+                fprintf(debug, "{");
+                for (int i = 0; i < MAX_SIZE; i++) {
+                    for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
+                        if (print_comma)
+                            fprintf(debug, ", ", NULL);
+                        else
+                            print_comma = true;
+                        printValue(tmp->name_->value, debug, false, false);
+                        fprintf(debug, " ['%s'] : ", tmp->name);
+                        printValue(tmp->value->value, debug, false, false);
+                    }
+                }
+                fprintf(debug, " }", NULL);
+            } else
+                fprintf(debug, "[dict]", NULL);
+            break;
+        case none:
+            fprintf(debug, "(null)", NULL);
+            break;
+        case class:
+            if (print_father)
+                fprintf(debug, "class");
+            else
+                fprintf(debug, "(class on %p)", value);
+            break;
+        case object_:
+            if (print_father)
+                fprintf(debug, "object");
+            else
+                fprintf(debug, "(object on %p)", value);
+            break;
+        case bool_:
+            if (value->data.bool_.bool_)
+                fprintf(debug, "true");
+            else
+                fprintf(debug, "false");
+            break;
+        case pass_:
+            fprintf(debug, "...");
+            break;
+        default:
+            fprintf(debug, "unknown");
+            break;
+    }
+    if (print_father){
+        fprintf(debug, "(");
+        printf("<%p>", value);
+        for (Inherit *fv = value->object.inherit; fv != NULL; fv = fv->next) {
+            printf(" -> ");
+            printValue(fv->value->value, debug, false, false);
+        }
+        fprintf(debug, ")");
+    }
+
+}
+
+void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){
+    if (value == NULL)
+        return;
+    fprintf(debug, "%s", first);
+    if (value->belong != NULL) {
+        printLinkValue(value->belong, "", "", debug);
+        fprintf(debug, " . ", NULL);
+    }
+    if (value->value != NULL)
+        printValue(value->value, debug, true, true);
+    fprintf(debug, "%s", last);
+}