From c5743cdc70e124384b859ae2704b033b94914286 Mon Sep 17 00:00:00 2001 From: Thorsten Beier Date: Wed, 4 Feb 2026 10:14:51 +0100 Subject: [PATCH] use_typed_memory_view use_typed_memory_view --- src/convert.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/convert.cpp b/src/convert.cpp index 92e3cf6..dfb59cf 100644 --- a/src/convert.cpp +++ b/src/convert.cpp @@ -128,25 +128,29 @@ namespace pyjs TypedArrayBuffer::TypedArrayBuffer( em::val js_array, const std::string & format_descriptor ) - : m_size(js_array["length"].as()), - m_bytes_per_element(js_array["BYTES_PER_ELEMENT"].as()), - m_format_descriptor(format_descriptor), - m_data( new uint8_t[m_size * m_bytes_per_element] ) + : m_size(js_array["length"].as()), + m_bytes_per_element(js_array["BYTES_PER_ELEMENT"].as()), + m_format_descriptor(format_descriptor), + m_data(new uint8_t[m_size * m_bytes_per_element]) { - em::val js_array_buffer = js_array["buffer"].as(); - - const unsigned byte_offset = js_array["byteOffset"].as().as(); - - // this is a uint8 view of the array + // Get the ArrayBuffer backing the JS TypedArray + em::val js_array_buffer = js_array["buffer"]; + + // Offset within the ArrayBuffer + const unsigned byte_offset = js_array["byteOffset"].as(); + + // Create a Uint8Array view of the source JS array em::val js_uint8array = em::val::global("Uint8Array") .new_(js_array_buffer, byte_offset, m_size * m_bytes_per_element); - - em::val wasm_heap_allocated = js_uint8array["constructor"].new_( - em::val::module_property("HEAPU8")["buffer"], - reinterpret_cast(m_data), - m_size * m_bytes_per_element - ); - wasm_heap_allocated.call("set", js_uint8array); + + // Create a typed_memory_view for the C++ buffer + em::val cpp_view = em::val(emscripten::typed_memory_view( + m_size * m_bytes_per_element, + m_data + )); + + // Copy data from JS array into C++ buffer + cpp_view.call("set", js_uint8array); } TypedArrayBuffer::~TypedArrayBuffer(){