@@ -165,7 +165,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
165165 EM_ASM ({
166166 Module[' asmExports' ] = {};
167167 });
168- for (auto * curr : module ->exports ) {
168+ for (auto & curr : module ->exports ) {
169169 EM_ASM_ ({
170170 var name = Pointer_stringify ($0 );
171171 Module[' asmExports' ][name] = function () {
@@ -177,7 +177,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
177177 }
178178
179179 // verify imports are provided
180- for (auto * import : module ->imports ) {
180+ for (auto & import : module ->imports ) {
181181 EM_ASM_ ({
182182 var mod = Pointer_stringify ($0 );
183183 var base = Pointer_stringify ($1 );
@@ -199,7 +199,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
199199 var source = Module[' HEAP8' ].subarray ($1 , $1 + $2 );
200200 var target = new Int8Array (Module[' outside' ][' newBuffer' ]);
201201 target.set (source, $0 );
202- }, segment.offset , segment.data , segment.size );
202+ }, segment.offset , & segment.data [ 0 ] , segment.data . size () );
203203 }
204204 }
205205
@@ -241,11 +241,13 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
241241
242242 Literal load (Load* load, size_t addr) override {
243243 if (load->align < load->bytes || (addr & (load->bytes -1 ))) {
244+ int64_t out64;
244245 double ret = EM_ASM_DOUBLE ({
245246 var addr = $0 ;
246247 var bytes = $1 ;
247248 var isFloat = $2 ;
248249 var isSigned = $3 ;
250+ var out64 = $4 ;
249251 var save0 = HEAP32 [0 ];
250252 var save1 = HEAP32 [1 ];
251253 for (var i = 0 ; i < bytes; i++) {
@@ -255,23 +257,24 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
255257 if (!isFloat) {
256258 if (bytes === 1 ) ret = isSigned ? HEAP8 [0 ] : HEAPU8 [0 ];
257259 else if (bytes === 2 ) ret = isSigned ? HEAP16 [0 ] : HEAPU16 [0 ];
258- else if (bytes === 4 || bytes === 8 ) ret = isSigned ? HEAP32 [0 ] : HEAPU32 [0 ]; // if i64, return low 32 bits here
259- else abort ();
260+ else if (bytes === 4 ) ret = isSigned ? HEAP32 [0 ] : HEAPU32 [0 ];
261+ else if (bytes === 8 ) {
262+ for (var i = 0 ; i < bytes; i++) {
263+ HEAPU8 [out64 + i] = HEAPU8 [i];
264+ }
265+ } else abort ();
260266 } else {
261267 if (bytes === 4 ) ret = HEAPF32 [0 ];
262268 else if (bytes === 8 ) ret = HEAPF64 [0 ];
263269 else abort ();
264270 }
265271 HEAP32 [0 ] = save0; HEAP32 [1 ] = save1;
266272 return ret;
267- }, addr, load->bytes , isWasmTypeFloat (load->type ), load->signed_ );
273+ }, addr, load->bytes , isWasmTypeFloat (load->type ), load->signed_ , &out64 );
268274 if (!isWasmTypeFloat (load->type )) {
269275 if (load->type == i64 ) {
270276 if (load->bytes == 8 ) {
271- int32_t high = EM_ASM_INT_V ({
272- return HEAPU32 [1 ];
273- });
274- return Literal (int64_t (int32_t (ret)) | (int64_t (int32_t (high)) << 32 ));
277+ return Literal (out64);
275278 } else {
276279 if (load->signed_ ) {
277280 return Literal (int64_t (int32_t (ret)));
0 commit comments