get byteCodeUnit and ConstPoolBuff from Asm is ok

This commit is contained in:
lyon1998 2022-03-11 22:50:36 +08:00
parent a4cd654b45
commit b3d6206c45
6 changed files with 120 additions and 38 deletions

View File

@ -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);
// }

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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

View File

@ -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)));
// }

View File

@ -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