diff --git a/package/PikaStdTask/PikaStdTask_Task.c b/package/PikaStdTask/PikaStdTask_Task.c index 5aaf59d90..372814897 100644 --- a/package/PikaStdTask/PikaStdTask_Task.c +++ b/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) { diff --git a/port/linux/api-make-linux.sh b/port/linux/api-make-linux.sh old mode 100644 new mode 100755 diff --git a/port/linux/api-make-win10.sh b/port/linux/api-make-win10.sh old mode 100644 new mode 100755 diff --git a/port/linux/api-make.sh b/port/linux/api-make.sh old mode 100644 new mode 100755 diff --git a/port/linux/ci_benchmark.sh b/port/linux/ci_benchmark.sh old mode 100644 new mode 100755 diff --git a/port/linux/gtest.sh b/port/linux/gtest.sh old mode 100644 new mode 100755 diff --git a/port/linux/init.sh b/port/linux/init.sh old mode 100644 new mode 100755 diff --git a/port/linux/install_dependency.sh b/port/linux/install_dependency.sh old mode 100644 new mode 100755 diff --git a/port/linux/make.sh b/port/linux/make.sh old mode 100644 new mode 100755 diff --git a/port/linux/package/pikascript/main.py b/port/linux/package/pikascript/main.py index 5bd481d41..63c90d9a2 100644 --- a/port/linux/package/pikascript/main.py +++ b/port/linux/package/pikascript/main.py @@ -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() diff --git a/port/linux/package/pikascript/pikascript-lib/PikaStdTask/PikaStdTask_Task.c b/port/linux/package/pikascript/pikascript-lib/PikaStdTask/PikaStdTask_Task.c index 5aaf59d90..372814897 100644 --- a/port/linux/package/pikascript/pikascript-lib/PikaStdTask/PikaStdTask_Task.c +++ b/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) { diff --git a/port/linux/pkg-push.sh b/port/linux/pkg-push.sh old mode 100644 new mode 100755 diff --git a/port/linux/pull-core.sh b/port/linux/pull-core.sh old mode 100644 new mode 100755 diff --git a/port/linux/push-core.sh b/port/linux/push-core.sh old mode 100644 new mode 100755 diff --git a/port/linux/run.sh b/port/linux/run.sh old mode 100644 new mode 100755 diff --git a/port/linux/test-banchmark.sh b/port/linux/test-banchmark.sh old mode 100644 new mode 100755 diff --git a/port/linux/test/parse-test.cpp b/port/linux/test/parse-test.cpp index 7d2b82dd6..1ded694ff 100644 --- a/port/linux/test/parse-test.cpp +++ b/port/linux/test/parse-test.cpp @@ -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); diff --git a/port/linux/test/pikaMain-test.cpp b/port/linux/test/pikaMain-test.cpp index d2cde5c4c..856b031cf 100644 --- a/port/linux/test/pikaMain-test.cpp +++ b/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); +} diff --git a/port/linux/update-compiler.sh b/port/linux/update-compiler.sh old mode 100644 new mode 100755