@@ -128,25 +128,29 @@ namespace pyjs
128128 TypedArrayBuffer::TypedArrayBuffer (
129129 em::val js_array, const std::string & format_descriptor
130130 )
131- : m_size(js_array[" length" ].as<unsigned >()),
132- m_bytes_per_element (js_array[" BYTES_PER_ELEMENT" ].as<unsigned >()),
133- m_format_descriptor(format_descriptor),
134- m_data( new uint8_t [m_size * m_bytes_per_element] )
131+ : m_size(js_array[" length" ].as<unsigned >()),
132+ m_bytes_per_element (js_array[" BYTES_PER_ELEMENT" ].as<unsigned >()),
133+ m_format_descriptor(format_descriptor),
134+ m_data(new uint8_t [m_size * m_bytes_per_element])
135135 {
136- em::val js_array_buffer = js_array[" buffer" ].as <em::val>();
137-
138- const unsigned byte_offset = js_array[" byteOffset" ].as <em::val>().as <unsigned >();
139-
140- // this is a uint8 view of the array
136+ // Get the ArrayBuffer backing the JS TypedArray
137+ em::val js_array_buffer = js_array[" buffer" ];
138+
139+ // Offset within the ArrayBuffer
140+ const unsigned byte_offset = js_array[" byteOffset" ].as <unsigned >();
141+
142+ // Create a Uint8Array view of the source JS array
141143 em::val js_uint8array = em::val::global (" Uint8Array" )
142144 .new_ (js_array_buffer, byte_offset, m_size * m_bytes_per_element);
143-
144- em::val wasm_heap_allocated = js_uint8array[" constructor" ].new_ (
145- em::val::module_property (" HEAPU8" )[" buffer" ],
146- reinterpret_cast <uintptr_t >(m_data),
147- m_size * m_bytes_per_element
148- );
149- wasm_heap_allocated.call <void >(" set" , js_uint8array);
145+
146+ // Create a typed_memory_view for the C++ buffer
147+ em::val cpp_view = em::val (emscripten::typed_memory_view (
148+ m_size * m_bytes_per_element,
149+ m_data
150+ ));
151+
152+ // Copy data from JS array into C++ buffer
153+ cpp_view.call <void >(" set" , js_uint8array);
150154 }
151155
152156 TypedArrayBuffer::~TypedArrayBuffer (){
0 commit comments