From 6b63c13bef64c0d2b15c940a3bd41813d2236ce2 Mon Sep 17 00:00:00 2001 From: lyon Date: Thu, 26 May 2022 15:46:34 +0800 Subject: [PATCH] support bytes() built-in --- package/PikaStdLib/PikaStdLib.pyi | 1 + package/PikaStdLib/PikaStdLib_SysObj.c | 21 +++++++++++++++++++ port/linux/package/pikascript/PikaStdLib.pyi | 1 + .../PikaStdLib/PikaStdLib_SysObj.c | 21 +++++++++++++++++++ src/dataArg.c | 7 ++++++- 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/package/PikaStdLib/PikaStdLib.pyi b/package/PikaStdLib/PikaStdLib.pyi index 11c631f11..f94e38456 100644 --- a/package/PikaStdLib/PikaStdLib.pyi +++ b/package/PikaStdLib/PikaStdLib.pyi @@ -25,6 +25,7 @@ class SysObj(BaseObj): def hex(self, val: int) -> str: ... def ord(self, val: str) -> int: ... def chr(self, val: int) -> str: ... + def bytes(self, val: any) -> bytes: ... class RangeObj(TinyObj): diff --git a/package/PikaStdLib/PikaStdLib_SysObj.c b/package/PikaStdLib/PikaStdLib_SysObj.c index 228bcd870..0c4fa0b40 100644 --- a/package/PikaStdLib/PikaStdLib_SysObj.c +++ b/package/PikaStdLib/PikaStdLib_SysObj.c @@ -295,3 +295,24 @@ char* PikaStdLib_SysObj_chr(PikaObj* self, int val) { obj_setStr(self, "__buf", buff); return obj_getStr(self, "__buf"); } + +Arg* PikaStdLib_SysObj_bytes(PikaObj* self, Arg* val) { + ArgType type = arg_getType(val); + if (ARG_TYPE_INT == type) { + int size = arg_getInt(val); + /* src is NULL so the bytes are all '\0' */ + Arg* bytes = arg_setBytes(NULL, "", NULL, size); + return bytes; + } + if (ARG_TYPE_BYTES == type) { + return arg_copy(val); + } + if (ARG_TYPE_STRING == type) { + int size = strGetSize(arg_getStr(val)); + Arg* bytes = arg_setBytes(NULL, "", (uint8_t*)arg_getStr(val), size); + return bytes; + } + obj_setErrorCode(self, 1); + __platform_printf("Error: input arg type not supported.\r\n"); + return arg_setNull(NULL); +} diff --git a/port/linux/package/pikascript/PikaStdLib.pyi b/port/linux/package/pikascript/PikaStdLib.pyi index 11c631f11..f94e38456 100644 --- a/port/linux/package/pikascript/PikaStdLib.pyi +++ b/port/linux/package/pikascript/PikaStdLib.pyi @@ -25,6 +25,7 @@ class SysObj(BaseObj): def hex(self, val: int) -> str: ... def ord(self, val: str) -> int: ... def chr(self, val: int) -> str: ... + def bytes(self, val: any) -> bytes: ... class RangeObj(TinyObj): 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 228bcd870..0c4fa0b40 100644 --- a/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c +++ b/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c @@ -295,3 +295,24 @@ char* PikaStdLib_SysObj_chr(PikaObj* self, int val) { obj_setStr(self, "__buf", buff); return obj_getStr(self, "__buf"); } + +Arg* PikaStdLib_SysObj_bytes(PikaObj* self, Arg* val) { + ArgType type = arg_getType(val); + if (ARG_TYPE_INT == type) { + int size = arg_getInt(val); + /* src is NULL so the bytes are all '\0' */ + Arg* bytes = arg_setBytes(NULL, "", NULL, size); + return bytes; + } + if (ARG_TYPE_BYTES == type) { + return arg_copy(val); + } + if (ARG_TYPE_STRING == type) { + int size = strGetSize(arg_getStr(val)); + Arg* bytes = arg_setBytes(NULL, "", (uint8_t*)arg_getStr(val), size); + return bytes; + } + obj_setErrorCode(self, 1); + __platform_printf("Error: input arg type not supported.\r\n"); + return arg_setNull(NULL); +} diff --git a/src/dataArg.c b/src/dataArg.c index 1309d3159..c11aff2fc 100644 --- a/src/dataArg.c +++ b/src/dataArg.c @@ -133,9 +133,14 @@ Arg* arg_setBytes(Arg* self, char* name, uint8_t* src, size_t size) { self = arg_setName(self, name); self = arg_setType(self, ARG_TYPE_BYTES); void* dir = arg_getContent(self); + /* set content all to 0 */ __platform_memset(dir, 0, size + sizeof(size_t)); __platform_memcpy(dir, &size, sizeof(size_t)); - __platform_memcpy((void*)((uintptr_t)dir + sizeof(size_t)), src, size); + + /* set init value */ + if (NULL != src) { + __platform_memcpy((void*)((uintptr_t)dir + sizeof(size_t)), src, size); + } return self; }