lyon 4 лет назад
Родитель
Сommit
f5fab030c0

+ 8 - 3
package/PikaStdTask/PikaStdTask_Task.c

@@ -54,9 +54,14 @@ void PikaStdTask_Task_run_once(PikaObj* self) {
                   "0 DEL _l0\n"
                   "B0\n");
     obj_run(__pikaMain,
-            "for i in range(0, __calls_when.len()):\n"
-            "    if __assert_when[i]():\n"
-            "        __calls_when()\n");
+            "len = __calls_when.len()\n"
+            "for i in range(0, len):\n"
+            "    if len == 0:\n"
+            "        break\n"
+            "    when = __assert_when[i]\n"
+            "    if when():\n"
+            "        todo = __calls_when[i]\n"
+            "        todo()\n");
 }
 
 void PikaStdTask_Task_run_always(PikaObj* self) {

+ 4 - 0
port/linux/api-make-linux.sh

@@ -13,8 +13,12 @@ def todo2():
 def todo3():
     print('task 3 running...')
 
+def when3():
+    return True
+
 task = PikaStdTask.Task()
 task.call_always(todo1)
 task.call_always(todo2)
+# task.call_when(todo3, when3)
 
 task.run_once()

+ 8 - 3
port/linux/package/pikascript/pikascript-lib/PikaStdTask/PikaStdTask_Task.c

@@ -54,9 +54,14 @@ void PikaStdTask_Task_run_once(PikaObj* self) {
                   "0 DEL _l0\n"
                   "B0\n");
     obj_run(__pikaMain,
-            "for i in range(0, __calls_when.len()):\n"
-            "    if __assert_when[i]():\n"
-            "        __calls_when()\n");
+            "len = __calls_when.len()\n"
+            "for i in range(0, len):\n"
+            "    if len == 0:\n"
+            "        break\n"
+            "    when = __assert_when[i]\n"
+            "    if when():\n"
+            "        todo = __calls_when[i]\n"
+            "        todo()\n");
 }
 
 void PikaStdTask_Task_run_always(PikaObj* self) {

+ 5 - 1
port/linux/pkg-push.sh

@@ -1893,7 +1893,11 @@ TEST(parser, test__) {
     pikaMemInfo.heapUsedMax = 0;
     Args* buffs = New_strBuff();
     char* lines = (char*)
-        "calls_always.append(fun_todo)";
+            "for i in range(0, __calls_when.len()):\n"
+            "    when = __assert_when[i]\n"
+            "    if when():\n"
+            "        todo = __calls_when[i]\n"
+            "        todo()\n";
     printf("%s", lines);
     char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
     printf("%s", pikaAsm);

+ 32 - 4
port/linux/test/pikaMain-test.cpp

@@ -874,13 +874,12 @@ TEST(pikaMain, dict_index) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
-extern PikaObj* __pikaMain;
 TEST(pikaMain, task_run_once) {
     /* init */
     pikaMemInfo.heapUsedMax = 0;
     /* run */
-    __pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
-    obj_run(__pikaMain,(char*)
+    PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
+    obj_run(pikaMain,(char*)
             "def todo1():\n"
             "    print('task 1 running...')\n"
             "def todo2():\n"
@@ -891,7 +890,6 @@ TEST(pikaMain, task_run_once) {
             "task.run_once()\n"
             "\n");
     /* collect */
-    PikaObj* pikaMain = __pikaMain;
     /* assert */
     EXPECT_STREQ(log_buff[0], (char*)"task 2 running...\r\n");
     EXPECT_STREQ(log_buff[1], (char*)"task 1 running...\r\n");
@@ -899,3 +897,33 @@ TEST(pikaMain, task_run_once) {
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
 }
+
+TEST(pikaMain, task_run_when) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    /* run */
+    PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
+    obj_run(pikaMain,(char*)
+            "def todo1():\n"
+            "    print('task 1 running...')\n"
+            "def todo2():\n"
+            "    print('task 2 running...')\n"
+            "def todo3():\n"
+            "    print('task 3 running...')\n"
+            "def when3():\n"
+            "    return True\n"
+            "task = PikaStdTask.Task()\n"
+            "task.call_always(todo1)\n"
+            "task.call_always(todo2)\n"
+            "task.call_when(todo3, when3)\n"
+            "task.run_once()\n"
+            "\n");
+    /* collect */
+    /* assert */
+    EXPECT_STREQ(log_buff[0], (char*)"task 3 running...\r\n");
+    EXPECT_STREQ(log_buff[1], (char*)"task 2 running...\r\n");
+    EXPECT_STREQ(log_buff[2], (char*)"task 1 running...\r\n");
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}

+ 0 - 0
port/linux/update-compiler.sh