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

fix iter sort for dict

fix kw_fun
Lyon 2 жил өмнө
parent
commit
ca2820efb6

+ 25 - 25
package/PikaStdLib/PikaStdData_Dict.c

@@ -33,18 +33,18 @@ void PikaStdData_Dict_remove(PikaObj* self, char* key) {
 }
 
 Arg* PikaStdData_Dict___iter__(PikaObj* self) {
-    obj_setInt(self, "__iter_i", 0);
+    obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(self)));
     return arg_newRef(self);
 }
 
 Arg* PikaStdData_Dict___next__(PikaObj* self) {
-    int __iter_i = args_getInt(self->list, "__iter_i");
+    int __iter_i = args_getInt(self->list, "__iter_i") - 1;
+    if (__iter_i < 0) {
+        return NULL;
+    }
     Args* keys = _OBJ2KEYS(self);
     Arg* res = arg_copy(args_getArgByIndex(keys, __iter_i));
-    if (NULL == res) {
-        return arg_newNone();
-    }
-    args_setInt(self->list, "__iter_i", __iter_i + 1);
+    args_setInt(self->list, "__iter_i", __iter_i);
     return res;
 }
 
@@ -84,31 +84,30 @@ PikaObj* PikaStdData_Dict_items(PikaObj* self) {
 }
 
 Arg* PikaStdData_dict_keys___iter__(PikaObj* self) {
-    obj_setInt(self, "__iter_i", 0);
+    PikaObj* dictptr = obj_getPtr(self, "dictptr");
+    obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(dictptr)));
     return arg_newRef(self);
 }
 
 Arg* PikaStdData_dict_keys___next__(PikaObj* self) {
-    int __iter_i = args_getInt(self->list, "__iter_i");
+    int __iter_i = args_getInt(self->list, "__iter_i") - 1;
+    if (__iter_i < 0) {
+        return NULL;
+    }
     PikaObj* dictptr = obj_getPtr(self, "dictptr");
     Args* keys = _OBJ2KEYS(dictptr);
     Arg* res = arg_copy(args_getArgByIndex(keys, __iter_i));
-    if (NULL == res) {
-        return arg_newNone();
-    }
-    args_setInt(self->list, "__iter_i", __iter_i + 1);
+    args_setInt(self->list, "__iter_i", __iter_i);
     return res;
 }
 
 char* builtins_str(PikaObj* self, Arg* arg);
 char* PikaStdData_dict_keys___str__(PikaObj* self) {
     Arg* str_arg = arg_newStr("dict_keys([");
-    PikaObj* dictptr = obj_getPtr(self, "dictptr");
-    Args* keys = _OBJ2KEYS(dictptr);
-
+    arg_deinit(PikaStdData_dict_keys___iter__(self));
     int i = 0;
     while (PIKA_TRUE) {
-        Arg* item = args_getArgByIndex(keys, i);
+        Arg* item = PikaStdData_dict_keys___next__(self);
         if (NULL == item) {
             break;
         }
@@ -124,6 +123,7 @@ char* PikaStdData_dict_keys___str__(PikaObj* self) {
             str_arg = arg_strAppend(str_arg, "'");
         }
         i++;
+        arg_deinit(item);
     }
 
     str_arg = arg_strAppend(str_arg, "])");
@@ -201,7 +201,8 @@ int PikaStdData_Dict___contains__(PikaObj* self, Arg* val) {
 }
 
 Arg* PikaStdData_dict_items___iter__(PikaObj* self) {
-    obj_setInt(self, "__iter_i", 0);
+    PikaObj* dictptr = obj_getPtr(self, "dictptr");
+    obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(dictptr)));
     return arg_newRef(self);
 }
 
@@ -212,30 +213,29 @@ int PikaStdData_dict_items___len__(PikaObj* self) {
 }
 
 Arg* PikaStdData_dict_items___next__(PikaObj* self) {
-    int __iter_i = args_getInt(self->list, "__iter_i");
+    int __iter_i = args_getInt(self->list, "__iter_i") - 1;
+    if (__iter_i < 0) {
+        return NULL;
+    }
     PikaObj* dictptr = obj_getPtr(self, "dictptr");
     Args* keys = _OBJ2KEYS(dictptr);
     Args* dict = _OBJ2DICT(dictptr);
     Arg* key = args_getArgByIndex(keys, __iter_i);
     Arg* val = args_getArgByIndex(dict, __iter_i);
-    if (NULL == key) {
-        return arg_newNone();
-    }
     PikaObj* tuple = New_pikaTuple();
     pikaList_append(tuple, arg_copy(key));
     pikaList_append(tuple, arg_copy(val));
-    args_setInt(self->list, "__iter_i", __iter_i + 1);
+    args_setInt(self->list, "__iter_i", __iter_i);
     return arg_newObj(tuple);
 }
 
 char* PikaStdData_dict_items___str__(PikaObj* self) {
     Arg* str_arg = arg_newStr("dict_items([");
     int i = 0;
-    obj_setInt(self, "__iter_i", 0);
+    arg_deinit(PikaStdData_dict_items___iter__(self));
     while (PIKA_TRUE) {
         Arg* item = PikaStdData_dict_items___next__(self);
-        if (arg_getType(item) == ARG_TYPE_NONE) {
-            arg_deinit(item);
+        if (item == NULL) {
             break;
         }
         if (i != 0) {

+ 1 - 1
port/linux/.vscode/launch.json

@@ -13,7 +13,7 @@
             "args": [
                 // "--gtest_filter=vm.keyword_2"
                 // "--gtest_filter=builtin.contains"
-                "--gtest_filter=parser.signed_num"
+                "--gtest_filter=stddata.kw_fun"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 25 - 25
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_Dict.c

@@ -33,18 +33,18 @@ void PikaStdData_Dict_remove(PikaObj* self, char* key) {
 }
 
 Arg* PikaStdData_Dict___iter__(PikaObj* self) {
-    obj_setInt(self, "__iter_i", 0);
+    obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(self)));
     return arg_newRef(self);
 }
 
 Arg* PikaStdData_Dict___next__(PikaObj* self) {
-    int __iter_i = args_getInt(self->list, "__iter_i");
+    int __iter_i = args_getInt(self->list, "__iter_i") - 1;
+    if (__iter_i < 0) {
+        return NULL;
+    }
     Args* keys = _OBJ2KEYS(self);
     Arg* res = arg_copy(args_getArgByIndex(keys, __iter_i));
-    if (NULL == res) {
-        return arg_newNone();
-    }
-    args_setInt(self->list, "__iter_i", __iter_i + 1);
+    args_setInt(self->list, "__iter_i", __iter_i);
     return res;
 }
 
@@ -84,31 +84,30 @@ PikaObj* PikaStdData_Dict_items(PikaObj* self) {
 }
 
 Arg* PikaStdData_dict_keys___iter__(PikaObj* self) {
-    obj_setInt(self, "__iter_i", 0);
+    PikaObj* dictptr = obj_getPtr(self, "dictptr");
+    obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(dictptr)));
     return arg_newRef(self);
 }
 
 Arg* PikaStdData_dict_keys___next__(PikaObj* self) {
-    int __iter_i = args_getInt(self->list, "__iter_i");
+    int __iter_i = args_getInt(self->list, "__iter_i") - 1;
+    if (__iter_i < 0) {
+        return NULL;
+    }
     PikaObj* dictptr = obj_getPtr(self, "dictptr");
     Args* keys = _OBJ2KEYS(dictptr);
     Arg* res = arg_copy(args_getArgByIndex(keys, __iter_i));
-    if (NULL == res) {
-        return arg_newNone();
-    }
-    args_setInt(self->list, "__iter_i", __iter_i + 1);
+    args_setInt(self->list, "__iter_i", __iter_i);
     return res;
 }
 
 char* builtins_str(PikaObj* self, Arg* arg);
 char* PikaStdData_dict_keys___str__(PikaObj* self) {
     Arg* str_arg = arg_newStr("dict_keys([");
-    PikaObj* dictptr = obj_getPtr(self, "dictptr");
-    Args* keys = _OBJ2KEYS(dictptr);
-
+    arg_deinit(PikaStdData_dict_keys___iter__(self));
     int i = 0;
     while (PIKA_TRUE) {
-        Arg* item = args_getArgByIndex(keys, i);
+        Arg* item = PikaStdData_dict_keys___next__(self);
         if (NULL == item) {
             break;
         }
@@ -124,6 +123,7 @@ char* PikaStdData_dict_keys___str__(PikaObj* self) {
             str_arg = arg_strAppend(str_arg, "'");
         }
         i++;
+        arg_deinit(item);
     }
 
     str_arg = arg_strAppend(str_arg, "])");
@@ -201,7 +201,8 @@ int PikaStdData_Dict___contains__(PikaObj* self, Arg* val) {
 }
 
 Arg* PikaStdData_dict_items___iter__(PikaObj* self) {
-    obj_setInt(self, "__iter_i", 0);
+    PikaObj* dictptr = obj_getPtr(self, "dictptr");
+    obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(dictptr)));
     return arg_newRef(self);
 }
 
@@ -212,30 +213,29 @@ int PikaStdData_dict_items___len__(PikaObj* self) {
 }
 
 Arg* PikaStdData_dict_items___next__(PikaObj* self) {
-    int __iter_i = args_getInt(self->list, "__iter_i");
+    int __iter_i = args_getInt(self->list, "__iter_i") - 1;
+    if (__iter_i < 0) {
+        return NULL;
+    }
     PikaObj* dictptr = obj_getPtr(self, "dictptr");
     Args* keys = _OBJ2KEYS(dictptr);
     Args* dict = _OBJ2DICT(dictptr);
     Arg* key = args_getArgByIndex(keys, __iter_i);
     Arg* val = args_getArgByIndex(dict, __iter_i);
-    if (NULL == key) {
-        return arg_newNone();
-    }
     PikaObj* tuple = New_pikaTuple();
     pikaList_append(tuple, arg_copy(key));
     pikaList_append(tuple, arg_copy(val));
-    args_setInt(self->list, "__iter_i", __iter_i + 1);
+    args_setInt(self->list, "__iter_i", __iter_i);
     return arg_newObj(tuple);
 }
 
 char* PikaStdData_dict_items___str__(PikaObj* self) {
     Arg* str_arg = arg_newStr("dict_items([");
     int i = 0;
-    obj_setInt(self, "__iter_i", 0);
+    arg_deinit(PikaStdData_dict_items___iter__(self));
     while (PIKA_TRUE) {
         Arg* item = PikaStdData_dict_items___next__(self);
-        if (arg_getType(item) == ARG_TYPE_NONE) {
-            arg_deinit(item);
+        if (item == NULL) {
             break;
         }
         if (i != 0) {

+ 11 - 11
port/linux/test/json-test.cpp

@@ -14,19 +14,19 @@ TEST(json, dumps) {
     pikaVM_runSingleFile(pikaMain, "test/python/json/json_dumps.py");
     /* assert */
     EXPECT_STREQ(obj_getStr(pikaMain, "s1"),
-                 "{\n\t\"c\":\t3,\n\t\"b\":\t2,\n\t\"a\":\t1\n}");
+                 "{\n\t\"a\":\t1,\n\t\"b\":\t2,\n\t\"c\":\t3\n}");
     EXPECT_STREQ(obj_getStr(pikaMain, "s2"),
-                 "{\n\t\"d\":\t{\n\t\t\"f\":\t5,\n\t\t\"e\":\t4\n\t},\n\t\"c\":"
-                 "\t3,\n\t\"b\":\t2,\n\t\"a\":\t1\n}");
-    EXPECT_STREQ(obj_getStr(pikaMain, "s3"),
-                 "{\n\t\"g\":\t[6, 7, "
-                 "8],\n\t\"d\":\t{\n\t\t\"f\":\t5,\n\t\t\"e\":\t4\n\t},"
-                 "\n\t\"c\":\t3,\n\t\"b\":\t2,\n\t\"a\":\t1\n}");
+                 "{\n\t\"a\":\t1,\n\t\"b\":\t2,\n\t\"c\":\t3,\n\t\"d\":\t{"
+                 "\n\t\t\"e\":\t4,\n\t\t\"f\":\t5\n\t}\n}");
+    EXPECT_STREQ(
+        obj_getStr(pikaMain, "s3"),
+        "{\n\t\"a\":\t1,\n\t\"b\":\t2,\n\t\"c\":\t3,\n\t\"d\":\t{\n\t\t\"e\":"
+        "\t4,\n\t\t\"f\":\t5\n\t},\n\t\"g\":\t[6, 7, 8]\n}");
     EXPECT_STREQ(obj_getStr(pikaMain, "s4"),
-                 "{\n\t\"l\":\t1.234,\n\t\"k\":\t\"string\",\n\t\"j\":\ttrue,"
-                 "\n\t\"i\":\tfalse,\n\t\"h\":\tnull,\n\t\"g\":\t[6, 7, "
-                 "8],\n\t\"d\":\t{\n\t\t\"f\":\t5,\n\t\t\"e\":\t4\n\t},"
-                 "\n\t\"c\":\t3,\n\t\"b\":\t2,\n\t\"a\":\t1\n}");
+                 "{\n\t\"a\":\t1,\n\t\"b\":\t2,\n\t\"c\":\t3,\n\t\"d\":\t{"
+                 "\n\t\t\"e\":\t4,\n\t\t\"f\":\t5\n\t},\n\t\"g\":\t[6, 7, "
+                 "8],\n\t\"h\":\tnull,\n\t\"i\":\tfalse,\n\t\"j\":\ttrue,"
+                 "\n\t\"k\":\t\"string\",\n\t\"l\":\t1.234\n}");
 
     /* deinit */
     obj_deinit(pikaMain);

+ 6 - 6
port/linux/test/module-test.cpp

@@ -274,16 +274,16 @@ TEST(socket, json_issue) {
     /* assert */
     EXPECT_STREQ(log_buff[2],
                  "client recv: "
-                 "{\n\t\"code\":\t0,\n\t\"result\":\t{\n\t\t\"a_a\":\t{"
+                 "{\n\t\"result\":\t{\n\t\t\"a_a\":\t{\n\t\t\t\"value\":\t0.29,"
                  "\n\t\t\t\"desc\":\t\"A "
-                 "\347\233\270\347\224\265\346\265\201\",\n\t\t\t\"value\":\t0."
-                 "29\n\t\t}\n\t}\n}\r\n");
+                 "\347\233\270\347\224\265\346\265\201\"\n\t\t}\n\t},"
+                 "\n\t\"code\":\t0\n}\r\n");
     EXPECT_STREQ(log_buff[4],
                  "client recv: "
-                 "{\n\t\"code\":\t0,\n\t\"result\":\t{\n\t\t\"a_a\":\t{"
+                 "{\n\t\"result\":\t{\n\t\t\"a_a\":\t{\n\t\t\t\"value\":\t0.29,"
                  "\n\t\t\t\"desc\":\t\"A "
-                 "\347\233\270\347\224\265\346\265\201\",\n\t\t\t\"value\":\t0."
-                 "29\n\t\t}\n\t}\n}\r\n");
+                 "\347\233\270\347\224\265\346\265\201\"\n\t\t}\n\t},"
+                 "\n\t\"code\":\t0\n}\r\n");
     /* deinit */
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);

+ 13 - 13
port/linux/test/stddata-test.cpp

@@ -10,15 +10,15 @@ TEST(stddata, test1) {
     pikaVM_runSingleFile(pikaMain, "test/python/builtins/dict.py");
     /* collect */
     /* assert */
-    EXPECT_STREQ(log_buff[0], "{'len': 3, 'list': [1, 2, 3]}\r\n");
-    EXPECT_STREQ(log_buff[1], "dict_keys(['c', 'b', 'a'])\r\n");
-    EXPECT_STREQ(log_buff[2], "a\r\n");
+    EXPECT_STREQ(log_buff[0], "{'list': [1, 2, 3], 'len': 3}\r\n");
+    EXPECT_STREQ(log_buff[1], "dict_keys(['a', 'b', 'c'])\r\n");
+    EXPECT_STREQ(log_buff[2], "c\r\n");
     EXPECT_STREQ(log_buff[3], "b\r\n");
-    EXPECT_STREQ(log_buff[4], "c\r\n");
-    EXPECT_STREQ(log_buff[5], "a\r\n");
+    EXPECT_STREQ(log_buff[4], "a\r\n");
+    EXPECT_STREQ(log_buff[5], "c\r\n");
     EXPECT_STREQ(log_buff[6], "b\r\n");
-    EXPECT_STREQ(log_buff[7], "c\r\n");
-    EXPECT_STREQ(log_buff[8], "{'c': 'test', 'b': 2, 'a': 1}\r\n");
+    EXPECT_STREQ(log_buff[7], "a\r\n");
+    EXPECT_STREQ(log_buff[8], "{'a': 1, 'b': 2, 'c': 'test'}\r\n");
     EXPECT_STREQ(log_buff[9], "BEGIN\r\n");
     /* deinit */
     obj_deinit(pikaMain);
@@ -205,7 +205,7 @@ TEST(dict, cmodule) {
             "print(s)");
     /* collect */
     /* assert */
-    EXPECT_STREQ(log_buff[0], "{'para2': 2, 'para1': 1}\r\n");
+    EXPECT_STREQ(log_buff[0], "{'para1': 1, 'para2': 2}\r\n");
     /* deinit */
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
@@ -222,7 +222,7 @@ TEST(dict, items) {
             "print(d.items())\n");
     /* collect */
     /* assert */
-    EXPECT_STREQ(log_buff[0], "dict_items([('b', 2), ('a', 1)])\r\n");
+    EXPECT_STREQ(log_buff[0], "dict_items([('a', 1), ('b', 2)])\r\n");
     /* deinit */
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
@@ -241,8 +241,8 @@ TEST(dict, items2) {
     /* collect */
     /* assert */
     EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
-    EXPECT_STREQ(log_buff[1], "('b', 2)\r\n");
-    EXPECT_STREQ(log_buff[0], "('a', 1)\r\n");
+    EXPECT_STREQ(log_buff[1], "('a', 1)\r\n");
+    EXPECT_STREQ(log_buff[0], "('b', 2)\r\n");
     /* deinit */
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
@@ -260,8 +260,8 @@ TEST(dict, items_kv) {
             "    print(k, v)\n");
     /* collect */
     /* assert */
-    EXPECT_STREQ(log_buff[0], "a 1\r\n");
-    EXPECT_STREQ(log_buff[1], "b 2\r\n");
+    EXPECT_STREQ(log_buff[0], "b 2\r\n");
+    EXPECT_STREQ(log_buff[1], "a 1\r\n");
     EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
     /* deinit */
     obj_deinit(pikaMain);

+ 8 - 6
src/PikaObj.c

@@ -4058,19 +4058,15 @@ int32_t pikaDict_forEach(PikaObj* self,
     Args* dict = _OBJ2DICT(self);
     pika_assert(NULL != dict);
     pika_assert(NULL != keys);
-    int i = 0;
-    while (1) {
+    size_t size = args_getSize(keys);
+    for (int i = size - 1; i >= 0; i--) {
         Arg* item_key = args_getArgByIndex(keys, i);
         Arg* item_val = args_getArgByIndex(dict, i);
-        if (NULL == item_val) {
-            break;
-        }
         pika_assert(NULL != item_key);
         // Call the handle function on each key-value pair
         if (eachHandle(self, item_key, item_val, context) != 0) {
             return -1;
         }
-        i++;
     }
     return 0;
 }
@@ -4370,6 +4366,12 @@ PIKA_RES pikaDict_removeArg(PikaDict* self, Arg* val) {
     return args_removeArg(_OBJ2DICT(self), (val));
 }
 
+PIKA_RES pikaDict_reverse(PikaDict* self) {
+    args_reverse(_OBJ2KEYS(self));
+    args_reverse(_OBJ2DICT(self));
+    return PIKA_RES_OK;
+}
+
 PIKA_RES pikaDict_setBytes(PikaDict* self,
                            char* name,
                            uint8_t* val,

+ 1 - 0
src/PikaObj.h

@@ -824,6 +824,7 @@ PIKA_RES pikaDict_setPtr(PikaDict* self, char* name, void* val);
 PIKA_RES pikaDict_set(PikaDict* self, char* name, Arg* val);
 #define pikaDict_setArg pikaDict_set
 PIKA_RES pikaDict_removeArg(PikaDict* self, Arg* val);
+PIKA_RES pikaDict_reverse(PikaDict* self);
 PIKA_RES pikaDict_setBytes(PikaDict* self,
                            char* name,
                            uint8_t* val,

+ 5 - 4
src/PikaVM.c

@@ -1300,6 +1300,7 @@ static void _kw_push(FunctionArgsInfo* f, Arg* call_arg, int i) {
     _pikaDict_setVal(f->kw, call_arg);
     char* sHash = fast_itoa(buff, kw_hash);
     args_setStr(_OBJ2KEYS(f->kw), sHash, sHash);
+    pikaDict_reverse(f->kw);
 }
 
 static void _load_call_arg(VMState* vm,
@@ -1408,16 +1409,16 @@ static uint32_t _get_n_input_with_unpack(VMState* vm, int n_used) {
             PikaObj* obj = arg_getPtr(call_arg);
             pika_assert(obj->constructor == New_PikaStdData_Dict);
             Args* dict = _OBJ2DICT(obj);
-            int i_item = 0;
+            int i_item = args_getSize(dict);
             while (pika_true) {
-                Arg* item_val = args_getArgByIndex(dict, i_item);
-                if (NULL == item_val) {
+                i_item--;
+                if (i_item < 0) {
                     break;
                 }
+                Arg* item_val = args_getArgByIndex(dict, i_item);
                 /* unpack as keyword arg */
                 arg_setIsKeyword(item_val, pika_true);
                 stack_pushArg(&stack_tmp, arg_copy(item_val));
-                i_item++;
             }
             goto __continue;
         }

+ 1 - 1
src/PikaVersion.h

@@ -2,4 +2,4 @@
 #define PIKA_VERSION_MINOR 12
 #define PIKA_VERSION_MICRO 6
 
-#define PIKA_EDIT_TIME "2023/09/16 22:49:36"
+#define PIKA_EDIT_TIME "2023/09/17 11:11:11"

+ 16 - 0
src/dataArgs.c

@@ -211,6 +211,7 @@ pika_bool args_getBool(Args* self, char* name) {
 }
 
 int32_t args_getSize(Args* self) {
+    pika_assert(NULL != self);
     return link_getSize(self);
 }
 
@@ -462,6 +463,21 @@ PIKA_RES args_foreach(Args* self,
     return PIKA_RES_OK;
 }
 
+PIKA_RES args_reverse(Args* self) {
+    pika_assert(NULL != self);
+    LinkNode* nodeNow = self->firstNode;
+    LinkNode* nodeNext = NULL;
+    LinkNode* nodePrior = NULL;
+    while (NULL != nodeNow) {
+        nodeNext = (LinkNode*)arg_getNext((Arg*)nodeNow);
+        arg_setNext((Arg*)nodeNow, (Arg*)nodePrior);
+        nodePrior = nodeNow;
+        nodeNow = nodeNext;
+    }
+    self->firstNode = nodePrior;
+    return PIKA_RES_OK;
+}
+
 PIKA_RES args_removeArg(Args* self, Arg* argNow) {
     if (NULL == argNow) {
         return PIKA_RES_ERR_INVALID_PTR;

+ 2 - 0
src/dataArgs.h

@@ -113,6 +113,8 @@ PIKA_RES args_foreach(Args* self,
                       int32_t (*eachHandle)(Arg* argEach, void* context),
                       void* context);
 
+PIKA_RES args_reverse(Args* self);
+
 char* args_getBuff(Args* self, int32_t size);
 PIKA_RES args_pushArg(Args* self, Arg* arg);
 PIKA_RES args_pushArg_name(Args* self, char* name, Arg* arg);