diff --git a/package/PikaStdLib/PikaStdLib_SysObj.c b/package/PikaStdLib/PikaStdLib_SysObj.c index 8a56562d5..ac141e238 100644 --- a/package/PikaStdLib/PikaStdLib_SysObj.c +++ b/package/PikaStdLib/PikaStdLib_SysObj.c @@ -394,6 +394,23 @@ Arg* PikaStdLib_SysObj_bytes(PikaObj* self, Arg* val) { Arg* bytes = arg_newBytes((uint8_t*)arg_getStr(val), size); return bytes; } +#if !PIKA_NANO_ENABLE + if (argType_isObject(type)) { + PikaObj* obj = arg_getPtr(val); + PikaObj* New_PikaStdData_List(Args * args); + PikaObj* New_PikaStdData_Tuple(Args * args); + if (obj->constructor == New_PikaStdData_List || + obj->constructor == New_PikaStdData_Tuple) { + PikaList* list = obj_getPtr(obj, "list"); + Arg* bytes = arg_newBytes(NULL, list_getSize(list)); + uint8_t* bytes_raw = arg_getBytes(bytes); + for (size_t i = 0; i < list_getSize(list); i++) { + bytes_raw[i] = (uint8_t)list_getInt(list, i); + } + return bytes; + } + } +#endif obj_setErrorCode(self, 1); __platform_printf("Error: input arg type not supported.\r\n"); return arg_newNull(); 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 8a56562d5..ac141e238 100644 --- a/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c +++ b/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c @@ -394,6 +394,23 @@ Arg* PikaStdLib_SysObj_bytes(PikaObj* self, Arg* val) { Arg* bytes = arg_newBytes((uint8_t*)arg_getStr(val), size); return bytes; } +#if !PIKA_NANO_ENABLE + if (argType_isObject(type)) { + PikaObj* obj = arg_getPtr(val); + PikaObj* New_PikaStdData_List(Args * args); + PikaObj* New_PikaStdData_Tuple(Args * args); + if (obj->constructor == New_PikaStdData_List || + obj->constructor == New_PikaStdData_Tuple) { + PikaList* list = obj_getPtr(obj, "list"); + Arg* bytes = arg_newBytes(NULL, list_getSize(list)); + uint8_t* bytes_raw = arg_getBytes(bytes); + for (size_t i = 0; i < list_getSize(list); i++) { + bytes_raw[i] = (uint8_t)list_getInt(list, i); + } + return bytes; + } + } +#endif obj_setErrorCode(self, 1); __platform_printf("Error: input arg type not supported.\r\n"); return arg_newNull(); diff --git a/port/linux/test/stddata-test.cpp b/port/linux/test/stddata-test.cpp index 096cd53b9..08ba9d2bf 100644 --- a/port/linux/test/stddata-test.cpp +++ b/port/linux/test/stddata-test.cpp @@ -296,4 +296,19 @@ TEST(stddata, list_bytes) { EXPECT_EQ(pikaMemNow(), 0); } +TEST(stddata, bytes_list) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + /* run */ + __platform_printf("BEGIN\r\n"); + obj_run(pikaMain, "bytes([1,2,3,4])"); + /* collect */ + /* assert */ + EXPECT_STREQ(log_buff[0], "b'\\x01\\x02\\x03\\x04'\r\n"); + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} + #endif