Ver Fonte

support bytes(list)

pikastech há 3 anos atrás
pai
commit
4e447d89af

+ 17 - 0
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();

+ 17 - 0
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();

+ 15 - 0
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