Ver código fonte

fix double __init__ when 'import as'

pikastech 3 anos atrás
pai
commit
c02ffb51ab

+ 2 - 5
package/PikaStdLib/PikaStdData_List.c

@@ -17,11 +17,8 @@ Arg* PikaStdData_List_get(PikaObj* self, int i) {
 }
 
 void PikaStdData_List___init__(PikaObj* self) {
-    /* only init once */
-    if (!obj_isArgExist(self, "list")) {
-        PikaList* list = New_list();
-        obj_setPtr(self, "list", list);
-    }
+    PikaList* list = New_list();
+    obj_setPtr(self, "list", list);
 }
 
 void PikaStdData_List_set(PikaObj* self, Arg* arg, int i) {

+ 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=module.__init__"
+                // "--gtest_filter=module.__init__"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 5 - 1
port/linux/package/pikascript/pikascript-lib/GTestTask/GTestTask.c

@@ -8,5 +8,9 @@ void GTestTask_Task_platformGetTick(PikaObj* self) {
 }
 
 void GTestTask___init__(PikaObj* self) {
-    obj_setInt(self, "testval", 8848);
+    if (!obj_isArgExist(self, "testval")) {
+        obj_setInt(self, "testval", 8848);
+    } else {
+        obj_setInt(self, "testval", obj_getInt(self, "testval") + 1);
+    }
 }

+ 2 - 5
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_List.c

@@ -17,11 +17,8 @@ Arg* PikaStdData_List_get(PikaObj* self, int i) {
 }
 
 void PikaStdData_List___init__(PikaObj* self) {
-    /* only init once */
-    if (!obj_isArgExist(self, "list")) {
-        PikaList* list = New_list();
-        obj_setPtr(self, "list", list);
-    }
+    PikaList* list = New_list();
+    obj_setPtr(self, "list", list);
 }
 
 void PikaStdData_List_set(PikaObj* self, Arg* arg, int i) {

+ 19 - 0
port/linux/test/module-test.cpp

@@ -86,6 +86,25 @@ TEST(module, __init__) {
     /* collect */
     /* assert */
     EXPECT_EQ(obj_getInt(pikaMain, "GTestTask.testval"), 8848);
+    EXPECT_STREQ(log_buff[0], "BEGIN\r\n");
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
+TEST(module, __init__2) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    extern unsigned char pikaModules_py_a[];
+    obj_linkLibrary(pikaMain, pikaModules_py_a);
+    __platform_printf("BEGIN\r\n");
+    /* run */
+    obj_run(pikaMain, "import GTestTask as task\n");
+    /* collect */
+    /* assert */
+    EXPECT_EQ(obj_getInt(pikaMain, "task.testval"), 8848);
+    EXPECT_STREQ(log_buff[0], "BEGIN\r\n");
     /* deinit */
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);

+ 0 - 7
src/PikaVM.c

@@ -599,13 +599,6 @@ static Arg* VM_instruction_handler_OUT(PikaObj* self, VMState* vs, char* data) {
 
     /* ouput arg to locals */
     obj_setArg_noCopy(hostObj, data, outArg);
-    if (ARG_TYPE_OBJECT_META == outArg_type) {
-        /* found a mate_object */
-        /* init object */
-        PikaObj* new_obj = obj_getObj(hostObj, data);
-        /* run __init__() when init obj */
-        obj_runNativeMethod(new_obj, "__init__", NULL);
-    }
     return NULL;
 }
 

+ 2 - 5
tools/pikaByteCodeGen/pikascript/pikascript-lib/PikaStdLib/PikaStdData_List.c

@@ -17,11 +17,8 @@ Arg* PikaStdData_List_get(PikaObj* self, int i) {
 }
 
 void PikaStdData_List___init__(PikaObj* self) {
-    /* only init once */
-    if (!obj_isArgExist(self, "list")) {
-        PikaList* list = New_list();
-        obj_setPtr(self, "list", list);
-    }
+    PikaList* list = New_list();
+    obj_setPtr(self, "list", list);
 }
 
 void PikaStdData_List_set(PikaObj* self, Arg* arg, int i) {