mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use subLocalArgs is ok
This commit is contained in:
parent
b4d077f5d2
commit
3914187ba7
@ -372,21 +372,21 @@ TEST(VM, RET_instruct) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
// TEST(VM, RUN_DEF) {
|
||||
// char* pikaAsm = (char*)
|
||||
// "B0\n"
|
||||
// "0 DEF test()\n"
|
||||
// "B0\n"
|
||||
// "0 JMP 1\n"
|
||||
// "B1\n"
|
||||
// "0 NUM 1\n"
|
||||
// "0 RET\n"
|
||||
// "B0\n"
|
||||
// "0 RUN test\n"
|
||||
// "0 OUT a\n";
|
||||
// PikaObj* self = New_TinyObj(NULL);
|
||||
// args_deinit(pikaVM_runAsm(self, pikaAsm));
|
||||
// int num = obj_getInt(self, (char*)"a");
|
||||
// obj_deinit(self);
|
||||
// EXPECT_EQ(pikaMemNow(), 0);
|
||||
// }
|
||||
TEST(VM, RUN_DEF) {
|
||||
char* pikaAsm = (char*)
|
||||
"B0\n"
|
||||
"0 DEF test()\n"
|
||||
"B0\n"
|
||||
"0 JMP 1\n"
|
||||
"B1\n"
|
||||
"0 NUM 1\n"
|
||||
"0 RET\n"
|
||||
"B0\n"
|
||||
"0 RUN test\n"
|
||||
"0 OUT a\n";
|
||||
PikaObj* self = New_TinyObj(NULL);
|
||||
args_deinit(pikaVM_runAsm(self, pikaAsm));
|
||||
int num = obj_getInt(self, (char*)"a");
|
||||
obj_deinit(self);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
24
src/PikaVM.c
24
src/PikaVM.c
@ -320,7 +320,7 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
if (instruct == RUN) {
|
||||
Args* buffs = New_strBuff();
|
||||
Arg* returnArg = NULL;
|
||||
Args* methodArgs = NULL;
|
||||
Args* subLocalArgs = NULL;
|
||||
char* methodPath = data;
|
||||
/* return arg directly */
|
||||
if (strEqu(data, "")) {
|
||||
@ -360,7 +360,7 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
goto RUN_exit;
|
||||
}
|
||||
|
||||
methodArgs = New_args(NULL);
|
||||
subLocalArgs = New_args(NULL);
|
||||
while (1) {
|
||||
Arg* methodArg = arg_copy(queue_popArg(invokeQuene1));
|
||||
if (NULL == methodArg) {
|
||||
@ -369,7 +369,7 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
char* argDef = strsPopToken(buffs, typeList, ',');
|
||||
char* argName = strsGetFirstToken(buffs, argDef, ':');
|
||||
methodArg = arg_setName(methodArg, argName);
|
||||
args_setArg(methodArgs, methodArg);
|
||||
args_setArg(subLocalArgs, methodArg);
|
||||
}
|
||||
|
||||
obj_setErrorCode(methodHostObj, 0);
|
||||
@ -379,16 +379,15 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
char* methodCode = (char*)methodPtr;
|
||||
if (methodCode[0] == 'B' && methodCode[2] == '\n') {
|
||||
/* VM method */
|
||||
Args* resArgs = pikaVM_runAsmWithLocalArgs(methodHostObj,
|
||||
methodArgs, methodCode);
|
||||
subLocalArgs = pikaVM_runAsmWithLocalArgs(methodHostObj,
|
||||
subLocalArgs, methodCode);
|
||||
/* get method return */
|
||||
returnArg = arg_copy(args_getArg(resArgs, (char*)"return"));
|
||||
args_deinit(resArgs);
|
||||
returnArg = arg_copy(args_getArg(subLocalArgs, (char*)"return"));
|
||||
} else {
|
||||
/* native method */
|
||||
methodPtr(methodHostObj, methodArgs);
|
||||
methodPtr(methodHostObj, subLocalArgs);
|
||||
/* get method return */
|
||||
returnArg = arg_copy(args_getArg(methodArgs, (char*)"return"));
|
||||
returnArg = arg_copy(args_getArg(subLocalArgs, (char*)"return"));
|
||||
}
|
||||
|
||||
/* transfer sysOut */
|
||||
@ -404,8 +403,8 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
|
||||
goto RUN_exit;
|
||||
RUN_exit:
|
||||
if (NULL != methodArgs) {
|
||||
args_deinit(methodArgs);
|
||||
if (NULL != subLocalArgs) {
|
||||
args_deinit(subLocalArgs);
|
||||
}
|
||||
args_deinit(buffs);
|
||||
return returnArg;
|
||||
@ -589,8 +588,7 @@ Args* pikaVM_runAsmWithLocalArgs(PikaObj* self,
|
||||
break;
|
||||
}
|
||||
char* thisLine = pikaAsm + lineAddr;
|
||||
lineAddr =
|
||||
pikaVM_runAsmLine(self, localArgs, pikaAsm, lineAddr);
|
||||
lineAddr = pikaVM_runAsmLine(self, localArgs, pikaAsm, lineAddr);
|
||||
char* sysOut = args_getSysOut(localArgs);
|
||||
uint8_t errcode = args_getErrorCode(localArgs);
|
||||
if (!strEqu("", sysOut)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user