mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use parameters to save globals and locals
This commit is contained in:
parent
69acf27ab3
commit
98383a3929
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
18
src/PikaVM.c
18
src/PikaVM.c
@ -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);
|
||||
}
|
||||
|
12
src/PikaVM.h
12
src/PikaVM.h
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user