diff --git a/src/BaseObj.h b/src/BaseObj.h index 4ceaf2277..4cf608ded 100644 --- a/src/BaseObj.h +++ b/src/BaseObj.h @@ -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, diff --git a/src/PikaObj.c b/src/PikaObj.c index 91d756014..b4747da50 100644 --- a/src/PikaObj.c +++ b/src/PikaObj.c @@ -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; } diff --git a/src/PikaObj.h b/src/PikaObj.h index 1b383f656..771d0c7cb 100644 --- a/src/PikaObj.h +++ b/src/PikaObj.h @@ -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); diff --git a/src/PikaVM.c b/src/PikaVM.c index 0684020fe..5c20a82d7 100644 --- a/src/PikaVM.c +++ b/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; } diff --git a/src/dataArg.h b/src/dataArg.h index e41ed284c..c0fa645ad 100644 --- a/src/dataArg.h +++ b/src/dataArg.h @@ -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;