use subLocalArgs is ok

This commit is contained in:
pikasTech 2021-10-30 16:51:05 +08:00
parent b4d077f5d2
commit 3914187ba7
2 changed files with 29 additions and 31 deletions

View File

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

View File

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