mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
fix for_for del bug
This commit is contained in:
parent
2bd2e2f4eb
commit
a70cfd82d1
@ -1489,67 +1489,76 @@ TEST(parser, for_list) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
// TEST(parser, for_for_range) {
|
||||
// pikaMemInfo.heapUsedMax = 0;
|
||||
// Args* buffs = New_strBuff();
|
||||
// char* lines = (char*)
|
||||
// "a = 0\n"
|
||||
// "for i in range(0, 10):\n"
|
||||
// " for k in range(0, 3):\n"
|
||||
// " print(k)\n"
|
||||
// " a = a + k\n"
|
||||
// "\n"
|
||||
// ;
|
||||
// printf("%s", lines);
|
||||
// char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
|
||||
// printf("%s", pikaAsm);
|
||||
// EXPECT_STREQ(pikaAsm,(char *)
|
||||
// "B0\n"
|
||||
// "1 REF a\n"
|
||||
// "1 NUM 1\n"
|
||||
// "0 OPT >\n"
|
||||
// "0 JEZ 1\n"
|
||||
// "B1\n"
|
||||
// "0 NUM 1\n"
|
||||
// "0 OUT b\n"
|
||||
// "B0\n"
|
||||
// "0 NEL 1\n"
|
||||
// "1 REF a\n"
|
||||
// "1 NUM 2\n"
|
||||
// "0 OPT >\n"
|
||||
// "0 JEZ 1\n"
|
||||
// "B1\n"
|
||||
// "0 NUM 2\n"
|
||||
// "0 OUT b\n"
|
||||
// "B1\n"
|
||||
// "1 REF a\n"
|
||||
// "1 NUM 1\n"
|
||||
// "0 OPT >\n"
|
||||
// "0 JEZ 1\n"
|
||||
// "B2\n"
|
||||
// "0 NUM 1\n"
|
||||
// "0 OUT b\n"
|
||||
// "B1\n"
|
||||
// "0 NEL 1\n"
|
||||
// "1 REF a\n"
|
||||
// "1 NUM 2\n"
|
||||
// "0 OPT >\n"
|
||||
// "0 JEZ 1\n"
|
||||
// "B2\n"
|
||||
// "0 NUM 2\n"
|
||||
// "0 OUT b\n"
|
||||
// "B1\n"
|
||||
// "0 NEL 1\n"
|
||||
// "B2\n"
|
||||
// "0 NUM 3\n"
|
||||
// "0 OUT b\n"
|
||||
// "B0\n"
|
||||
// "0 NEL 1\n"
|
||||
// "B1\n"
|
||||
// "0 NUM 3\n"
|
||||
// "0 OUT b\n"
|
||||
// "B0\n"
|
||||
// );
|
||||
// args_deinit(buffs);
|
||||
// EXPECT_EQ(pikaMemNow(), 0);
|
||||
// }
|
||||
TEST(parser, for_for_range) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
char* lines = (char*)
|
||||
"a = 0\n"
|
||||
"for i in range(0, 10):\n"
|
||||
" for k in range(0, 3):\n"
|
||||
" print(k)\n"
|
||||
" a = a + k\n"
|
||||
"\n"
|
||||
;
|
||||
printf("%s", lines);
|
||||
char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
|
||||
printf("%s", pikaAsm);
|
||||
EXPECT_STREQ(pikaAsm,(char *)
|
||||
"B0\n"
|
||||
"0 NUM 0\n"
|
||||
"0 OUT a\n"
|
||||
"B0\n"
|
||||
"2 NUM 0\n"
|
||||
"2 NUM 10\n"
|
||||
"1 RUN range\n"
|
||||
"0 RUN iter\n"
|
||||
"0 OUT _l0\n"
|
||||
"0 REF _r1\n"
|
||||
"0 REF _r2\n"
|
||||
"0 REF _r3\n"
|
||||
"0 OUT _l0.a1\n"
|
||||
"0 OUT _l0.a2\n"
|
||||
"0 OUT _l0.a3\n"
|
||||
"B0\n"
|
||||
"0 RUN _l0.__next__\n"
|
||||
"0 OUT i\n"
|
||||
"0 EST i\n"
|
||||
"0 JEZ 2\n"
|
||||
"B1\n"
|
||||
"2 NUM 0\n"
|
||||
"2 NUM 3\n"
|
||||
"1 RUN range\n"
|
||||
"0 RUN iter\n"
|
||||
"0 OUT _l1\n"
|
||||
"0 REF _r1\n"
|
||||
"0 REF _r2\n"
|
||||
"0 REF _r3\n"
|
||||
"0 OUT _l1.a1\n"
|
||||
"0 OUT _l1.a2\n"
|
||||
"0 OUT _l1.a3\n"
|
||||
"B1\n"
|
||||
"0 RUN _l1.__next__\n"
|
||||
"0 OUT k\n"
|
||||
"0 EST k\n"
|
||||
"0 JEZ 2\n"
|
||||
"B2\n"
|
||||
"1 REF k\n"
|
||||
"0 RUN print\n"
|
||||
"B2\n"
|
||||
"1 REF a\n"
|
||||
"1 REF k\n"
|
||||
"0 OPT +\n"
|
||||
"0 OUT a\n"
|
||||
"B1\n"
|
||||
"0 JMP -1\n"
|
||||
"B1\n"
|
||||
"0 DEL _l1\n"
|
||||
"B0\n"
|
||||
"0 JMP -1\n"
|
||||
"B0\n"
|
||||
"0 DEL _l0\n"
|
||||
"B0\n"
|
||||
);
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
@ -380,25 +380,25 @@ TEST(pikaMain, for_in_range) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
// TEST(pikaMain, for_for_in_range) {
|
||||
// /* init */
|
||||
// pikaMemInfo.heapUsedMax = 0;
|
||||
// PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
|
||||
// /* run */
|
||||
// obj_runDirect(pikaMain, (char*)
|
||||
// "a = 0\n"
|
||||
// "for i in range(0, 10):\n"
|
||||
// " for k in range(0, 3):\n"
|
||||
// " print(k)\n"
|
||||
// " a = a + k\n"
|
||||
// "\n"
|
||||
// );
|
||||
// /* collect */
|
||||
// int a = obj_getInt(pikaMain, (char*)"a");
|
||||
// /* assert */
|
||||
// EXPECT_EQ(a, 45);
|
||||
// /* deinit */
|
||||
// obj_deinit(pikaMain);
|
||||
// /* mem check */
|
||||
// EXPECT_EQ(pikaMemNow(), 0);
|
||||
// }
|
||||
TEST(pikaMain, for_for_in_range) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
obj_runDirect(pikaMain, (char*)
|
||||
"a = 0\n"
|
||||
"for i in range(0, 10):\n"
|
||||
" for k in range(0, 3):\n"
|
||||
" print(k)\n"
|
||||
" a = a + k\n"
|
||||
"\n"
|
||||
);
|
||||
/* collect */
|
||||
int a = obj_getInt(pikaMain, (char*)"a");
|
||||
/* assert */
|
||||
EXPECT_EQ(a, 30);
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
/* mem check */
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
@ -1005,10 +1005,9 @@ char* AST_toPikaAsm(AST* ast, Args* buffs) {
|
||||
pikaAsm = strsAppend(buffs, pikaAsm, (char*)"0 JMP -1\n");
|
||||
/* garbage collect for the list */
|
||||
pikaAsm = ASM_addBlockDeepth(ast, buffs, pikaAsm, blockTypeNum);
|
||||
char* _l_x = strsCopy(buffs, "_l");
|
||||
char block_deepth_str[] = "0";
|
||||
block_deepth_str[0] += obj_getInt(ast, "blockDeepth");
|
||||
_l_x = strsAppend(runBuffs, _l_x, block_deepth_str);
|
||||
char _l_x[] = "_lx";
|
||||
char block_deepth_char = blockTypeNum + '0';
|
||||
_l_x[sizeof(_l_x) - 2] = block_deepth_char;
|
||||
pikaAsm = strsAppend(buffs, pikaAsm, (char*)"0 DEL ");
|
||||
pikaAsm = strsAppend(buffs, pikaAsm, (char*)_l_x);
|
||||
pikaAsm = strsAppend(buffs, pikaAsm, (char*)"\n");
|
||||
|
Loading…
x
Reference in New Issue
Block a user