lyon 2 лет назад
Родитель
Сommit
f276fdadfb
5 измененных файлов с 187 добавлено и 159 удалено
  1. 2 2
      port/linux/.vscode/launch.json
  2. 5 0
      src/PikaVM.c
  3. 149 153
      test/builtin-test.cpp
  4. 9 0
      test/python/builtin/class_script.py
  5. 22 4
      test/test_common.h

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

@@ -21,9 +21,9 @@
                 // "--gtest_filter=parser.tuple_single"
                 // "--gtest_filter=parser.split_slice"
                 // "--gtest_filter=vm.var_global_run"
-                "--gtest_filter=lua.eval"
+                // "--gtest_filter=lua.eval"
                 // "--gtest_filter=proxy.proxy3"
-                // "--gtest_filter=stddata.obj_newDict0"
+                "--gtest_filter=builtin.class_script"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 5 - 0
src/PikaVM.c

@@ -1892,6 +1892,11 @@ static Arg* VM_instruction_handler_RUN(PikaObj* self,
         pikaFree(stack_tmp, sizeof(Arg*) * PIKA_ARG_NUM_MAX);
     }
 #endif
+    /* use RunAs object */
+    if (obj_getFlag(vm->locals, OBJ_FLAG_RUN_AS)) {
+        PikaObj* oContext = args_getPtr(vm->locals->list, "@r");
+        oMethodHost = obj_getHostObjWithIsTemp(oContext, sRunPath, &bIsTemp);
+    }
 
     /* get method host obj from local scope */
     if (NULL == oMethodHost) {

+ 149 - 153
test/builtin-test.cpp

@@ -3,222 +3,218 @@ TEST_START
 
 #if PIKA_SYNTAX_SLICE_ENABLE
 TEST(builtin, bytes) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/bytes.py");
-    /* collect */
-    uint8_t* res = obj_getBytes(pikaMain, "res");
-    /* assert */
-    EXPECT_EQ(res[1], 1);
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/bytes.py");
+  /* collect */
+  uint8_t *res = obj_getBytes(pikaMain, "res");
+  /* assert */
+  EXPECT_EQ(res[1], 1);
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 #if PIKA_BUILTIN_STRUCT_ENABLE
 TEST(builtin, type1) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/type.py");
-    /* collect */
-    /* assert */
-    EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
-    EXPECT_STREQ(log_buff[0], "OK\r\n");
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/type.py");
+  /* collect */
+  /* assert */
+  EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
+  EXPECT_STREQ(log_buff[0], "OK\r\n");
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 #if PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL
 TEST(builtin, seek) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/seek.py");
-    /* collect */
-    int len = obj_getInt(pikaMain, "len");
-    /* assert */
-    EXPECT_EQ(len, 3576);
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/seek.py");
+  /* collect */
+  int len = obj_getInt(pikaMain, "len");
+  /* assert */
+  EXPECT_EQ(len, 3576);
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 #if (PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL)
 TEST(builtin, file2) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/file2.py");
-    /* collect */
-    char* s = obj_getStr(pikaMain, "s");
-    /* assert */
-    EXPECT_STREQ(s, "import PikaStdLib\n");
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/file2.py");
+  /* collect */
+  char *s = obj_getStr(pikaMain, "s");
+  /* assert */
+  EXPECT_STREQ(s, "import PikaStdLib\n");
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 #if PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL
 TEST(builtin, file3) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/file3.py");
-    /* collect */
-    /* assert */
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/file3.py");
+  /* collect */
+  /* assert */
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 #if (PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL) && !PIKA_POOL_ENABLE
 TEST(builtin, bigfile) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/bigfile.py");
-    /* collect */
-    // uint8_t* b = obj_getBytes(pikaMain, "b");
-    /* assert */
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/bigfile.py");
+  /* collect */
+  // uint8_t* b = obj_getBytes(pikaMain, "b");
+  /* assert */
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 TEST(builtin, nofound) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/file_nofound.py");
-    /* collect */
-    /* assert */
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/file_nofound.py");
+  /* collect */
+  /* assert */
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 
 #if PIKA_SYNTAX_LEVEL == PIKA_SYNTAX_LEVEL_MAXIMAL
 TEST(builtin, callback_1) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "test/python/callback/test1.py");
-    /* collect */
-    /* assert */
-    EXPECT_STREQ(log_buff[0], "b\r\n");
-    EXPECT_STREQ(log_buff[1], "a\r\n");
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "test/python/callback/test1.py");
+  /* collect */
+  /* assert */
+  EXPECT_STREQ(log_buff[0], "b\r\n");
+  EXPECT_STREQ(log_buff[1], "a\r\n");
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 #endif
 
 #if !PIKA_NANO_ENABLE
 TEST(builtin, utf8) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/utf8.py");
-    /* collect */
-    /* assert */
-    EXPECT_STREQ(log_buff[2], "你好,Hello, Bonjour.\r\n");
-    EXPECT_STREQ(log_buff[1], "你好,Hello, Bonjour.\r\n");
-    EXPECT_STREQ(log_buff[0], "Hi, Hello, Bonjour.\r\n");
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/utf8.py");
+  /* collect */
+  /* assert */
+  EXPECT_STREQ(log_buff[2], "你好,Hello, Bonjour.\r\n");
+  EXPECT_STREQ(log_buff[1], "你好,Hello, Bonjour.\r\n");
+  EXPECT_STREQ(log_buff[0], "Hi, Hello, Bonjour.\r\n");
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 
 TEST(builtin, str_join) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "test/python/builtin/str_join.py");
-    /* collect */
-    /* assert */
-    EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
-    EXPECT_STREQ(log_buff[0], "PASS\r\n");
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "test/python/builtin/str_join.py");
+  /* collect */
+  /* assert */
+  EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
+  EXPECT_STREQ(log_buff[0], "PASS\r\n");
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 
 TEST(builtin, int_extern) {
-    /* init */
-    g_PikaMemInfo.heapUsedMax = 0;
-    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
-    /* run */
-    __platform_printf("BEGIN\r\n");
-    pikaVM_runSingleFile(pikaMain, "test/python/builtin/int_extern.py");
-    /* collect */
-    /* assert */
-    EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
-    EXPECT_STREQ(log_buff[0], "PASS\r\n");
-    /* deinit */
-    obj_deinit(pikaMain);
-    EXPECT_EQ(pikaMemNow(), 0);
+  /* init */
+  g_PikaMemInfo.heapUsedMax = 0;
+  PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);
+  /* run */
+  __platform_printf("BEGIN\r\n");
+  pikaVM_runSingleFile(pikaMain, "test/python/builtin/int_extern.py");
+  /* collect */
+  /* assert */
+  EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
+  EXPECT_STREQ(log_buff[0], "PASS\r\n");
+  /* deinit */
+  obj_deinit(pikaMain);
+  EXPECT_EQ(pikaMemNow(), 0);
 }
 
-TEST_RUN_SINGLE_FILE_PASS(builtin,
-                          list_tuple_equ,
+TEST_RUN_SINGLE_FILE_PASS(builtin, list_tuple_equ,
                           "test/python/builtin/list_tuple_equ.py")
 
-TEST_RUN_SINGLE_FILE_PASS(builtin,
-                          fn_default1,
+TEST_RUN_SINGLE_FILE_PASS(builtin, fn_default1,
                           "test/python/builtin/fn_default1.py")
 
-TEST_RUN_SINGLE_FILE_PASS(builtin,
-                          fn_default_tuple,
+TEST_RUN_SINGLE_FILE_PASS(builtin, fn_default_tuple,
                           "test/python/builtin/fn_default_tuple.py")
 
 TEST_RUN_SINGLE_FILE_PASS(builtin, max_min, "test/python/builtin/max_min.py")
 
 TEST_RUN_SINGLE_FILE_PASS(builtin, split, "test/python/builtin/split.py")
 
-TEST_RUN_LINES_EXCEPT_OUTPUT(builtin,
-                             split_slice,
-                             "'test'.split('e')[0]",
+TEST_RUN_LINES_EXCEPT_OUTPUT(builtin, split_slice, "'test'.split('e')[0]",
                              "'t'\r\n")
 
-TEST_RUN_LINES_EXCEPT_OUTPUT(builtin,
-                             split_slice_1,
-                             "'test'.split('e')[1]",
+TEST_RUN_LINES_EXCEPT_OUTPUT(builtin, split_slice_1, "'test'.split('e')[1]",
                              "'st'\r\n")
 
-TEST_RUN_LINES_EXCEPT_OUTPUT(builtin,
-                             replace_split_0,
+TEST_RUN_LINES_EXCEPT_OUTPUT(builtin, replace_split_0,
                              "'a b c d'.replace(' ', ',').split(',')[0]",
                              "'a'\r\n")
 
+TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(builtin, class_script,
+                                   "test/python/builtin/class_script.py",
+                                   "Obj1.test\r\n")
+
 #endif
 
 TEST_END

+ 9 - 0
test/python/builtin/class_script.py

@@ -0,0 +1,9 @@
+class Obj1:
+    def test(self):
+        print("Obj1.test")
+
+class Test:
+    a = Obj1()
+    a.test()
+
+t = Test()

+ 22 - 4
test/test_common.h

@@ -19,15 +19,15 @@ extern "C" {
 #include "pika_config_gtest.h"
 #include "pika_hal.h"
 #include <stdio.h>
-char* PikaStdData_Dict___str__(PikaObj* self);
-char* PikaStdData_List___str__(PikaObj* self);
+char *PikaStdData_Dict___str__(PikaObj *self);
+char *PikaStdData_List___str__(PikaObj *self);
 
 extern PikaMemInfo g_PikaMemInfo;
 /* the log_buff of printf */
 extern char log_buff[LOG_BUFF_MAX][LOG_SIZE];
 }
 
-#define TEST_RUN_SINGLE_FILE(_test_suite_, _test_name_, _file_name_)               \
+#define TEST_RUN_SINGLE_FILE(_test_suite_, _test_name_, _file_name_)           \
   TEST(_test_suite_, _test_name_) {                                            \
     g_PikaMemInfo.heapUsedMax = 0;                                             \
     PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);                  \
@@ -42,7 +42,7 @@ extern char log_buff[LOG_BUFF_MAX][LOG_SIZE];
     EXPECT_EQ(pikaMemNow(), 0);                                                \
   }
 
-#define TEST_RUN_SINGLE_FILE_PASS(_test_suite_, _test_name_, _file_name_)          \
+#define TEST_RUN_SINGLE_FILE_PASS(_test_suite_, _test_name_, _file_name_)      \
   TEST(_test_suite_, _test_name_) {                                            \
     g_PikaMemInfo.heapUsedMax = 0;                                             \
     PikaObj *pikaMain = newRootObj("pikaMain", New_PikaMain);                  \
@@ -59,6 +59,24 @@ extern char log_buff[LOG_BUFF_MAX][LOG_SIZE];
     EXPECT_EQ(pikaMemNow(), 0);                                                \
   }
 
+#define TEST_RUN_SINGLE_FILE_EXCEPT_OUTPUT(_test_suite_, _test_name_,          \
+                                           _file_name_, _except_output_)       \
+  TEST(_test_suite_, _test_name_) {                                            \
+    g_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, _file_name_);                               \
+    /* assert */                                                               \
+    EXPECT_STREQ(log_buff[0], (_except_output_));                              \
+    EXPECT_STREQ(log_buff[1], "BEGIN\r\n");                                    \
+    /* deinit */                                                               \
+    obj_deinit(pikaMain);                                                      \
+    EXPECT_EQ(pikaMemNow(), 0);                                                \
+  }
+
 #define TEST_RUN_LINES(_test_suite_, _test_name_, _lines_)                     \
   TEST(_test_suite_, _test_name_) {                                            \
     PikaObj *self = newRootObj("root", New_PikaMain);                          \