@@ -276,16 +276,6 @@ function postInstantiate(baseModule, instance) {
276
276
return demangle ( rawExports , baseModule ) ;
277
277
}
278
278
279
- /** Wraps a WebAssembly function while also taking care of variable arguments. */
280
- function wrapFunction ( fn , argumentsLength ) {
281
- var wrap = ( ...args ) => {
282
- if ( argumentsLength ) argumentsLength . value = args . length ;
283
- return fn ( ...args ) ;
284
- }
285
- wrap . original = fn ;
286
- return wrap ;
287
- }
288
-
289
279
function isResponse ( o ) {
290
280
return typeof Response !== "undefined" && o instanceof Response ;
291
281
}
@@ -342,18 +332,17 @@ exports.instantiateStreaming = instantiateStreaming;
342
332
/** Demangles an AssemblyScript module's exports to a friendly object structure. */
343
333
function demangle ( exports , baseModule ) {
344
334
var module = baseModule ? Object . create ( baseModule ) : { } ;
345
- var argumentsLength = exports [ "__argumentsLength" ] ;
346
- function hasOwnProperty ( elem , prop ) {
347
- return Object . prototype . hasOwnProperty . call ( elem , prop ) ;
348
- }
335
+ var setArgumentsLength = exports [ "__argumentsLength" ]
336
+ ? function ( length ) { exports [ "__argumentsLength" ] . value = length ; }
337
+ : exports [ "__setArgumentsLength" ] || exports [ "__setargc" ] || function ( ) { } ;
349
338
for ( let internalName in exports ) {
350
- if ( ! hasOwnProperty ( exports , internalName ) ) continue ;
351
- let elem = exports [ internalName ] ;
339
+ if ( ! Object . prototype . hasOwnProperty . call ( exports , internalName ) ) continue ;
340
+ const elem = exports [ internalName ] ;
352
341
let parts = internalName . split ( "." ) ;
353
342
let curr = module ;
354
343
while ( parts . length > 1 ) {
355
344
let part = parts . shift ( ) ;
356
- if ( ! hasOwnProperty ( curr , part ) ) curr [ part ] = { } ;
345
+ if ( ! Object . prototype . hasOwnProperty . call ( curr , part ) ) curr [ part ] = { } ;
357
346
curr = curr [ part ] ;
358
347
}
359
348
let name = parts [ 0 ] ;
@@ -381,7 +370,7 @@ function demangle(exports, baseModule) {
381
370
name = name . substring ( hash + 1 ) ;
382
371
curr = curr [ className ] . prototype ;
383
372
if ( / ^ ( g e t | s e t ) : / . test ( name ) ) {
384
- if ( ! hasOwnProperty ( curr , name = name . substring ( 4 ) ) ) {
373
+ if ( ! Object . prototype . hasOwnProperty . call ( curr , name = name . substring ( 4 ) ) ) {
385
374
let getter = exports [ internalName . replace ( "set:" , "get:" ) ] ;
386
375
let setter = exports [ internalName . replace ( "get:" , "set:" ) ] ;
387
376
Object . defineProperty ( curr , name , {
@@ -392,33 +381,36 @@ function demangle(exports, baseModule) {
392
381
}
393
382
} else {
394
383
if ( name === 'constructor' ) {
395
- curr [ name ] = wrapFunction ( elem , argumentsLength ) ;
396
- } else { // for methods
397
- Object . defineProperty ( curr , name , {
398
- value : function ( ...args ) {
399
- if ( argumentsLength ) argumentsLength . value = args . length ;
400
- return elem ( this [ THIS ] , ...args ) ;
401
- }
402
- } ) ;
384
+ ( curr [ name ] = ( ...args ) => {
385
+ setArgumentsLength ( args . length ) ;
386
+ return elem ( ...args ) ;
387
+ } ) . original = elem ;
388
+ } else { // instance method
389
+ ( curr [ name ] = function ( ...args ) { // !
390
+ setArgumentsLength ( args . length ) ;
391
+ return elem ( this [ THIS ] , ...args ) ;
392
+ } ) . original = elem ;
403
393
}
404
394
}
405
395
} else {
406
396
if ( / ^ ( g e t | s e t ) : / . test ( name ) ) {
407
- if ( ! hasOwnProperty ( curr , name = name . substring ( 4 ) ) ) {
397
+ if ( ! Object . prototype . hasOwnProperty . call ( curr , name = name . substring ( 4 ) ) ) {
408
398
Object . defineProperty ( curr , name , {
409
399
get : exports [ internalName . replace ( "set:" , "get:" ) ] ,
410
400
set : exports [ internalName . replace ( "get:" , "set:" ) ] ,
411
401
enumerable : true
412
402
} ) ;
413
403
}
414
- } else if ( typeof elem === "function" ) {
415
- curr [ name ] = wrapFunction ( elem , argumentsLength ) ;
404
+ } else if ( typeof elem === "function" && elem !== setArgumentsLength ) {
405
+ ( curr [ name ] = ( ...args ) => {
406
+ setArgumentsLength ( args . length ) ;
407
+ return elem ( ...args ) ;
408
+ } ) . original = elem ;
416
409
} else {
417
410
curr [ name ] = elem ;
418
411
}
419
412
}
420
413
}
421
-
422
414
return module ;
423
415
}
424
416
0 commit comments