use parameters to save globals and locals

This commit is contained in:
pikasTech 2021-10-31 10:37:22 +08:00
parent 69acf27ab3
commit 98383a3929
7 changed files with 51 additions and 45 deletions

View File

@ -17,7 +17,7 @@ TEST(VM, num1) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
obj_deinit(self);
args_deinit(buffs);
obj_deinit(globals);
@ -30,7 +30,7 @@ TEST(VM, a_1) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
ASSERT_EQ(args_getInt(globals->attributeList, (char*)"a"), 1);
obj_deinit(self);
@ -45,7 +45,7 @@ TEST(VM, a_1d1) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
ASSERT_FLOAT_EQ(args_getFloat(globals->attributeList, (char*)"a"), 1.1);
obj_deinit(self);
@ -60,7 +60,7 @@ TEST(VM, str_xy) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
ASSERT_STREQ(args_getStr(globals->attributeList, (char*)"a"),
(char*)"xy");
@ -77,7 +77,7 @@ TEST(VM, str_xy_space) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
ASSERT_STREQ(args_getStr(globals->attributeList, (char*)"a"),
(char*)"xy ");
@ -92,7 +92,7 @@ TEST(VM, ref_a_b) {
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
Args* buffs = New_strBuff();
PikaObj* globals = pikaVM_runAsm(
Parameters* globals = pikaVM_runAsm(
self, pikaParseLineToAsm(buffs, (char*)"a = 'xy '", NULL));
globals = pikaVM_runAsmWithArgs(
self, globals, pikaParseLineToAsm(buffs, (char*)"b = a", NULL));
@ -109,7 +109,7 @@ TEST(VM, Run_add) {
PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
Args* buffs = New_strBuff();
PikaObj* globals = pikaVM_runAsm(
Parameters* globals = pikaVM_runAsm(
self, pikaParseLineToAsm(buffs, (char*)"a = plusInt(1,2)", NULL));
args_deinit(buffs);
@ -124,7 +124,7 @@ TEST(VM, Run_add_multy) {
PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
Args* buffs = New_strBuff();
PikaObj* globals =
Parameters* globals =
pikaVM_runAsm(self, pikaParseLineToAsm(buffs, (char*)"b = 2", NULL));
globals = pikaVM_runAsmWithArgs(
self, globals,
@ -142,7 +142,7 @@ TEST(VM, Run_add_1_2_3) {
PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
Args* buffs = New_strBuff();
PikaObj* globals = pikaVM_runAsm(
Parameters* globals = pikaVM_runAsm(
self, pikaParseLineToAsm(buffs, (char*)"a = plusInt(1, plusInt(2,3) )",
NULL));
@ -167,7 +167,7 @@ TEST(VM, JEZ) {
Args* sysRes = New_args(NULL);
args_setErrorCode(sysRes, 0);
args_setSysOut(sysRes, (char*)"");
PikaObj* globals = New_TinyObj(NULL);
Parameters* globals = New_TinyObj(NULL);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
@ -191,7 +191,7 @@ TEST(VM, JMP) {
Args* sysRes = New_args(NULL);
args_setErrorCode(sysRes, 0);
args_setSysOut(sysRes, (char*)"");
PikaObj* globals = New_TinyObj(NULL);
Parameters* globals = New_TinyObj(NULL);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
__clearInvokeQueues(globals);
@ -215,7 +215,7 @@ TEST(VM, JMP_back1) {
Args* sysRes = New_args(NULL);
args_setErrorCode(sysRes, 0);
args_setSysOut(sysRes, (char*)"");
PikaObj* globals = New_TinyObj(NULL);
Parameters* globals = New_TinyObj(NULL);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
lineAddr = pikaVM_runAsmLine(self, globals, pikaAsm, lineAddr);
@ -243,7 +243,7 @@ TEST(VM, WHILE) {
printf("%s", pikaAsm);
pikaMemInfo.heapUsedMax = 0;
PikaObj* self = New_TinyObj(NULL);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
EXPECT_EQ(args_getInt(globals->attributeList, (char*)"a"), 0);
EXPECT_EQ(args_getInt(globals->attributeList, (char*)"b"), 1);
obj_deinit(globals);
@ -258,7 +258,7 @@ TEST(VM, a_1_1) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
int res = args_getInt(globals->attributeList, (char*)"a");
obj_deinit(self);
@ -274,7 +274,7 @@ TEST(VM, a_1_1d1) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
float res = args_getFloat(globals->attributeList, (char*)"a");
obj_deinit(self);
@ -290,7 +290,7 @@ TEST(VM, a_jjcc) {
char* pikaAsm = pikaParseLineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
float res = args_getFloat(globals->attributeList, (char*)"a");
obj_deinit(self);
@ -311,7 +311,7 @@ TEST(VM, while_a_1to10) {
char* pikaAsm = pikaParseMultiLineToAsm(buffs, line);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
int res = args_getInt(globals->attributeList, (char*)"a");
obj_deinit(self);
@ -333,7 +333,7 @@ TEST(VM, mem_x) {
char* pikaAsm = pikaParseMultiLineToAsm(buffs, line);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"", New_PikaMain);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
int res = obj_getInt(globals, (char*)"mem.x");
obj_deinit(self);
@ -361,7 +361,7 @@ TEST(VM, DEF_instruct) {
PikaObj* self = New_TinyObj(NULL);
int lineAddr = 0;
int size = strGetSize(pikaAsm);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
char* methodPtr = (char*)obj_getPtr(self, (char*)"test");
EXPECT_STREQ(methodCode, methodPtr);
obj_deinit(self);
@ -380,7 +380,7 @@ TEST(VM, RET_instruct) {
PikaObj* self = New_TinyObj(NULL);
int lineAddr = 0;
int size = strGetSize(pikaAsm);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
Arg* returnArg = args_getArg(globals->attributeList, (char*)"return");
int num = arg_getInt(returnArg);
EXPECT_EQ(num, 13);
@ -402,7 +402,7 @@ TEST(VM, RUN_DEF) {
"0 RUN test\n"
"0 OUT a\n";
PikaObj* self = New_TinyObj(NULL);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
int num = obj_getInt(self, (char*)"a");
obj_deinit(self);
obj_deinit(globals);

View File

@ -129,7 +129,7 @@ TEST(object_test, test3) {
TEST(object_test, test6) {
PikaObj* obj = newRootObj((char*)"test", New_PikaObj_test);
PikaObj* globals = obj_runDirect(obj, (char*)"res = add(1, 2)");
Parameters* globals = obj_runDirect(obj, (char*)"res = add(1, 2)");
int32_t res = obj_getInt(globals, (char*)"res");
EXPECT_EQ(3, res);
obj_deinit(obj);
@ -178,7 +178,7 @@ TEST(object_test, voidRun) {
TEST(object_test, printa) {
PikaObj* root = newRootObj((char*)"root", New_BaseObj);
PikaObj* globals = obj_runDirect(root,
Parameters* globals = obj_runDirect(root,
(char*)
"a = 2\n"
"print(a)\n"
@ -212,7 +212,7 @@ TEST(object_test, obj_run_while) {
" b = 1\n"
" a = 0\n"
"\n";
PikaObj* globals = obj_runDirect(root, lines);
Parameters* globals = obj_runDirect(root, lines);
EXPECT_EQ(obj_getInt(globals, (char*)"a"), 0);
EXPECT_EQ(obj_getInt(globals, (char*)"b"), 1);
obj_deinit(root);

View File

@ -7,7 +7,7 @@ extern "C" {
TEST(sysObj, print) {
PikaObj* obj = newRootObj((char*)"test", New_PikaStdLib_SysObj);
PikaObj* globals = obj_runDirect(obj, (char*)"print('hello world')");
Parameters* globals = obj_runDirect(obj, (char*)"print('hello world')");
char* sysOut = args_getSysOut(globals->attributeList);
int errCode = args_getErrorCode(globals->attributeList);
printf("sysout = %s\r\n", sysOut);
@ -20,7 +20,7 @@ TEST(sysObj, print) {
TEST(sysObj, noMethod) {
PikaObj* obj = newRootObj((char*)"test", New_PikaStdLib_SysObj);
PikaObj* globals = obj_runDirect(obj, (char*)"printttt('hello world')");
Parameters* globals = obj_runDirect(obj, (char*)"printttt('hello world')");
char* sysOut = args_getSysOut(globals->attributeList);
int errCode = args_getErrorCode(globals->attributeList);
printf("sysout = %s\r\n", sysOut);

View File

@ -403,8 +403,8 @@ PIKA_WEAK int __runExtern_contral(PikaObj* self, char* cmd) {
return 0;
}
PikaObj* obj_runDirect(PikaObj* self, char* cmd) {
PikaObj* globals = NULL;
Parameters* obj_runDirect(PikaObj* self, char* cmd) {
Parameters* globals = NULL;
globals = pikaVM_run(self, cmd);
goto exit;
@ -471,7 +471,7 @@ void obj_runNoRes(PikaObj* slef, char* cmd) {
void obj_run(PikaObj* self, char* cmd) {
/* safe, stop when error occord and error info would be print32_t */
PikaObj* globals = obj_runDirect(self, cmd);
Parameters* globals = obj_runDirect(self, cmd);
obj_deinit(globals);
}

View File

@ -11,6 +11,7 @@
typedef struct PikaObj_t PikaObj;
typedef PikaObj* (*NewFun)(Args* args);
typedef PikaObj* (*InitFun)(PikaObj* self, Args* args);
typedef PikaObj Parameters;
struct PikaObj_t {
/* list */
@ -68,9 +69,6 @@ int32_t class_defineMethod(PikaObj* self,
char* declearation,
void (*methodPtr)(PikaObj* self, Args* args));
void obj_runNoRes(PikaObj* slef, char* cmd);
void obj_run(PikaObj* self, char* cmd);
PikaObj* obj_runDirect(PikaObj* self, char* cmd);
int32_t obj_removeArg(PikaObj* self, char* argPath);
int32_t obj_isArgExist(PikaObj* self, char* argPath);
PikaObj* obj_getClassObjByNewFun(PikaObj* self, char* name, NewFun newClassFun);
@ -106,4 +104,8 @@ float method_getFloat(Args* args, char* argName);
char* method_getStr(Args* args, char* argName);
void method_returnArg(Args* args, Arg* arg);
void obj_runNoRes(PikaObj* slef, char* cmd);
void obj_run(PikaObj* self, char* cmd);
Parameters* obj_runDirect(PikaObj* self, char* cmd);
#endif

View File

@ -101,7 +101,7 @@ int fast_atoi(char* src) {
}
Arg* pikaVM_runAsmInstruct(PikaObj* self,
PikaObj* globals,
Parameters* globals,
enum Instruct instruct,
char* data,
Queue* invokeQuene0,
@ -416,7 +416,7 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
return NULL;
}
int32_t __clearInvokeQueues(PikaObj* globals) {
int32_t __clearInvokeQueues(Parameters* globals) {
for (char deepthChar = '0'; deepthChar < '9'; deepthChar++) {
char deepth[2] = {0};
deepth[0] = deepthChar;
@ -511,7 +511,7 @@ int32_t getAddrOffsetFromJmp(char* start, char* code, int32_t jmp) {
}
int32_t pikaVM_runAsmLine(PikaObj* self,
PikaObj* globals,
Parameters* globals,
char* pikaAsm,
int32_t lineAddr) {
Args* buffs = New_strBuff();
@ -580,7 +580,9 @@ char* useFlashAsBuff(char* pikaAsm, Args* buffs) {
return pikaAsm;
}
PikaObj* pikaVM_runAsmWithArgs(PikaObj* self, PikaObj* globals, char* pikaAsm) {
Parameters* pikaVM_runAsmWithArgs(PikaObj* self,
Parameters* globals,
char* pikaAsm) {
int lineAddr = 0;
int size = strGetSize(pikaAsm);
args_setErrorCode(globals->attributeList, 0);
@ -608,17 +610,17 @@ PikaObj* pikaVM_runAsmWithArgs(PikaObj* self, PikaObj* globals, char* pikaAsm) {
return globals;
}
PikaObj* pikaVM_runAsm(PikaObj* self, char* pikaAsm) {
PikaObj* globals = New_TinyObj(NULL);
Parameters* pikaVM_runAsm(PikaObj* self, char* pikaAsm) {
Parameters* globals = New_TinyObj(NULL);
globals = pikaVM_runAsmWithArgs(self, globals, pikaAsm);
return globals;
}
PikaObj* pikaVM_run(PikaObj* self, char* multiLine) {
Parameters* pikaVM_run(PikaObj* self, char* multiLine) {
Args* buffs = New_strBuff();
char* pikaAsm = pikaParseMultiLineToAsm(buffs, multiLine);
uint32_t asm_size = strGetSize(pikaAsm);
PikaObj* globals = pikaVM_runAsm(self, pikaAsm);
Parameters* globals = pikaVM_runAsm(self, pikaAsm);
if (NULL != buffs) {
args_deinit(buffs);
}

View File

@ -2,16 +2,18 @@
#define __PIKA__VM__H
#include "PikaObj.h"
PikaObj* pikaVM_run(PikaObj* self, char* pyLine);
PikaObj* pikaVM_runAsm(PikaObj* self, char* pikaAsm);
int32_t __clearInvokeQueues(PikaObj* globals);
Parameters* pikaVM_run(PikaObj* self, char* pyLine);
Parameters* pikaVM_runAsm(PikaObj* self, char* pikaAsm);
Parameters* pikaVM_runAsmWithArgs(PikaObj* self, Parameters* globals, char* pikaAsm);
int32_t __clearInvokeQueues(Parameters* globals);
char* useFlashAsBuff(char* pikaAsm, Args* buffs);
int32_t gotoNextLine(char* code);
int32_t gotoLastLine(char* start, char* code);
int getThisBlockDeepth(char* start, char* code, int* offset);
PikaObj* pikaVM_runAsmWithArgs(PikaObj* self, PikaObj* globals, char* pikaAsm);
int32_t pikaVM_runAsmLine(PikaObj* self,
PikaObj* globals,
Parameters* globals,
char* pikaAsm,
int32_t lineAddr);