ソースを参照

fix suger_multiassin inner def or class

lyon 3 年 前
コミット
73b9effffd
5 ファイル変更133 行追加8 行削除
  1. 1 1
      port/linux/.vscode/launch.json
  2. 25 7
      src/PikaParser.c
  3. 21 0
      test/module-test.cpp
  4. 49 0
      test/parse-test.cpp
  5. 37 0
      test/python/unittest/test3.py

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

@@ -11,7 +11,7 @@
             "program": "${workspaceFolder}/build/test/pikascript_test",
             // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
             "args": [
-                // "--gtest_filter=vm.kw_no_empty"
+                // "--gtest_filter=socket.server_client"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 25 - 7
src/PikaParser.c

@@ -1777,21 +1777,25 @@ exit:
     return ast;
 }
 
-static int32_t Parser_getPyLineBlockDeepth(char* line) {
+static int32_t _getSpaceNum(char* line) {
     uint32_t size = strGetSize(line);
     for (uint32_t i = 0; i < size; i++) {
         if (line[i] != ' ') {
-            uint32_t spaceNum = i;
-            if (0 == spaceNum % 4) {
-                return spaceNum / 4;
-            }
-            /* space Num is not 4N, error*/
-            return -1;
+            return i;
         }
     }
     return 0;
 }
 
+static int32_t Parser_getPyLineBlockDeepth(char* line) {
+    int32_t spaceNum = _getSpaceNum(line);
+    if (0 == spaceNum % 4) {
+        return spaceNum / 4;
+    }
+    /* space Num is not 4N, error*/
+    return -1;
+}
+
 char* Parser_removeAnnotation(char* line) {
     uint8_t is_annotation_exit = 0;
     uint8_t is_in_single_quotes = 0;
@@ -2221,6 +2225,7 @@ static char* Suger_multiAssign(Args* out_buffs, char* line) {
 #endif
     Args buffs = {0};
     char* line_out = line;
+    int space_num = _getSpaceNum(line);
     PIKA_BOOL is_assign = PIKA_FALSE;
     Arg* stmt = arg_newStr("");
     Arg* out_list = arg_newStr("");
@@ -2257,6 +2262,11 @@ static char* Suger_multiAssign(Args* out_buffs, char* line) {
 
     line_item =
         strsFormat(&buffs, PIKA_LINE_BUFF_SIZE, "$tmp= %s\n", arg_getStr(stmt));
+
+    /* add space */
+    for (int i = 0; i < space_num; i++) {
+        line_out_arg = arg_strAppend(line_out_arg, " ");
+    }
     line_out_arg = arg_strAppend(line_out_arg, line_item);
 
     out_list_str = arg_getStr(out_list);
@@ -2267,9 +2277,17 @@ static char* Suger_multiAssign(Args* out_buffs, char* line) {
         }
         char* line_item = strsFormat(&buffs, PIKA_LINE_BUFF_SIZE,
                                      "%s = $tmp[%d]\n", item, out_num);
+        /* add space */
+        for (int i = 0; i < space_num; i++) {
+            line_out_arg = arg_strAppend(line_out_arg, " ");
+        }
         line_out_arg = arg_strAppend(line_out_arg, line_item);
         out_num++;
     }
+    /* add space */
+    for (int i = 0; i < space_num; i++) {
+        line_out_arg = arg_strAppend(line_out_arg, " ");
+    }
     line_out_arg = arg_strAppend(line_out_arg, "del $tmp");
 
     line_out = strsCopy(out_buffs, arg_getStr(line_out_arg));

+ 21 - 0
test/module-test.cpp

@@ -180,6 +180,27 @@ TEST(module, unittest_test2) {
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
 }
+
+TEST(module, unittest_test3) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    extern unsigned char pikaModules_py_a[];
+    obj_linkLibrary(pikaMain, pikaModules_py_a);
+    /* run */
+    __platform_printf("BEGIN\r\n");
+    pikaVM_runSingleFile(pikaMain, "test/python/unittest/test3.py");
+    /* collect */
+    int testsRun = obj_getInt(pikaMain, "res.testsRun");
+    int errorsNum = obj_getInt(pikaMain, "res.errorsNum");
+    /* assert */
+    EXPECT_EQ(testsRun, 1);
+    EXPECT_EQ(errorsNum, 0);
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
 #endif
 
 TEST(socket, gethostname) {

+ 49 - 0
test/parse-test.cpp

@@ -5138,6 +5138,55 @@ TEST(parser, syntex_issue_l1l2) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
+TEST(parser, syntex_issue_12ojd) {
+    pikaMemInfo.heapUsedMax = 0;
+    Args* buffs = New_strBuff();
+    char* lines =
+        "class Test:\n"
+        "    def test(self):\n"
+        "        a, b = c\n";
+    printf("%s\r\n", lines);
+    char* pikaAsm = Parser_linesToAsm(buffs, lines);
+    printf("%s", pikaAsm);
+    EXPECT_STREQ(pikaAsm,
+                 "B0\n"
+                 "0 CLS Test()\n"
+                 "0 JMP 1\n"
+                 "B1\n"
+                 "0 RUN TinyObj\n"
+                 "0 OUT self\n"
+                 "B1\n"
+                 "0 RAS self\n"
+                 "B1\n"
+                 "0 DEF test(self)\n"
+                 "0 JMP 1\n"
+                 "B2\n"
+                 "0 REF c\n"
+                 "0 OUT $tmp\n"
+                 "B2\n"
+                 "1 REF $tmp\n"
+                 "1 NUM 0\n"
+                 "0 SLC \n"
+                 "0 OUT a\n"
+                 "B2\n"
+                 "1 REF $tmp\n"
+                 "1 NUM 1\n"
+                 "0 SLC \n"
+                 "0 OUT b\n"
+                 "B2\n"
+                 "0 DEL $tmp\n"
+                 "B2\n"
+                 "0 RET \n"
+                 "B1\n"
+                 "0 RAS $origin\n"
+                 "B1\n"
+                 "0 NEW self\n"
+                 "0 RET \n"
+                 "B0\n");
+    args_deinit(buffs);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
 #endif
 
 TEST_END

+ 37 - 0
test/python/unittest/test3.py

@@ -0,0 +1,37 @@
+import socket
+import random
+import unittest
+
+
+class TestUnittestAssertions(unittest.TestCase):
+    def testSocket(self):
+        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        host = "127.0.0.1"
+        port = 9999 + random.randint(0, 1000) + 1
+        print("port:", port)
+        server.bind((host, port))
+        server.listen(5)
+        
+        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        client.connect((host, port))
+        
+        accept, addr = server.accept()
+        self.assertEqual(addr, "127.0.0.1")
+        
+        print("recv from client: %s" % str(addr))
+        
+        client.send("send test from client".encode())
+        print("server recv:", accept.recv(1024).decode())
+        
+        accept.send("send test from server".encode())
+        print("client recv:", client.recv(1024).decode())
+        
+        accept.close()
+        client.close()
+        server.close()
+
+
+suit = unittest.TestSuite("test1")
+suit.addTest(TestUnittestAssertions())
+runner = unittest.TextTestRunner()
+res = runner.run(suit)