fix @PIKA_C_MACRO_IF

support 'hasattr' 'getattr' for c module
This commit is contained in:
pikastech 2022-09-26 11:03:14 +08:00
parent 70bd8e48a8
commit 76d03f3581
7 changed files with 69 additions and 16 deletions

View File

@ -107,16 +107,16 @@ class SysObj:
@PIKA_C_MACRO_IF("!PIKA_NANO_ENABLE")
def hasattr(obj: object, name: str) -> int: ...
@ staticmethod
@ PIKA_C_MACRO_IF("!PIKA_NANO_ENABLE")
@staticmethod
@PIKA_C_MACRO_IF("!PIKA_NANO_ENABLE")
def exit(): ...
@ PIKA_C_MACRO_IF("0")
@PIKA_C_MACRO_IF("0")
class RangeObj:
def __next__(self) -> any: ...
@ PIKA_C_MACRO_IF("0")
@PIKA_C_MACRO_IF("0")
class StringObj:
def __next__(self) -> any: ...

View File

@ -563,8 +563,16 @@ Arg* PikaStdLib_SysObj_getattr(PikaObj* self, PikaObj* obj, char* name) {
__platform_printf("[Error] getattr: can not get attr of NULL.\r\n");
return NULL;
}
res = arg_copy(obj_getArg(obj, name));
return res;
Arg* arg = obj_getArg(obj, name);
if (NULL == arg) {
arg = obj_getMethodArg(obj, name);
return arg;
}
if (NULL != arg) {
res = arg_copy(arg);
return res;
}
return NULL;
}
void PikaStdLib_SysObj_setattr(PikaObj* self,
@ -591,5 +599,13 @@ int PikaStdLib_SysObj_hasattr(PikaObj* self, PikaObj* obj, char* name) {
__platform_printf("[Error] hasattr: obj is null.\r\n");
return 0;
}
return obj_isArgExist(obj, name);
if (obj_isArgExist(obj, name)) {
return 1;
}
Arg* method = obj_getMethodArg(obj, name);
if (NULL != method) {
arg_deinit(method);
return 1;
}
return 0;
}

View File

@ -11,7 +11,7 @@
"program": "${workspaceFolder}/build/test/pikascript_test",
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
"args": [
"--gtest_filter=proxy.test1"
// "--gtest_filter=proxy.test1"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",

View File

@ -107,16 +107,16 @@ class SysObj:
@PIKA_C_MACRO_IF("!PIKA_NANO_ENABLE")
def hasattr(obj: object, name: str) -> int: ...
@ staticmethod
@ PIKA_C_MACRO_IF("!PIKA_NANO_ENABLE")
@staticmethod
@PIKA_C_MACRO_IF("!PIKA_NANO_ENABLE")
def exit(): ...
@ PIKA_C_MACRO_IF("0")
@PIKA_C_MACRO_IF("0")
class RangeObj:
def __next__(self) -> any: ...
@ PIKA_C_MACRO_IF("0")
@PIKA_C_MACRO_IF("0")
class StringObj:
def __next__(self) -> any: ...

View File

@ -563,8 +563,16 @@ Arg* PikaStdLib_SysObj_getattr(PikaObj* self, PikaObj* obj, char* name) {
__platform_printf("[Error] getattr: can not get attr of NULL.\r\n");
return NULL;
}
res = arg_copy(obj_getArg(obj, name));
return res;
Arg* arg = obj_getArg(obj, name);
if (NULL == arg) {
arg = obj_getMethodArg(obj, name);
return arg;
}
if (NULL != arg) {
res = arg_copy(arg);
return res;
}
return NULL;
}
void PikaStdLib_SysObj_setattr(PikaObj* self,
@ -591,5 +599,13 @@ int PikaStdLib_SysObj_hasattr(PikaObj* self, PikaObj* obj, char* name) {
__platform_printf("[Error] hasattr: obj is null.\r\n");
return 0;
}
return obj_isArgExist(obj, name);
if (obj_isArgExist(obj, name)) {
return 1;
}
Arg* method = obj_getMethodArg(obj, name);
if (NULL != method) {
arg_deinit(method);
return 1;
}
return 0;
}

View File

@ -1901,4 +1901,25 @@ TEST(vm, class_attr_ref) {
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(vm, getattr_native) {
/* init */
pikaMemInfo.heapUsedMax = 0;
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
extern unsigned char pikaModules_py_a[];
obj_linkLibrary(pikaMain, pikaModules_py_a);
/* run */
__platform_printf("BEGIN\r\n");
obj_run(pikaMain,
"mem = PikaStdLib.MemChecker()\n"
"if hasattr(mem, 'max'):\n"
" max = getattr(mem, 'max')\n"
" max()\n"
);
/* collect */
/* assert */
/* deinit */
obj_deinit(pikaMain);
EXPECT_EQ(pikaMemNow(), 0);
}
#endif

View File

@ -2,4 +2,4 @@
#define PIKA_VERSION_MINOR 11
#define PIKA_VERSION_MICRO 2
#define PIKA_EDIT_TIME "2022/09/26 10:13:58"
#define PIKA_EDIT_TIME "2022/09/26 11:38:44"