mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use vmState in VM_runInstruct
This commit is contained in:
parent
7e3e28c53f
commit
232112a748
58
src/PikaVM.c
58
src/PikaVM.c
@ -169,15 +169,10 @@ static enum Instruct getInstruct(char* line) {
|
|||||||
return NON;
|
return NON;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
static Arg* pikaVM_runInstruct(PikaObj* self,
|
||||||
VM_State* vmState,
|
VM_State* vmState,
|
||||||
enum Instruct instruct,
|
enum Instruct instruct,
|
||||||
char* data,
|
char* data) {
|
||||||
Queue* invokeQuene0,
|
|
||||||
Queue* invokeQuene1,
|
|
||||||
int32_t* jmp,
|
|
||||||
char* programConter,
|
|
||||||
char* asmStart) {
|
|
||||||
// PIKA_ASSERT(instruct < __INSTRCUTION_CNT);
|
// PIKA_ASSERT(instruct < __INSTRCUTION_CNT);
|
||||||
|
|
||||||
// c_vmInstructionTable[instruct].tHandler()
|
// c_vmInstructionTable[instruct].tHandler()
|
||||||
@ -194,7 +189,7 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
return arg_setStr(strArg, "", data);
|
return arg_setStr(strArg, "", data);
|
||||||
}
|
}
|
||||||
if (instruct == OUT) {
|
if (instruct == OUT) {
|
||||||
Arg* outArg = arg_copy(queue_popArg(invokeQuene0));
|
Arg* outArg = arg_copy(queue_popArg(vmState->q0));
|
||||||
obj_setArg(vmState->locals, data, outArg);
|
obj_setArg(vmState->locals, data, outArg);
|
||||||
arg_deinit(outArg);
|
arg_deinit(outArg);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -233,31 +228,31 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
return arg_setInt(NULL, "", 1);
|
return arg_setInt(NULL, "", 1);
|
||||||
}
|
}
|
||||||
if (instruct == JMP) {
|
if (instruct == JMP) {
|
||||||
*jmp = fast_atoi(data);
|
vmState->jmp = fast_atoi(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == RET) {
|
if (instruct == RET) {
|
||||||
/* exit jmp signal */
|
/* exit jmp signal */
|
||||||
*jmp = -999;
|
vmState->jmp = -999;
|
||||||
Arg* returnArg = arg_copy(queue_popArg(invokeQuene0));
|
Arg* returnArg = arg_copy(queue_popArg(vmState->q0));
|
||||||
method_returnArg(vmState->locals->list, returnArg);
|
method_returnArg(vmState->locals->list, returnArg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == BRK) {
|
if (instruct == BRK) {
|
||||||
/* break jmp signal */
|
/* break jmp signal */
|
||||||
*jmp = -998;
|
vmState->jmp = -998;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == CTN) {
|
if (instruct == CTN) {
|
||||||
/* continue jmp signal */
|
/* continue jmp signal */
|
||||||
*jmp = -997;
|
vmState->jmp = -997;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == DEF) {
|
if (instruct == DEF) {
|
||||||
char* methodPtr = programConter;
|
char* methodPtr = vmState->pc;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int thisBlockDeepth =
|
int thisBlockDeepth =
|
||||||
getThisBlockDeepth(asmStart, programConter, &offset);
|
getThisBlockDeepth(vmState->ASM_start, vmState->pc, &offset);
|
||||||
while (1) {
|
while (1) {
|
||||||
if ((methodPtr[0] == 'B') &&
|
if ((methodPtr[0] == 'B') &&
|
||||||
(methodPtr[1] - '0' == thisBlockDeepth + 1)) {
|
(methodPtr[1] - '0' == thisBlockDeepth + 1)) {
|
||||||
@ -265,15 +260,15 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offset += gotoNextLine(methodPtr);
|
offset += gotoNextLine(methodPtr);
|
||||||
methodPtr = programConter + offset;
|
methodPtr = vmState->pc + offset;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == JEZ) {
|
if (instruct == JEZ) {
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int thisBlockDeepth =
|
int thisBlockDeepth =
|
||||||
getThisBlockDeepth(asmStart, programConter, &offset);
|
getThisBlockDeepth(vmState->ASM_start, vmState->pc, &offset);
|
||||||
Arg* assertArg = arg_copy(queue_popArg(invokeQuene0));
|
Arg* assertArg = arg_copy(queue_popArg(vmState->q0));
|
||||||
int assert = arg_getInt(assertArg);
|
int assert = arg_getInt(assertArg);
|
||||||
arg_deinit(assertArg);
|
arg_deinit(assertArg);
|
||||||
char __else[] = "__else0";
|
char __else[] = "__else0";
|
||||||
@ -281,26 +276,26 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
args_setInt(self->list, __else, !assert);
|
args_setInt(self->list, __else, !assert);
|
||||||
if (0 == assert) {
|
if (0 == assert) {
|
||||||
/* set __else flag */
|
/* set __else flag */
|
||||||
*jmp = fast_atoi(data);
|
vmState->jmp = fast_atoi(data);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == NEL) {
|
if (instruct == NEL) {
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int thisBlockDeepth =
|
int thisBlockDeepth =
|
||||||
getThisBlockDeepth(asmStart, programConter, &offset);
|
getThisBlockDeepth(vmState->ASM_start, vmState->pc, &offset);
|
||||||
char __else[] = "__else0";
|
char __else[] = "__else0";
|
||||||
__else[6] = '0' + thisBlockDeepth;
|
__else[6] = '0' + thisBlockDeepth;
|
||||||
if (0 == args_getInt(self->list, __else)) {
|
if (0 == args_getInt(self->list, __else)) {
|
||||||
/* set __else flag */
|
/* set __else flag */
|
||||||
*jmp = fast_atoi(data);
|
vmState->jmp = fast_atoi(data);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (instruct == OPT) {
|
if (instruct == OPT) {
|
||||||
Arg* outArg = NULL;
|
Arg* outArg = NULL;
|
||||||
Arg* arg1 = arg_copy(queue_popArg(invokeQuene1));
|
Arg* arg1 = arg_copy(queue_popArg(vmState->q1));
|
||||||
Arg* arg2 = arg_copy(queue_popArg(invokeQuene1));
|
Arg* arg2 = arg_copy(queue_popArg(vmState->q1));
|
||||||
ArgType type_arg1 = arg_getType(arg1);
|
ArgType type_arg1 = arg_getType(arg1);
|
||||||
ArgType type_arg2 = arg_getType(arg2);
|
ArgType type_arg2 = arg_getType(arg2);
|
||||||
int num1_i = 0;
|
int num1_i = 0;
|
||||||
@ -446,7 +441,7 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
char* sysOut;
|
char* sysOut;
|
||||||
/* return arg directly */
|
/* return arg directly */
|
||||||
if (strEqu(data, "")) {
|
if (strEqu(data, "")) {
|
||||||
returnArg = arg_copy(queue_popArg(invokeQuene1));
|
returnArg = arg_copy(queue_popArg(vmState->q1));
|
||||||
goto RUN_exit;
|
goto RUN_exit;
|
||||||
}
|
}
|
||||||
/* get method host obj */
|
/* get method host obj */
|
||||||
@ -490,7 +485,7 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
|
|
||||||
subLocals = New_PikaObj();
|
subLocals = New_PikaObj();
|
||||||
while (1) {
|
while (1) {
|
||||||
Arg* methodArg = arg_copy(queue_popArg(invokeQuene1));
|
Arg* methodArg = arg_copy(queue_popArg(vmState->q1));
|
||||||
if (NULL == methodArg) {
|
if (NULL == methodArg) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -540,15 +535,6 @@ static Arg* pikaVM_runInstruct_without_state(PikaObj* self,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Arg* pikaVM_runInstruct(PikaObj* self,
|
|
||||||
VM_State* vmState,
|
|
||||||
enum Instruct instruct,
|
|
||||||
char* data) {
|
|
||||||
return pikaVM_runInstruct_without_state(
|
|
||||||
self, vmState, instruct, data, vmState->q0, vmState->q1, &vmState->jmp,
|
|
||||||
vmState->pc, vmState->ASM_start);
|
|
||||||
};
|
|
||||||
|
|
||||||
int32_t __clearInvokeQueues(VM_Parameters* locals) {
|
int32_t __clearInvokeQueues(VM_Parameters* locals) {
|
||||||
for (char deepthChar = '0'; deepthChar < '9'; deepthChar++) {
|
for (char deepthChar = '0'; deepthChar < '9'; deepthChar++) {
|
||||||
char deepth[2] = {0};
|
char deepth[2] = {0};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user