@@ -276,16 +276,6 @@ function postInstantiate(baseModule, instance) {
276276 return demangle ( rawExports , baseModule ) ;
277277}
278278
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-
289279function isResponse ( o ) {
290280 return typeof Response !== "undefined" && o instanceof Response ;
291281}
@@ -342,18 +332,17 @@ exports.instantiateStreaming = instantiateStreaming;
342332/** Demangles an AssemblyScript module's exports to a friendly object structure. */
343333function demangle ( exports , baseModule ) {
344334 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 ( ) { } ;
349338 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 ] ;
352341 let parts = internalName . split ( "." ) ;
353342 let curr = module ;
354343 while ( parts . length > 1 ) {
355344 let part = parts . shift ( ) ;
356- if ( ! hasOwnProperty ( curr , part ) ) curr [ part ] = { } ;
345+ if ( ! Object . prototype . hasOwnProperty . call ( curr , part ) ) curr [ part ] = { } ;
357346 curr = curr [ part ] ;
358347 }
359348 let name = parts [ 0 ] ;
@@ -381,7 +370,7 @@ function demangle(exports, baseModule) {
381370 name = name . substring ( hash + 1 ) ;
382371 curr = curr [ className ] . prototype ;
383372 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 ) ) ) {
385374 let getter = exports [ internalName . replace ( "set:" , "get:" ) ] ;
386375 let setter = exports [ internalName . replace ( "get:" , "set:" ) ] ;
387376 Object . defineProperty ( curr , name , {
@@ -392,33 +381,36 @@ function demangle(exports, baseModule) {
392381 }
393382 } else {
394383 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 ;
403393 }
404394 }
405395 } else {
406396 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 ) ) ) {
408398 Object . defineProperty ( curr , name , {
409399 get : exports [ internalName . replace ( "set:" , "get:" ) ] ,
410400 set : exports [ internalName . replace ( "get:" , "set:" ) ] ,
411401 enumerable : true
412402 } ) ;
413403 }
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 ;
416409 } else {
417410 curr [ name ] = elem ;
418411 }
419412 }
420413 }
421-
422414 return module ;
423415}
424416
0 commit comments