From 76d03f3581589909e2d0a0b0030331c451e42178 Mon Sep 17 00:00:00 2001 From: pikastech Date: Mon, 26 Sep 2022 11:03:14 +0800 Subject: [PATCH] fix @PIKA_C_MACRO_IF support 'hasattr' 'getattr' for c module --- package/PikaStdLib/PikaStdLib.pyi | 8 +++---- package/PikaStdLib/PikaStdLib_SysObj.c | 22 ++++++++++++++++--- port/linux/.vscode/launch.json | 2 +- port/linux/package/pikascript/PikaStdLib.pyi | 8 +++---- .../PikaStdLib/PikaStdLib_SysObj.c | 22 ++++++++++++++++--- port/linux/test/VM-test.cpp | 21 ++++++++++++++++++ src/PikaVersion.h | 2 +- 7 files changed, 69 insertions(+), 16 deletions(-) diff --git a/package/PikaStdLib/PikaStdLib.pyi b/package/PikaStdLib/PikaStdLib.pyi index 78a504072..1f369144d 100644 --- a/package/PikaStdLib/PikaStdLib.pyi +++ b/package/PikaStdLib/PikaStdLib.pyi @@ -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: ... diff --git a/package/PikaStdLib/PikaStdLib_SysObj.c b/package/PikaStdLib/PikaStdLib_SysObj.c index e4a0fa63b..dba4a9bef 100644 --- a/package/PikaStdLib/PikaStdLib_SysObj.c +++ b/package/PikaStdLib/PikaStdLib_SysObj.c @@ -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; } diff --git a/port/linux/.vscode/launch.json b/port/linux/.vscode/launch.json index 9e48f6df9..8f313953d 100644 --- a/port/linux/.vscode/launch.json +++ b/port/linux/.vscode/launch.json @@ -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}", diff --git a/port/linux/package/pikascript/PikaStdLib.pyi b/port/linux/package/pikascript/PikaStdLib.pyi index 78a504072..1f369144d 100644 --- a/port/linux/package/pikascript/PikaStdLib.pyi +++ b/port/linux/package/pikascript/PikaStdLib.pyi @@ -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: ... diff --git a/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c b/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c index e4a0fa63b..dba4a9bef 100644 --- a/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c +++ b/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c @@ -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; } diff --git a/port/linux/test/VM-test.cpp b/port/linux/test/VM-test.cpp index 47c4f07f3..695fa76ec 100644 --- a/port/linux/test/VM-test.cpp +++ b/port/linux/test/VM-test.cpp @@ -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 diff --git a/src/PikaVersion.h b/src/PikaVersion.h index 925e6d779..d45af3e39 100644 --- a/src/PikaVersion.h +++ b/src/PikaVersion.h @@ -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"