diff --git a/port/linux/.vscode/launch.json b/port/linux/.vscode/launch.json index 2d69acfec..6f39a25d9 100644 --- a/port/linux/.vscode/launch.json +++ b/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.Run_add" + "--gtest_filter=pikaMain.dump_issue_12l3kjioa" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", diff --git a/port/linux/test/pikaMain-test.cpp b/port/linux/test/pikaMain-test.cpp index 785038415..ecaf6d6b3 100644 --- a/port/linux/test/pikaMain-test.cpp +++ b/port/linux/test/pikaMain-test.cpp @@ -2512,3 +2512,38 @@ TEST(pikaMain, for_loop_issue_1b2a3f1bdf) { obj_deinit(pikaMain); EXPECT_EQ(pikaMemNow(), 0); } + +TEST(pikaMain, syantex_issue123lkjxi) { + char* lines = + "if i < 3\n"; + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + /* run */ + __platform_printf("BEGIN\r\n"); + obj_run(pikaMain, lines); + /* collect */ + /* assert */ + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} + +TEST(pikaMain, dump_issue_12l3kjioa) { + char* lines = + "if i = 1:\n" + " print('test')\n" + "\n" + ; + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + /* run */ + __platform_printf("BEGIN\r\n"); + obj_run(pikaMain, lines); + /* collect */ + /* assert */ + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} diff --git a/src/PikaParser.c b/src/PikaParser.c index de1cadf19..3693d92db 100644 --- a/src/PikaParser.c +++ b/src/PikaParser.c @@ -163,6 +163,7 @@ char* strsPopTokenWithSkip_byStr(Args* outBuffs, } char* strsGetCleanCmd(Args* outBuffs, char* cmd) { + pika_assert(cmd!=NULL); int32_t size = strGetSize(cmd); /* lexer may generate more chars than input */ char* strOut = args_getBuff(outBuffs, size * 2); @@ -1860,6 +1861,11 @@ AST* AST_parseLine(char* line, Stack* block_stack) { } block_matched: + if (NULL == stmt){ + AST_deinit(ast); + ast = NULL; + goto exit; + } stmt = strsGetCleanCmd(&buffs, stmt); ast = AST_parseStmt(ast, stmt); goto exit; diff --git a/src/PikaVM.c b/src/PikaVM.c index 4bd4f4b5e..d3e6a36a1 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -1167,7 +1167,10 @@ static Arg* VM_instruction_handler_JEZ(PikaObj* self, int jmp_expect = fast_atoi(data); arg_newReg(pika_assertArg_reg, PIKA_ARG_BUFF_SIZE); Arg* pika_assertArg = stack_popArg(&(vs->stack), &pika_assertArg_reg); - int pika_assert = arg_getInt(pika_assertArg); + int pika_assert = 0; + if (NULL != pika_assertArg) { + pika_assert = arg_getInt(pika_assertArg); + } arg_deinit(pika_assertArg); vs->ireg[thisBlockDeepth] = !pika_assert; diff --git a/src/dataArg.c b/src/dataArg.c index 0b43d90c6..c0921fcf7 100644 --- a/src/dataArg.c +++ b/src/dataArg.c @@ -269,6 +269,7 @@ Arg* arg_setStr(Arg* self, char* name, char* string) { } int64_t arg_getInt(Arg* self) { + pika_assert(NULL!=self); if (NULL == arg_getContent(self)) { return -999999; } @@ -327,7 +328,7 @@ Arg* arg_copy_noalloc(Arg* arg_src, Arg* arg_dict) { if (NULL == arg_src) { return NULL; } - if (NULL == arg_dict){ + if (NULL == arg_dict) { return arg_copy(arg_src); } /* size is too big to be copied by noalloc */