From bdf3f216a246212ff8f6727501c8d809d3955e4a Mon Sep 17 00:00:00 2001 From: Brian Whitman Date: Sun, 30 Mar 2025 09:16:56 -0400 Subject: [PATCH 1/5] allow python `bytes()` to be proxied to JS --- ports/webassembly/proxy_c.c | 9 +++++++++ ports/webassembly/proxy_js.js | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/ports/webassembly/proxy_c.c b/ports/webassembly/proxy_c.c index 00abc43bf2b3f..44373e0e4ee6f 100644 --- a/ports/webassembly/proxy_c.c +++ b/ports/webassembly/proxy_c.c @@ -50,6 +50,7 @@ enum { PROXY_KIND_MP_OBJECT = 8, PROXY_KIND_MP_JSPROXY = 9, PROXY_KIND_MP_EXISTING = 10, + PROXY_KIND_MP_BYTES = 11, }; enum { @@ -200,6 +201,14 @@ void proxy_convert_mp_to_js_obj_cside(mp_obj_t obj, uint32_t *out) { const char *str = mp_obj_str_get_data(obj, &len); out[1] = len; out[2] = (uintptr_t)str; + } else if (mp_obj_get_type(obj) == &mp_type_bytes) { + kind = PROXY_KIND_MP_BYTES; + mp_buffer_info_t bufinfo; + mp_get_buffer(obj, &bufinfo, MP_BUFFER_READ); + size_t len = bufinfo.len; + const uint8_t *buf= bufinfo.buf; + out[1] = len; + out[2] = (uintptr_t)buf; } else if (obj == mp_const_undefined) { kind = PROXY_KIND_MP_JSPROXY; out[1] = 1; diff --git a/ports/webassembly/proxy_js.js b/ports/webassembly/proxy_js.js index 9e7c233e30bfc..7d98d8cf04409 100644 --- a/ports/webassembly/proxy_js.js +++ b/ports/webassembly/proxy_js.js @@ -41,6 +41,7 @@ const PROXY_KIND_MP_GENERATOR = 7; const PROXY_KIND_MP_OBJECT = 8; const PROXY_KIND_MP_JSPROXY = 9; const PROXY_KIND_MP_EXISTING = 10; +const PROXY_KIND_MP_BYTES = 11; const PROXY_KIND_JS_UNDEFINED = 0; const PROXY_KIND_JS_NULL = 1; @@ -264,6 +265,11 @@ function proxy_convert_mp_to_js_obj_jsside(value) { const str_len = Module.getValue(value + 4, "i32"); const str_ptr = Module.getValue(value + 8, "i32"); obj = Module.UTF8ToString(str_ptr, str_len); + } else if (kind == PROXY_KIND_MP_BYTES) { + // bytes + const buf_len = Module.getValue(value + 4, "i32"); + const buf_ptr = Module.getValue(value + 8, "i32") + obj = new Uint8Array(Module.HEAPU8.buffer, buf_ptr, buf_len); } else if (kind === PROXY_KIND_MP_JSPROXY) { // js proxy const id = Module.getValue(value + 4, "i32"); From b11378483f3c633f94dd5a8d806a041ab1cc57fb Mon Sep 17 00:00:00 2001 From: Brian Whitman Date: Sun, 30 Mar 2025 13:18:45 -0400 Subject: [PATCH 2/5] ports/webassembly: fixing code lint error and allows bytes to be proxied back to mp. --- ports/webassembly/proxy_c.c | 9 +++++++-- ports/webassembly/proxy_js.js | 17 ++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ports/webassembly/proxy_c.c b/ports/webassembly/proxy_c.c index 44373e0e4ee6f..b534e53af6c64 100644 --- a/ports/webassembly/proxy_c.c +++ b/ports/webassembly/proxy_c.c @@ -62,6 +62,7 @@ enum { PROXY_KIND_JS_STRING = 5, PROXY_KIND_JS_OBJECT = 6, PROXY_KIND_JS_PYPROXY = 7, + PROXY_KIND_JS_BYTES = 8, }; MP_DEFINE_CONST_OBJ_TYPE( @@ -171,6 +172,10 @@ mp_obj_t proxy_convert_js_to_mp_obj_cside(uint32_t *value) { mp_obj_t s = mp_obj_new_str((void *)value[2], value[1]); free((void *)value[2]); return s; + } else if (value[0] == PROXY_KIND_JS_BYTES) { + mp_obj_t s = mp_obj_new_bytes((void*) value[2], value[1]); + free((void*)value[2]); + return s; } else if (value[0] == PROXY_KIND_JS_PYPROXY) { return proxy_c_get_obj(value[1]); } else { @@ -201,12 +206,12 @@ void proxy_convert_mp_to_js_obj_cside(mp_obj_t obj, uint32_t *out) { const char *str = mp_obj_str_get_data(obj, &len); out[1] = len; out[2] = (uintptr_t)str; - } else if (mp_obj_get_type(obj) == &mp_type_bytes) { + } else if (mp_obj_get_type(obj) == &mp_type_bytes || mp_obj_get_type(obj) == &mp_type_bytearray) { kind = PROXY_KIND_MP_BYTES; mp_buffer_info_t bufinfo; mp_get_buffer(obj, &bufinfo, MP_BUFFER_READ); size_t len = bufinfo.len; - const uint8_t *buf= bufinfo.buf; + const uint8_t *buf = bufinfo.buf; out[1] = len; out[2] = (uintptr_t)buf; } else if (obj == mp_const_undefined) { diff --git a/ports/webassembly/proxy_js.js b/ports/webassembly/proxy_js.js index 7d98d8cf04409..75461300d093e 100644 --- a/ports/webassembly/proxy_js.js +++ b/ports/webassembly/proxy_js.js @@ -51,6 +51,8 @@ const PROXY_KIND_JS_DOUBLE = 4; const PROXY_KIND_JS_STRING = 5; const PROXY_KIND_JS_OBJECT = 6; const PROXY_KIND_JS_PYPROXY = 7; +const PROXY_KIND_JS_BYTES = 8; + class PythonError extends Error { constructor(exc_type, exc_details) { @@ -144,6 +146,7 @@ function proxy_call_python(target, argumentsList) { "null", ["number", "number", "number", "pointer"], [target, argumentsList.length, args, value], + {async:true}, ); if (argumentsList.length > 0) { Module._free(args); @@ -196,7 +199,15 @@ function proxy_convert_js_to_mp_obj_jsside(js_obj, out) { Module.stringToUTF8(js_obj, buf, len + 1); Module.setValue(out + 4, len, "i32"); Module.setValue(out + 8, buf, "i32"); - } else if ( + } else if (js_obj instanceof Uint8Array) { + kind = PROXY_KIND_JS_BYTES; + const len = js_obj.length; + const buf = Module._malloc(len); + for(var i=0;i Date: Sun, 30 Mar 2025 13:21:58 -0400 Subject: [PATCH 3/5] ports/webassembly: further code lint issue --- ports/webassembly/proxy_c.c | 4 ++-- ports/webassembly/proxy_js.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ports/webassembly/proxy_c.c b/ports/webassembly/proxy_c.c index b534e53af6c64..077a2442a66ed 100644 --- a/ports/webassembly/proxy_c.c +++ b/ports/webassembly/proxy_c.c @@ -173,8 +173,8 @@ mp_obj_t proxy_convert_js_to_mp_obj_cside(uint32_t *value) { free((void *)value[2]); return s; } else if (value[0] == PROXY_KIND_JS_BYTES) { - mp_obj_t s = mp_obj_new_bytes((void*) value[2], value[1]); - free((void*)value[2]); + mp_obj_t s = mp_obj_new_bytes((void *) value[2], value[1]); + free((void *)value[2]); return s; } else if (value[0] == PROXY_KIND_JS_PYPROXY) { return proxy_c_get_obj(value[1]); diff --git a/ports/webassembly/proxy_js.js b/ports/webassembly/proxy_js.js index 75461300d093e..ef518eabd04e3 100644 --- a/ports/webassembly/proxy_js.js +++ b/ports/webassembly/proxy_js.js @@ -203,7 +203,7 @@ function proxy_convert_js_to_mp_obj_jsside(js_obj, out) { kind = PROXY_KIND_JS_BYTES; const len = js_obj.length; const buf = Module._malloc(len); - for(var i=0;i Date: Sun, 30 Mar 2025 13:32:15 -0400 Subject: [PATCH 4/5] ports/webassembly: Further code linting. --- ports/webassembly/proxy_c.c | 2 +- ports/webassembly/proxy_js.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ports/webassembly/proxy_c.c b/ports/webassembly/proxy_c.c index 077a2442a66ed..6c20fa850dce9 100644 --- a/ports/webassembly/proxy_c.c +++ b/ports/webassembly/proxy_c.c @@ -173,7 +173,7 @@ mp_obj_t proxy_convert_js_to_mp_obj_cside(uint32_t *value) { free((void *)value[2]); return s; } else if (value[0] == PROXY_KIND_JS_BYTES) { - mp_obj_t s = mp_obj_new_bytes((void *) value[2], value[1]); + mp_obj_t s = mp_obj_new_bytes((void *)value[2], value[1]); free((void *)value[2]); return s; } else if (value[0] == PROXY_KIND_JS_PYPROXY) { diff --git a/ports/webassembly/proxy_js.js b/ports/webassembly/proxy_js.js index ef518eabd04e3..14403a50285b3 100644 --- a/ports/webassembly/proxy_js.js +++ b/ports/webassembly/proxy_js.js @@ -146,7 +146,7 @@ function proxy_call_python(target, argumentsList) { "null", ["number", "number", "number", "pointer"], [target, argumentsList.length, args, value], - {async:true}, + { async: true }, ); if (argumentsList.length > 0) { Module._free(args); @@ -203,11 +203,10 @@ function proxy_convert_js_to_mp_obj_jsside(js_obj, out) { kind = PROXY_KIND_JS_BYTES; const len = js_obj.length; const buf = Module._malloc(len); - for(let i = 0; i < len; i++) Module.HEAPU8[buf + i] = js_obj[i]; + for (let i = 0; i < len; i++) Module.HEAPU8[buf + i] = js_obj[i]; Module.setValue(out + 4, len, "i32"); Module.setValue(out + 8, buf, "i32"); - } else if - ( + } else if ( js_obj instanceof PyProxy || (typeof js_obj === "function" && "_ref" in js_obj) || js_obj instanceof PyProxyThenable From 2a2c2a58f616896d1988d105b518747bec690a0d Mon Sep 17 00:00:00 2001 From: Brian Whitman Date: Sun, 30 Mar 2025 13:33:51 -0400 Subject: [PATCH 5/5] ports/webassembly: Hopefully the last linting error. --- ports/webassembly/proxy_js.js | 1 - 1 file changed, 1 deletion(-) diff --git a/ports/webassembly/proxy_js.js b/ports/webassembly/proxy_js.js index 14403a50285b3..b3264c7886aca 100644 --- a/ports/webassembly/proxy_js.js +++ b/ports/webassembly/proxy_js.js @@ -53,7 +53,6 @@ const PROXY_KIND_JS_OBJECT = 6; const PROXY_KIND_JS_PYPROXY = 7; const PROXY_KIND_JS_BYTES = 8; - class PythonError extends Error { constructor(exc_type, exc_details) { super(exc_details); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy