@@ -184,6 +184,108 @@ function preJS() {
184
184
return result ;
185
185
}
186
186
187
+ function addImplicitDeps ( snippet , deps ) {
188
+ // There are some common dependencies that we inject automatically by
189
+ // conservatively scanning the input functions for their usage.
190
+ // Specifically, these are dependencies that are very common and would be
191
+ // burdensome to add manually to all functions.
192
+ // The first four are deps that are automatically/conditionally added
193
+ // by the {{{ makeDynCall }}}, and {{{ runtimeKeepalivePush/Pop }}} macros.
194
+ const autoDeps = [
195
+ 'getDynCaller' ,
196
+ 'getWasmTableEntry' ,
197
+ 'runtimeKeepalivePush' ,
198
+ 'runtimeKeepalivePop' ,
199
+ 'UTF8ToString' ,
200
+ ] ;
201
+ for ( const dep of autoDeps ) {
202
+ if ( snippet . includes ( dep + '(' ) ) {
203
+ deps . push ( '$' + dep ) ;
204
+ }
205
+ }
206
+ }
207
+
208
+ function handleI64Signatures ( symbol , snippet , sig , i53abi ) {
209
+ // Handle i64 parameters and return values.
210
+ //
211
+ // When WASM_BIGINT is enabled these arrive as BigInt values which we
212
+ // convert to int53 JS numbers. If necessary, we also convert the return
213
+ // value back into a BigInt.
214
+ //
215
+ // When WASM_BIGINT is not enabled we receive i64 values as a pair of i32
216
+ // numbers which is converted to single int53 number. In necessary, we also
217
+ // split the return value into a pair of i32 numbers.
218
+ return modifyJSFunction ( snippet , ( args , body , async_ , oneliner ) => {
219
+ let argLines = args . split ( '\n' ) ;
220
+ argLines = argLines . map ( ( line ) => line . split ( '//' ) [ 0 ] ) ;
221
+ const argNames = argLines
222
+ . join ( ' ' )
223
+ . split ( ',' )
224
+ . map ( ( name ) => name . trim ( ) ) ;
225
+ const newArgs = [ ] ;
226
+ let argConversions = '' ;
227
+ if ( sig . length > argNames . length + 1 ) {
228
+ error ( `handleI64Signatures: signature too long for ${ symbol } ` ) ;
229
+ return snippet ;
230
+ }
231
+ for ( let i = 0 ; i < argNames . length ; i ++ ) {
232
+ const name = argNames [ i ] ;
233
+ // If sig is shorter than argNames list then argType will be undefined
234
+ // here, which will result in the default case below.
235
+ const argType = sig [ i + 1 ] ;
236
+ if ( WASM_BIGINT && ( ( MEMORY64 && argType == 'p' ) || ( i53abi && argType == 'j' ) ) ) {
237
+ argConversions += ` ${ receiveI64ParamAsI53 ( name , undefined , false ) } \n` ;
238
+ } else {
239
+ if ( argType == 'j' && i53abi ) {
240
+ argConversions += ` ${ receiveI64ParamAsI53 ( name , undefined , false ) } \n` ;
241
+ newArgs . push ( defineI64Param ( name ) ) ;
242
+ } else if ( argType == 'p' && CAN_ADDRESS_2GB ) {
243
+ argConversions += ` ${ name } >>>= 0;\n` ;
244
+ newArgs . push ( name ) ;
245
+ } else {
246
+ newArgs . push ( name ) ;
247
+ }
248
+ }
249
+ }
250
+
251
+ if ( ! WASM_BIGINT ) {
252
+ args = newArgs . join ( ',' ) ;
253
+ }
254
+
255
+ if ( ( sig [ 0 ] == 'j' && i53abi ) || ( sig [ 0 ] == 'p' && MEMORY64 ) ) {
256
+ const await_ = async_ ? 'await ' : '' ;
257
+ // For functions that where we need to mutate the return value, we
258
+ // also need to wrap the body in an inner function.
259
+ if ( oneliner ) {
260
+ if ( argConversions ) {
261
+ return `${ async_ } (${ args } ) => {
262
+ ${ argConversions }
263
+ return ${ makeReturn64 ( await_ + body ) } ;
264
+ }` ;
265
+ }
266
+ return `${ async_ } (${ args } ) => ${ makeReturn64 ( await_ + body ) } ;` ;
267
+ }
268
+ return `\
269
+ ${ async_ } function(${ args } ) {
270
+ ${ argConversions }
271
+ var ret = (() => { ${ body } })();
272
+ return ${ makeReturn64 ( await_ + 'ret' ) } ;
273
+ }` ;
274
+ }
275
+
276
+ // Otherwise no inner function is needed and we covert the arguments
277
+ // before executing the function body.
278
+ if ( oneliner ) {
279
+ body = `return ${ body } ` ;
280
+ }
281
+ return `\
282
+ ${ async_ } function(${ args } ) {
283
+ ${ argConversions }
284
+ ${ body } ;
285
+ }` ;
286
+ } ) ;
287
+ }
288
+
187
289
export async function runJSify ( outputFile , symbolsOnly ) {
188
290
const libraryItems = [ ] ;
189
291
const symbolDeps = { } ;
@@ -217,87 +319,6 @@ export async function runJSify(outputFile, symbolsOnly) {
217
319
}
218
320
}
219
321
220
- function handleI64Signatures ( symbol , snippet , sig , i53abi ) {
221
- // Handle i64 parameters and return values.
222
- //
223
- // When WASM_BIGINT is enabled these arrive as BigInt values which we
224
- // convert to int53 JS numbers. If necessary, we also convert the return
225
- // value back into a BigInt.
226
- //
227
- // When WASM_BIGINT is not enabled we receive i64 values as a pair of i32
228
- // numbers which is converted to single int53 number. In necessary, we also
229
- // split the return value into a pair of i32 numbers.
230
- return modifyJSFunction ( snippet , ( args , body , async_ , oneliner ) => {
231
- let argLines = args . split ( '\n' ) ;
232
- argLines = argLines . map ( ( line ) => line . split ( '//' ) [ 0 ] ) ;
233
- const argNames = argLines
234
- . join ( ' ' )
235
- . split ( ',' )
236
- . map ( ( name ) => name . trim ( ) ) ;
237
- const newArgs = [ ] ;
238
- let argConversions = '' ;
239
- if ( sig . length > argNames . length + 1 ) {
240
- error ( `handleI64Signatures: signature too long for ${ symbol } ` ) ;
241
- return snippet ;
242
- }
243
- for ( let i = 0 ; i < argNames . length ; i ++ ) {
244
- const name = argNames [ i ] ;
245
- // If sig is shorter than argNames list then argType will be undefined
246
- // here, which will result in the default case below.
247
- const argType = sig [ i + 1 ] ;
248
- if ( WASM_BIGINT && ( ( MEMORY64 && argType == 'p' ) || ( i53abi && argType == 'j' ) ) ) {
249
- argConversions += ` ${ receiveI64ParamAsI53 ( name , undefined , false ) } \n` ;
250
- } else {
251
- if ( argType == 'j' && i53abi ) {
252
- argConversions += ` ${ receiveI64ParamAsI53 ( name , undefined , false ) } \n` ;
253
- newArgs . push ( defineI64Param ( name ) ) ;
254
- } else if ( argType == 'p' && CAN_ADDRESS_2GB ) {
255
- argConversions += ` ${ name } >>>= 0;\n` ;
256
- newArgs . push ( name ) ;
257
- } else {
258
- newArgs . push ( name ) ;
259
- }
260
- }
261
- }
262
-
263
- if ( ! WASM_BIGINT ) {
264
- args = newArgs . join ( ',' ) ;
265
- }
266
-
267
- if ( ( sig [ 0 ] == 'j' && i53abi ) || ( sig [ 0 ] == 'p' && MEMORY64 ) ) {
268
- const await_ = async_ ? 'await ' : '' ;
269
- // For functions that where we need to mutate the return value, we
270
- // also need to wrap the body in an inner function.
271
- if ( oneliner ) {
272
- if ( argConversions ) {
273
- return `${ async_ } (${ args } ) => {
274
- ${ argConversions }
275
- return ${ makeReturn64 ( await_ + body ) } ;
276
- }` ;
277
- }
278
- return `${ async_ } (${ args } ) => ${ makeReturn64 ( await_ + body ) } ;` ;
279
- }
280
- return `\
281
- ${ async_ } function(${ args } ) {
282
- ${ argConversions }
283
- var ret = (() => { ${ body } })();
284
- return ${ makeReturn64 ( await_ + 'ret' ) } ;
285
- }` ;
286
- }
287
-
288
- // Otherwise no inner function is needed and we covert the arguments
289
- // before executing the function body.
290
- if ( oneliner ) {
291
- body = `return ${ body } ` ;
292
- }
293
- return `\
294
- ${ async_ } function(${ args } ) {
295
- ${ argConversions }
296
- ${ body } ;
297
- }` ;
298
- } ) ;
299
- }
300
-
301
322
function processLibraryFunction ( snippet , symbol , mangled , deps , isStub ) {
302
323
// It is possible that when printing the function as a string on Windows,
303
324
// the js interpreter we are in returns the string with Windows line endings
@@ -397,27 +418,6 @@ function(${args}) {
397
418
return snippet ;
398
419
}
399
420
400
- function addImplicitDeps ( snippet , deps ) {
401
- // There are some common dependencies that we inject automatically by
402
- // conservatively scanning the input functions for their usage.
403
- // Specifically, these are dependencies that are very common and would be
404
- // burdensome to add manually to all functions.
405
- // The first four are deps that are automatically/conditionally added
406
- // by the {{{ makeDynCall }}}, and {{{ runtimeKeepalivePush/Pop }}} macros.
407
- const autoDeps = [
408
- 'getDynCaller' ,
409
- 'getWasmTableEntry' ,
410
- 'runtimeKeepalivePush' ,
411
- 'runtimeKeepalivePop' ,
412
- 'UTF8ToString' ,
413
- ] ;
414
- for ( const dep of autoDeps ) {
415
- if ( snippet . includes ( dep + '(' ) ) {
416
- deps . push ( '$' + dep ) ;
417
- }
418
- }
419
- }
420
-
421
421
function symbolHandler ( symbol ) {
422
422
// In LLVM, exceptions generate a set of functions of form
423
423
// __cxa_find_matching_catch_1(), __cxa_find_matching_catch_2(), etc. where
0 commit comments