mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use exist const, fix RET parse format
This commit is contained in:
parent
a868117fbc
commit
12ed23ddd7
1
port/linux/.vscode/launch.json
vendored
1
port/linux/.vscode/launch.json
vendored
@ -18,6 +18,7 @@
|
|||||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||||
// "program": "${workspaceFolder}/../build/src/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
// "program": "${workspaceFolder}/../build/src/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||||
"args": [
|
"args": [
|
||||||
|
// "--gtest_filter=parser.class_def",
|
||||||
// "--gtest_filter=VM.WHILE_byte",
|
// "--gtest_filter=VM.WHILE_byte",
|
||||||
// "--gtest_filter=pikaMain.task_run_once",
|
// "--gtest_filter=pikaMain.task_run_once",
|
||||||
// "--gtest_filter=VM.if_elif*",
|
// "--gtest_filter=VM.if_elif*",
|
||||||
|
@ -724,7 +724,7 @@ TEST(parser, def_add) {
|
|||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -750,8 +750,8 @@ TEST(parser, def_add_return) {
|
|||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -781,10 +781,10 @@ TEST(parser, def_while_return) {
|
|||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 JMP -1\n"
|
"0 JMP -1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -811,10 +811,10 @@ TEST(parser, def_while_return_void) {
|
|||||||
"0 REF True\n"
|
"0 REF True\n"
|
||||||
"0 JEZ 2\n"
|
"0 JEZ 2\n"
|
||||||
"B2\n"
|
"B2\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 JMP -1\n"
|
"0 JMP -1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
|
@ -274,9 +274,9 @@ TEST(VM, RET_instruct) {
|
|||||||
char* pikaAsm = (char*)
|
char* pikaAsm = (char*)
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 NUM 13\n"
|
"0 NUM 13\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"0 NUM 2\n"
|
"0 NUM 2\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n";
|
"B0\n";
|
||||||
PikaObj* self = New_TinyObj(NULL);
|
PikaObj* self = New_TinyObj(NULL);
|
||||||
VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
|
VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
|
||||||
@ -295,7 +295,7 @@ TEST(VM, RUN_DEF) {
|
|||||||
"0 JMP 1\n"
|
"0 JMP 1\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 NUM 1\n"
|
"0 NUM 1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
"0 RUN test\n"
|
"0 RUN test\n"
|
||||||
"0 OUT a\n";
|
"0 OUT a\n";
|
||||||
@ -318,7 +318,7 @@ TEST(VM, RUN_global) {
|
|||||||
"0 JMP 1\n"
|
"0 JMP 1\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 REF a\n"
|
"0 REF a\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
"0 RUN test\n"
|
"0 RUN test\n"
|
||||||
"0 OUT b\n";
|
"0 OUT b\n";
|
||||||
@ -347,7 +347,7 @@ TEST(VM, RUN_local_b) {
|
|||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
"0 RUN test\n"
|
"0 RUN test\n"
|
||||||
"0 OUT c\n";
|
"0 OUT c\n";
|
||||||
@ -374,7 +374,7 @@ TEST(VM, RUN_DEF_add) {
|
|||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
"1 NUM 1\n"
|
"1 NUM 1\n"
|
||||||
"1 NUM 2\n"
|
"1 NUM 2\n"
|
||||||
@ -597,9 +597,9 @@ TEST(VM, RUN_DEF_NEW) {
|
|||||||
"0 OUT newObj.x\n"
|
"0 OUT newObj.x\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 NEW newObj\n"
|
"0 NEW newObj\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
"0 RUN testnew\n"
|
"0 RUN testnew\n"
|
||||||
"0 OUT outobj\n"
|
"0 OUT outobj\n"
|
||||||
|
@ -755,7 +755,7 @@ TEST(parser, def_add) {
|
|||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -781,9 +781,9 @@ TEST(parser, def_add_return) {
|
|||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -813,11 +813,11 @@ TEST(parser, def_while_return) {
|
|||||||
"1 REF a\n"
|
"1 REF a\n"
|
||||||
"1 REF b\n"
|
"1 REF b\n"
|
||||||
"0 OPT +\n"
|
"0 OPT +\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 JMP -1\n"
|
"0 JMP -1\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -844,11 +844,11 @@ TEST(parser, def_while_return_void) {
|
|||||||
"0 REF True\n"
|
"0 REF True\n"
|
||||||
"0 JEZ 2\n"
|
"0 JEZ 2\n"
|
||||||
"B2\n"
|
"B2\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 JMP -1\n"
|
"0 JMP -1\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -1998,7 +1998,7 @@ TEST(parser, global) {
|
|||||||
"B1\n"
|
"B1\n"
|
||||||
"0 GLB y,z\n"
|
"0 GLB y,z\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -2057,7 +2057,7 @@ TEST(parser, class_) {
|
|||||||
"0 RAS $origin\n"
|
"0 RAS $origin\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 NEW self\n"
|
"0 NEW self\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n"
|
"B0\n"
|
||||||
);
|
);
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
@ -2097,14 +2097,20 @@ TEST(parser, class_def) {
|
|||||||
"1 STR hello\n"
|
"1 STR hello\n"
|
||||||
"0 RUN print\n"
|
"0 RUN print\n"
|
||||||
"B2\n"
|
"B2\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 RAS $origin\n"
|
"0 RAS $origin\n"
|
||||||
"B1\n"
|
"B1\n"
|
||||||
"0 NEW self\n"
|
"0 NEW self\n"
|
||||||
"0 RET\n"
|
"0 RET \n"
|
||||||
"B0\n");
|
"B0\n");
|
||||||
|
|
||||||
|
ByteCodeFrame bytecode_frame;
|
||||||
|
byteCodeFrame_init(&bytecode_frame);
|
||||||
|
byteCodeFrame_appendFromAsm(&bytecode_frame, pikaAsm);
|
||||||
|
byteCodeFrame_print(&bytecode_frame);
|
||||||
|
byteCodeFrame_deinit(&bytecode_frame);
|
||||||
|
|
||||||
args_deinit(buffs);
|
args_deinit(buffs);
|
||||||
EXPECT_EQ(pikaMemNow(), 0);
|
EXPECT_EQ(pikaMemNow(), 0);
|
||||||
}
|
}
|
||||||
@ -2133,9 +2139,17 @@ TEST(asmer, asmer_to_instructUnit) {
|
|||||||
byteCodeFrame_init(&bytecode_frame);
|
byteCodeFrame_init(&bytecode_frame);
|
||||||
byteCodeFrame_appendFromAsm(&bytecode_frame, asm_line);
|
byteCodeFrame_appendFromAsm(&bytecode_frame, asm_line);
|
||||||
byteCodeFrame_print(&bytecode_frame);
|
byteCodeFrame_print(&bytecode_frame);
|
||||||
InstructUnit* ins_unit = instructArray_getByOffset(&(bytecode_frame.instruct_array), 4);
|
InstructUnit* ins_unit =
|
||||||
|
instructArray_getByOffset(&(bytecode_frame.instruct_array), 4);
|
||||||
instructUnit_print(ins_unit);
|
instructUnit_print(ins_unit);
|
||||||
size_t byteCode_size = byteCodeFrame_getSize(&bytecode_frame);
|
size_t byteCode_size = byteCodeFrame_getSize(&bytecode_frame);
|
||||||
|
uint16_t offset_out =
|
||||||
|
constPool_getOffsetByData(&(bytecode_frame.const_pool), (char*)"add");
|
||||||
|
char* data_out =
|
||||||
|
constPool_getByOffset(&(bytecode_frame.const_pool), offset_out);
|
||||||
|
|
||||||
|
/* assert */
|
||||||
|
EXPECT_STREQ(data_out, (char*)"add");
|
||||||
EXPECT_EQ(byteCode_size, 33);
|
EXPECT_EQ(byteCode_size, 33);
|
||||||
EXPECT_STREQ(constPool_getNext(&(bytecode_frame.const_pool)), (char*)"2");
|
EXPECT_STREQ(constPool_getNext(&(bytecode_frame.const_pool)), (char*)"2");
|
||||||
EXPECT_STREQ(constPool_getNext(&(bytecode_frame.const_pool)), (char*)"3");
|
EXPECT_STREQ(constPool_getNext(&(bytecode_frame.const_pool)), (char*)"3");
|
||||||
@ -2144,7 +2158,7 @@ TEST(asmer, asmer_to_instructUnit) {
|
|||||||
(char*)"test.on");
|
(char*)"test.on");
|
||||||
EXPECT_EQ((uintptr_t)constPool_getNext(&(bytecode_frame.const_pool)),
|
EXPECT_EQ((uintptr_t)constPool_getNext(&(bytecode_frame.const_pool)),
|
||||||
(uintptr_t)NULL);
|
(uintptr_t)NULL);
|
||||||
|
/* deinit */
|
||||||
byteCodeFrame_deinit(&bytecode_frame);
|
byteCodeFrame_deinit(&bytecode_frame);
|
||||||
strsDeinit(&buffs);
|
strsDeinit(&buffs);
|
||||||
EXPECT_EQ(pikaMemNow(), 0);
|
EXPECT_EQ(pikaMemNow(), 0);
|
||||||
|
@ -1322,7 +1322,7 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
|
|||||||
if (strEqu(blockType, "def")) {
|
if (strEqu(blockType, "def")) {
|
||||||
pikaAsm = ASM_addBlockDeepth(ast, outBuffs, pikaAsm,
|
pikaAsm = ASM_addBlockDeepth(ast, outBuffs, pikaAsm,
|
||||||
blockTypeNum + 1);
|
blockTypeNum + 1);
|
||||||
pikaAsm = strsAppend(outBuffs, pikaAsm, (char*)"0 RET\n");
|
pikaAsm = strsAppend(outBuffs, pikaAsm, (char*)"0 RET \n");
|
||||||
}
|
}
|
||||||
/* return when exit class */
|
/* return when exit class */
|
||||||
if (strEqu(blockType, "class")) {
|
if (strEqu(blockType, "class")) {
|
||||||
@ -1332,7 +1332,7 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
|
|||||||
strsAppend(outBuffs, pikaAsm, (char*)"0 RAS $origin\n");
|
strsAppend(outBuffs, pikaAsm, (char*)"0 RAS $origin\n");
|
||||||
pikaAsm = ASM_addBlockDeepth(ast, outBuffs, pikaAsm, 1);
|
pikaAsm = ASM_addBlockDeepth(ast, outBuffs, pikaAsm, 1);
|
||||||
pikaAsm = strsAppend(outBuffs, pikaAsm, (char*)"0 NEW self\n");
|
pikaAsm = strsAppend(outBuffs, pikaAsm, (char*)"0 NEW self\n");
|
||||||
pikaAsm = strsAppend(outBuffs, pikaAsm, (char*)"0 RET\n");
|
pikaAsm = strsAppend(outBuffs, pikaAsm, (char*)"0 RET \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1474,7 +1474,7 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
|
|||||||
if (obj_isArgExist(ast, "return")) {
|
if (obj_isArgExist(ast, "return")) {
|
||||||
/* parse stmt ast */
|
/* parse stmt ast */
|
||||||
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
|
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
|
||||||
pikaAsm = strsAppend(&buffs, pikaAsm, "0 RET\n");
|
pikaAsm = strsAppend(&buffs, pikaAsm, "0 RET \n");
|
||||||
is_block_matched = 1;
|
is_block_matched = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@ -1538,12 +1538,32 @@ ByteCodeFrame* byteCodeFrame_appendFromAsm(ByteCodeFrame* self, char* pikaAsm) {
|
|||||||
|
|
||||||
/* process each ins */
|
/* process each ins */
|
||||||
|
|
||||||
|
/* get constPool offset */
|
||||||
|
uint16_t const_pool_offset = 0;
|
||||||
|
|
||||||
|
char* data = line + 6;
|
||||||
|
uint16_t exist_offset =
|
||||||
|
constPool_getOffsetByData(&(self->const_pool), data);
|
||||||
|
|
||||||
|
/* get const offset */
|
||||||
|
if (strEqu(data, "")) {
|
||||||
|
/* not need const value */
|
||||||
|
const_pool_offset = 0;
|
||||||
|
} else if (65535 == exist_offset) {
|
||||||
|
/* push new const value */
|
||||||
|
const_pool_offset = constPool_getLastOffset(&(self->const_pool));
|
||||||
|
/* load const to const pool buff */
|
||||||
|
constPool_append(&(self->const_pool), data);
|
||||||
|
} else {
|
||||||
|
/* use exist const value */
|
||||||
|
const_pool_offset = exist_offset;
|
||||||
|
}
|
||||||
|
|
||||||
/* load Asm to byte code unit */
|
/* load Asm to byte code unit */
|
||||||
InstructUnit ins_unit = {0};
|
InstructUnit ins_unit = {0};
|
||||||
instructUnit_setBlockDeepth(&ins_unit, asmer.block_deepth_now);
|
instructUnit_setBlockDeepth(&ins_unit, asmer.block_deepth_now);
|
||||||
instructUnit_setInvokeDeepth(&ins_unit, line[0] - '0');
|
instructUnit_setInvokeDeepth(&ins_unit, line[0] - '0');
|
||||||
instructUnit_setConstPoolIndex(
|
instructUnit_setConstPoolIndex(&ins_unit, const_pool_offset);
|
||||||
&ins_unit, constPool_getLastOffset(&(self->const_pool)));
|
|
||||||
instructUnit_setInstruct(&ins_unit, pikaVM_getInstructFromAsm(line));
|
instructUnit_setInstruct(&ins_unit, pikaVM_getInstructFromAsm(line));
|
||||||
if (asmer.is_new_line) {
|
if (asmer.is_new_line) {
|
||||||
instructUnit_setIsNewLine(&ins_unit, 1);
|
instructUnit_setIsNewLine(&ins_unit, 1);
|
||||||
@ -1553,9 +1573,6 @@ ByteCodeFrame* byteCodeFrame_appendFromAsm(ByteCodeFrame* self, char* pikaAsm) {
|
|||||||
/* append instructUnit to instructArray */
|
/* append instructUnit to instructArray */
|
||||||
instructArray_append(&(self->instruct_array), &ins_unit);
|
instructArray_append(&(self->instruct_array), &ins_unit);
|
||||||
|
|
||||||
/* load const to const pool buff */
|
|
||||||
char* data = line + 6;
|
|
||||||
constPool_append(&(self->const_pool), data);
|
|
||||||
next_line:
|
next_line:
|
||||||
/* point to next line */
|
/* point to next line */
|
||||||
asmer.line_pointer += strGetLineSize(asmer.line_pointer) + 1;
|
asmer.line_pointer += strGetLineSize(asmer.line_pointer) + 1;
|
||||||
|
21
src/PikaVM.c
21
src/PikaVM.c
@ -850,6 +850,27 @@ uint16_t constPool_getLastOffset(ConstPool* self) {
|
|||||||
return self->size;
|
return self->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t constPool_getOffsetByData(ConstPool* self, char* data) {
|
||||||
|
uint16_t ptr_befor = self->content_offset_now;
|
||||||
|
/* set ptr_now to begin */
|
||||||
|
self->content_offset_now = 0;
|
||||||
|
uint16_t offset_out = 65535;
|
||||||
|
while (1) {
|
||||||
|
if (NULL == constPool_getNext(self)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
uint16_t offset = self->content_offset_now;
|
||||||
|
if (strEqu(data, constPool_getNow(self))) {
|
||||||
|
offset_out = self->content_offset_now;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
/* retore ptr_now */
|
||||||
|
self->content_offset_now = ptr_befor;
|
||||||
|
return offset_out;
|
||||||
|
}
|
||||||
|
|
||||||
char* constPool_getNext(ConstPool* self) {
|
char* constPool_getNext(ConstPool* self) {
|
||||||
self->content_offset_now += strGetSize(constPool_getNow(self)) + 1;
|
self->content_offset_now += strGetSize(constPool_getNow(self)) + 1;
|
||||||
return constPool_getNow(self);
|
return constPool_getNow(self);
|
||||||
|
@ -37,7 +37,6 @@ enum Instruct {
|
|||||||
__INSTRCUTION_CNT,
|
__INSTRCUTION_CNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct VMState_t {
|
typedef struct VMState_t {
|
||||||
VMParameters* locals;
|
VMParameters* locals;
|
||||||
VMParameters* globals;
|
VMParameters* globals;
|
||||||
@ -152,4 +151,6 @@ VMParameters* pikaVM_runByteCodeWithState(PikaObj* self,
|
|||||||
ByteCodeFrame* bytecode_frame,
|
ByteCodeFrame* bytecode_frame,
|
||||||
uint16_t pc);
|
uint16_t pc);
|
||||||
|
|
||||||
|
uint16_t constPool_getOffsetByData(ConstPool* self, char* data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user