mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
get byteCodeUnit and ConstPoolBuff from Asm is ok
This commit is contained in:
parent
a4cd654b45
commit
b3d6206c45
@ -773,25 +773,28 @@ TEST(ByteCodeUnit, base) {
|
||||
ByteCodeUnit bu = {
|
||||
.deepth = 0,
|
||||
.isNewLine_instruct = 0,
|
||||
.const_pool_index = 0,
|
||||
};
|
||||
byteCodeUnit_setBlockDeepth(&bu, 2);
|
||||
byteCodeUnit_setIsNewLine(&bu, 1);
|
||||
byteCodeUnit_setInvokeDeepth(&bu, 3);
|
||||
byteCodeUnit_setInstruct(&bu, (Instruct)4);
|
||||
byteCodeUnit_setConstPoolIndex(&bu, 12);
|
||||
|
||||
EXPECT_EQ(byteCodeUnit_getBlockDeepth(&bu), 2);
|
||||
EXPECT_EQ(byteCodeUnit_getIsNewLine(&bu), 1);
|
||||
EXPECT_EQ(byteCodeUnit_getInvokeDeepth(&bu), 3);
|
||||
EXPECT_EQ(byteCodeUnit_getInstruct(&bu), 4);
|
||||
EXPECT_EQ(byteCodeUnit_getConstPoolIndex(&bu), 12);
|
||||
}
|
||||
|
||||
TEST(ByteCodeUnit, new_) {
|
||||
char data[] = "test";
|
||||
ByteCodeUnit* bu_p = New_byteCodeUnit(strGetSize(data));
|
||||
byteCodeUnit_setData(bu_p, data);
|
||||
EXPECT_STREQ(byteCodeUnit_getData(bu_p), (char*)"test");
|
||||
EXPECT_EQ(byteCodeUnit_getTotleSize(bu_p), 8);
|
||||
EXPECT_EQ(byteCodeUnit_getTotleSize_withDataSize(strGetSize(data)), 8);
|
||||
byteCodeUnit_deinit(bu_p);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
// TEST(ByteCodeUnit, new_) {
|
||||
// char data[] = "test";
|
||||
// ByteCodeUnit* bu_p = New_byteCodeUnit(strGetSize(data));
|
||||
// byteCodeUnit_setData(bu_p, data);
|
||||
// EXPECT_STREQ(byteCodeUnit_getData(bu_p), (char*)"test");
|
||||
// EXPECT_EQ(byteCodeUnit_getTotleSize(bu_p), 8);
|
||||
// EXPECT_EQ(byteCodeUnit_getTotleSize_withDataSize(strGetSize(data)), 8);
|
||||
// byteCodeUnit_deinit(bu_p);
|
||||
// EXPECT_EQ(pikaMemNow(), 0);
|
||||
// }
|
||||
|
@ -2112,12 +2112,24 @@ TEST(parser, class_def) {
|
||||
TEST(parser, nag_a) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
char* lines = (char*)
|
||||
"print(-a)\n"
|
||||
;
|
||||
char* lines = (char*)"print(-a)\n";
|
||||
printf("%s", lines);
|
||||
char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
|
||||
printf("%s", pikaAsm);
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(asmer, asmer_to_byteCodeUnit) {
|
||||
char* asm_line = (char*)
|
||||
"B2\n"
|
||||
"2 NUM 2\n"
|
||||
"2 NUM 3\n"
|
||||
"1 RUN add\n"
|
||||
"0 RUN test.on\n"
|
||||
;
|
||||
Args buffs = {0};
|
||||
char* ByteCode = Asmer_asmToByteCode(&buffs, asm_line);
|
||||
strsDeinit(&buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
@ -1519,10 +1519,56 @@ int32_t AST_deinit(AST* ast) {
|
||||
return obj_deinit(ast);
|
||||
}
|
||||
|
||||
char* Parser_asmToByteCode(Args* outBuffs, char* pikaAsm){
|
||||
char* Asmer_asmToByteCode(Args* outBuffs, char* pikaAsm) {
|
||||
Asmer asmer = {
|
||||
.asm_code = pikaAsm,
|
||||
.block_deepth_now = 0,
|
||||
.is_new_line = 0,
|
||||
.line_pointer = pikaAsm,
|
||||
.const_pool_index_now = 0,
|
||||
};
|
||||
|
||||
Arg* const_pool_buff = arg_setStr(NULL, "", "");
|
||||
char line_buff[PIKA_CONFIG_PATH_BUFF_SIZE] = {0};
|
||||
for (int i = 0; i < strCountSign(pikaAsm, '\n'); i++) {
|
||||
/* get line */
|
||||
char* line = strGetLine(line_buff, asmer.line_pointer);
|
||||
|
||||
/* process block deepth flag*/
|
||||
if ('B' == line[0]) {
|
||||
asmer.block_deepth_now = line[1] - '0';
|
||||
asmer.is_new_line = 1;
|
||||
goto next_line;
|
||||
}
|
||||
|
||||
/* process each ins */
|
||||
|
||||
/* load Asm to byte code unit */
|
||||
ByteCodeUnit bu = {0};
|
||||
byteCodeUnit_setBlockDeepth(&bu, asmer.block_deepth_now);
|
||||
byteCodeUnit_setInvokeDeepth(&bu, line[0] - '0');
|
||||
byteCodeUnit_setConstPoolIndex(&bu, asmer.const_pool_index_now);
|
||||
byteCodeUnit_setInstruct(&bu, pikaVM_getInstructFromAsm(line));
|
||||
if (asmer.is_new_line) {
|
||||
byteCodeUnit_setIsNewLine(&bu, 1);
|
||||
asmer.is_new_line = 0;
|
||||
}
|
||||
|
||||
/* load const to const pool buff */
|
||||
char* data = line + 6;
|
||||
const_pool_buff = arg_strAppend(const_pool_buff, data);
|
||||
const_pool_buff = arg_strAppend(const_pool_buff, "\n");
|
||||
|
||||
asmer.const_pool_index_now += strGetSize(data) + 1;
|
||||
next_line:
|
||||
/* point to next line */
|
||||
asmer.line_pointer += strGetLineSize(asmer.line_pointer) + 1;
|
||||
}
|
||||
|
||||
arg_deinit(const_pool_buff);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* Parser_byteCodeToAsm(Args* outBuffs, char* pikaByteCode){
|
||||
char* Parser_byteCodeToAsm(Args* outBuffs, char* pikaByteCode) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -30,8 +30,17 @@
|
||||
#include "dataQueueObj.h"
|
||||
#include "dataStack.h"
|
||||
|
||||
typedef struct Asmer_t {
|
||||
char* asm_code;
|
||||
uint8_t block_deepth_now;
|
||||
uint8_t is_new_line;
|
||||
char* line_pointer;
|
||||
uint16_t const_pool_index_now;
|
||||
} Asmer;
|
||||
|
||||
char* Parser_multiLineToAsm(Args* outBuffs, char* multiLine);
|
||||
char* Parser_asmToByteCode(Args* outBuffs, char* pikaAsm);
|
||||
char* ByteCodeUnit_fromAsmLine(Args* outBuffs, char* pikaAsm);
|
||||
char* Parser_byteCodeToAsm(Args* outBuffs, char* pikaByteCode);
|
||||
char* Asmer_asmToByteCode(Args* outBuffs, char* pikaAsm);
|
||||
|
||||
#endif
|
||||
|
20
src/PikaVM.c
20
src/PikaVM.c
@ -696,7 +696,7 @@ const VM_instruct_handler VM_instruct_handler_table[__INSTRCUTION_CNT] = {
|
||||
#include "__instruction_table.cfg"
|
||||
};
|
||||
|
||||
static enum Instruct __getInstruct(char* line) {
|
||||
enum Instruct pikaVM_getInstructFromAsm(char* line) {
|
||||
#define __INS_COMPIRE
|
||||
#include "__instruction_table.cfg"
|
||||
return NON;
|
||||
@ -733,7 +733,7 @@ int32_t pikaVM_runAsmLine(PikaObj* self,
|
||||
}
|
||||
invokeDeepth0[0] = line[0];
|
||||
invokeDeepth1[0] = line[0] + 1;
|
||||
instruct = __getInstruct(line);
|
||||
instruct = pikaVM_getInstructFromAsm(line);
|
||||
data = line + 6;
|
||||
|
||||
vs.q0 = args_getPtr(locals->list, invokeDeepth0);
|
||||
@ -838,12 +838,12 @@ exit:
|
||||
return globals;
|
||||
}
|
||||
|
||||
ByteCodeUnit* New_byteCodeUnit(uint8_t data_size) {
|
||||
ByteCodeUnit* self =
|
||||
pikaMalloc(byteCodeUnit_getTotleSize_withDataSize(data_size));
|
||||
return self;
|
||||
}
|
||||
// ByteCodeUnit* New_byteCodeUnit(uint8_t data_size) {
|
||||
// ByteCodeUnit* self =
|
||||
// pikaMalloc(byteCodeUnit_getTotleSize_withDataSize(data_size));
|
||||
// return self;
|
||||
// }
|
||||
|
||||
void byteCodeUnit_deinit(ByteCodeUnit* self) {
|
||||
pikaFree(self, (byteCodeUnit_getTotleSize(self)));
|
||||
}
|
||||
// void byteCodeUnit_deinit(ByteCodeUnit* self) {
|
||||
// pikaFree(self, (byteCodeUnit_getTotleSize(self)));
|
||||
// }
|
||||
|
36
src/PikaVM.h
36
src/PikaVM.h
@ -38,7 +38,7 @@ enum Instruct {
|
||||
typedef struct ByteCodeUnit_t {
|
||||
uint8_t deepth;
|
||||
uint8_t isNewLine_instruct;
|
||||
uint8_t data[];
|
||||
uint16_t const_pool_index;
|
||||
} ByteCodeUnit;
|
||||
|
||||
VMParameters* pikaVM_run(PikaObj* self, char* pyLine);
|
||||
@ -46,9 +46,10 @@ VMParameters* pikaVM_runAsm(PikaObj* self, char* pikaAsm);
|
||||
|
||||
#define byteCodeUnit_getBlockDeepth(self) (((self)->deepth) & 0x0F)
|
||||
#define byteCodeUnit_getInvokeDeepth(self) (((self)->deepth) >> 4)
|
||||
#define byteCodeUnit_getDataSize(self) (strGetSize((char*)(self)->data))
|
||||
#define byteCodeUnit_getData(self) (char*)((self)->data)
|
||||
// #define byteCodeUnit_getDataSize(self) (strGetSize((char*)(self)->data))
|
||||
// #define byteCodeUnit_getData(self) (char*)((self)->data)
|
||||
#define byteCodeUnit_getInstruct(self) ((self)->isNewLine_instruct & 0x7F)
|
||||
#define byteCodeUnit_getConstPoolIndex(self) ((self)->const_pool_index)
|
||||
#define byteCodeUnit_getIsNewLine(self) ((self)->isNewLine_instruct >> 7)
|
||||
|
||||
#define byteCodeUnit_setBlockDeepth(self, val) \
|
||||
@ -56,15 +57,22 @@ VMParameters* pikaVM_runAsm(PikaObj* self, char* pikaAsm);
|
||||
((self)->deepth) |= (0x0F & val); \
|
||||
} while (0)
|
||||
|
||||
#define byteCodeUnit_setConstPoolIndex(self, val) \
|
||||
do { \
|
||||
((self)->const_pool_index = val); \
|
||||
} while (0)
|
||||
|
||||
#define byteCodeUnit_setInvokeDeepth(self, val) \
|
||||
do { \
|
||||
((self)->deepth) |= ((0x0F & val) << 4); \
|
||||
} while (0)
|
||||
|
||||
#define byteCodeUnit_setData(self, val) \
|
||||
do { \
|
||||
__platform_memcpy((self)->data, val, strGetSize(val) + 1); \
|
||||
} while (0)
|
||||
/*
|
||||
#define byteCodeUnit_setData(self, val) \
|
||||
do { \
|
||||
__platform_memcpy((self)->data, val, strGetSize(val) + 1); \
|
||||
} while (0)
|
||||
*/
|
||||
|
||||
#define byteCodeUnit_setInstruct(self, val) \
|
||||
do { \
|
||||
@ -79,10 +87,14 @@ VMParameters* pikaVM_runAsm(PikaObj* self, char* pikaAsm);
|
||||
ByteCodeUnit* New_byteCodeUnit(uint8_t data_size);
|
||||
void byteCodeUnit_deinit(ByteCodeUnit* self);
|
||||
|
||||
#define __get_alined_size(size) (((((size)-1) / 4) + 1) * 4)
|
||||
#define byteCodeUnit_getTotleSize_withDataSize(data_size) \
|
||||
(__get_alined_size(sizeof(ByteCodeUnit) + data_size + 1))
|
||||
#define byteCodeUnit_getTotleSize(self) \
|
||||
(byteCodeUnit_getTotleSize_withDataSize(byteCodeUnit_getDataSize(self)))
|
||||
/*
|
||||
#define __get_alined_size(size) (((((size)-1) / 4) + 1) * 4)
|
||||
#define byteCodeUnit_getTotleSize_withDataSize(data_size) \
|
||||
(__get_alined_size(sizeof(ByteCodeUnit) + data_size + 1))
|
||||
#define byteCodeUnit_getTotleSize(self) \
|
||||
(byteCodeUnit_getTotleSize_withDataSize(byteCodeUnit_getDataSize(self)))
|
||||
*/
|
||||
|
||||
enum Instruct pikaVM_getInstructFromAsm(char* line);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user