use ARG_TYPE to run method

This commit is contained in:
lyon1998 2022-03-14 13:54:10 +08:00
parent 0face9d39d
commit c21a1cfc3b
5 changed files with 30 additions and 15 deletions

View File

@ -28,9 +28,9 @@
#ifndef _PikaObj_baseObj__H
#define _PikaObj_baseObj__H
#include "PikaObj.h"
#include "PikaVM.h"
#include "TinyObj.h"
#include "dataMemory.h"
#include "PikaVM.h"
PikaObj* New_BaseObj(Args* args);
int32_t obj_newObjFromClassLoader(PikaObj* self,
char* objPath,

View File

@ -305,7 +305,7 @@ void* getNewClassObjFunByName(PikaObj* obj, char* name) {
}
int32_t __foreach_removeMethodInfo(Arg* argNow, Args* argList) {
if (arg_getType(argNow) == ARG_TYPE_STATIC_METHOD) {
if (arg_getType(argNow) == ARG_TYPE_NATIVE_METHOD) {
args_removeArg(argList, argNow);
return 0;
}
@ -452,12 +452,12 @@ exit:
return res;
}
/* define a static method as default */
/* define a native method as default */
int32_t class_defineMethod(PikaObj* self,
char* declearation,
Method methodPtr) {
return __class_defineMethodWithType(self, declearation, methodPtr,
ARG_TYPE_STATIC_METHOD);
ARG_TYPE_NATIVE_METHOD);
}
/* define object method, object method is which startwith (self) */
@ -468,6 +468,14 @@ int32_t class_defineObjectMethod(PikaObj* self,
ARG_TYPE_OBJECT_METHOD);
}
/* define a static method as default */
int32_t class_defineStaticMethod(PikaObj* self,
char* declearation,
Method methodPtr) {
return __class_defineMethodWithType(self, declearation, methodPtr,
ARG_TYPE_STATIC_METHOD);
}
PIKA_WEAK int __runExtern_contral(PikaObj* self, char* cmd) {
return 0;
}

View File

@ -110,9 +110,15 @@ int32_t obj_freeObj(PikaObj* self, char* subObjectName);
/* method */
int32_t class_defineMethod(PikaObj* self, char* declearation, Method methodPtr);
int32_t class_defineObjectMethod(PikaObj* self,
char* declearation,
Method methodPtr);
int32_t class_defineStaticMethod(PikaObj* self,
char* declearation,
Method methodPtr);
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);

View File

@ -368,19 +368,18 @@ static Arg* VM_instruction_handler_RUN(PikaObj* self, VMState* vs, char* data) {
/* run method */
method_code = (char*)method_ptr;
if (method_code[0] == 'B' && method_code[2] == '\n') {
/* VM method */
sub_locals = pikaVM_runAsmWithPars(method_host_obj, sub_locals,
vs->globals, method_code);
/* get method return */
return_arg = arg_copy(args_getArg(sub_locals->list, (char*)"return"));
} else {
if (method_type == ARG_TYPE_NATIVE_METHOD) {
/* native method */
method_ptr(method_host_obj, sub_locals->list);
/* get method return */
return_arg = arg_copy(args_getArg(sub_locals->list, (char*)"return"));
} else {
/* static method and object method */
sub_locals = pikaVM_runAsmWithPars(method_host_obj, sub_locals,
vs->globals, method_code);
/* get method return */
return_arg = arg_copy(args_getArg(sub_locals->list, (char*)"return"));
}
/* transfer sysOut */
sys_out = obj_getSysOut(method_host_obj);
if (NULL != sys_out) {
@ -713,7 +712,8 @@ static Arg* VM_instruction_handler_DEF(PikaObj* self, VMState* vs, char* data) {
class_defineObjectMethod(hostObj, data,
(Method)ins_unit_now);
} else {
class_defineMethod(hostObj, data, (Method)ins_unit_now);
class_defineStaticMethod(hostObj, data,
(Method)ins_unit_now);
}
break;
}
@ -727,7 +727,7 @@ static Arg* VM_instruction_handler_DEF(PikaObj* self, VMState* vs, char* data) {
if (is_in_class) {
class_defineObjectMethod(hostObj, data, (Method)methodPtr);
} else {
class_defineMethod(hostObj, data, (Method)methodPtr);
class_defineStaticMethod(hostObj, data, (Method)methodPtr);
}
break;
}

View File

@ -42,8 +42,9 @@ typedef enum {
ARG_TYPE_OBJECT,
ARG_TYPE_MATE_OBJECT,
ARG_TYPE_FREE_OBJECT,
ARG_TYPE_STATIC_METHOD,
ARG_TYPE_NATIVE_METHOD,
ARG_TYPE_OBJECT_METHOD,
ARG_TYPE_STATIC_METHOD,
} ArgType;
typedef struct __arg __arg;