mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
debuging RUN
This commit is contained in:
parent
c6dec36080
commit
5bcc05a311
@ -7,6 +7,7 @@ extern "C" {
|
||||
#include "dataMemory.h"
|
||||
#include "dataQueue.h"
|
||||
#include "dataStrs.h"
|
||||
#include "PikaMath_Operator.h"
|
||||
}
|
||||
|
||||
TEST(VM, num1) {
|
||||
@ -92,4 +93,17 @@ TEST(VM, ref_a_b) {
|
||||
ASSERT_STREQ(obj_getStr(self, (char*)"b"), (char*)"xy ");
|
||||
obj_deinit(self);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
|
||||
TEST(VM, Run_add) {
|
||||
PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
|
||||
Args* buffs = New_strBuff();
|
||||
|
||||
pikaVM_runAsm(self, pikaParseToAsm(buffs, (char*)"plusInt(1,2)"));
|
||||
|
||||
args_deinit(buffs);
|
||||
// ASSERT_STREQ(obj_getStr(self, (char*)"a"), (char*)"3");
|
||||
obj_deinit(self);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
46
src/PikaVM.c
46
src/PikaVM.c
@ -45,6 +45,22 @@ static enum Instruct getInstruct(char* line) {
|
||||
return NON;
|
||||
}
|
||||
|
||||
static void* getMethodPtr(PikaObj* methodHost, char* methodName) {
|
||||
Args* buffs = New_strBuff();
|
||||
char* methodPtrPath = strsAppend(buffs, "[mp]", methodName);
|
||||
void* res = obj_getPtr(methodHost, methodPtrPath);
|
||||
args_deinit(buffs);
|
||||
return res;
|
||||
}
|
||||
|
||||
static char* getMethodDeclearation(PikaObj* obj, char* methodName) {
|
||||
Args* buffs = New_strBuff();
|
||||
char* methodDeclearationPath = strsAppend(buffs, "[md]", methodName);
|
||||
char* res = obj_getStr(obj, methodDeclearationPath);
|
||||
args_deinit(buffs);
|
||||
return res;
|
||||
}
|
||||
|
||||
Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
enum Instruct instruct,
|
||||
char* data,
|
||||
@ -72,6 +88,36 @@ Arg* pikaVM_runAsmInstruct(PikaObj* self,
|
||||
if (instruct == REF) {
|
||||
return arg_copy(obj_getArg(self, data));
|
||||
}
|
||||
if (instruct == RUN) {
|
||||
Args* buffs = New_strBuff();
|
||||
char* methodPath = data;
|
||||
PikaObj* methodHostObj = obj_getObj(self, methodPath, 1);
|
||||
char* methodName = strsGetLastToken(buffs, methodPath, '.');
|
||||
void* classPtr = obj_getPtr(methodHostObj, "_clsptr");
|
||||
char* methodHostClassName =
|
||||
strsAppend(buffs, "classObj-", obj_getName(methodHostObj));
|
||||
PikaObj* methodHostClass = obj_getClassObjByNewFun(
|
||||
methodHostObj, methodHostClassName, classPtr);
|
||||
/* get method Ptr */
|
||||
void (*methodPtr)(PikaObj * self, Args * args) =
|
||||
getMethodPtr(methodHostClass, methodName);
|
||||
char* methodDecInClass =
|
||||
getMethodDeclearation(methodHostClass, methodName);
|
||||
char* methodDec = strsCopy(buffs, methodDecInClass);
|
||||
/* free method host class to save memory */
|
||||
obj_deinit(methodHostClass);
|
||||
methodHostClass = NULL;
|
||||
/* get type list */
|
||||
char* typeList = strsCut(buffs, methodDec, '(', ')');
|
||||
while (1) {
|
||||
Arg* methodArg = arg_copy(queue_popArg(q1));
|
||||
arg_deinit(methodArg);
|
||||
if (NULL == methodArg) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
args_deinit(buffs);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -318,6 +318,9 @@ Arg* New_arg(void* voidPointer) {
|
||||
}
|
||||
|
||||
Arg* arg_copy(Arg* argToBeCopy) {
|
||||
if (NULL == argToBeCopy) {
|
||||
return NULL;
|
||||
}
|
||||
Arg* argCopied = New_arg(NULL);
|
||||
argCopied = arg_setContent(argCopied, arg_getContent(argToBeCopy),
|
||||
arg_getContentSize(argToBeCopy));
|
||||
|
Loading…
x
Reference in New Issue
Block a user