mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use ARG_TYPE to run method
This commit is contained in:
parent
0face9d39d
commit
c21a1cfc3b
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
20
src/PikaVM.c
20
src/PikaVM.c
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user