@@ -2385,6 +2385,16 @@ def modularize():
2385
2385
if settings .EXPORT_ES6 and settings .ENVIRONMENT_MAY_BE_NODE :
2386
2386
async_emit = 'async '
2387
2387
2388
+ # TODO(sbc): Do we really need _scriptName in all cases. Look into reducing this
2389
+ # condition.
2390
+ add_script_name_wrapper = not settings .MINIMAL_RUNTIME or settings .SHARED_MEMORY
2391
+ add_assertion_wrapper = settings .ASSERTIONS and not settings .MODULARIZE == 'instance'
2392
+
2393
+ if add_script_name_wrapper or add_assertion_wrapper :
2394
+ wrapper_name = settings .EXPORT_NAME + '_inner'
2395
+ else :
2396
+ wrapper_name = settings .EXPORT_NAME
2397
+
2388
2398
if settings .MODULARIZE == 'instance' :
2389
2399
wrapper_function = '''
2390
2400
export default async function init(moduleArg = {}) {
@@ -2398,8 +2408,8 @@ def modularize():
2398
2408
'generated_js' : generated_js
2399
2409
}
2400
2410
else :
2401
- wrapper_function = '''
2402
- %(maybe_async)sfunction(moduleArg = {}) {
2411
+ wrapper_function = '''\
2412
+ %(maybe_async)sfunction %(wrapper_name)s (moduleArg = {}) {
2403
2413
var moduleRtn;
2404
2414
2405
2415
%(generated_js)s
@@ -2408,14 +2418,11 @@ def modularize():
2408
2418
}
2409
2419
''' % {
2410
2420
'maybe_async' : async_emit ,
2411
- 'generated_js' : generated_js
2421
+ 'generated_js' : generated_js ,
2422
+ 'wrapper_name' : wrapper_name
2412
2423
}
2413
2424
2414
- if settings .MINIMAL_RUNTIME and not settings .PTHREADS :
2415
- # Single threaded MINIMAL_RUNTIME programs do not need access to
2416
- # document.currentScript, so a simple export declaration is enough.
2417
- src = f'/** @nocollapse */ var { settings .EXPORT_NAME } = { wrapper_function } ;'
2418
- else :
2425
+ if add_script_name_wrapper :
2419
2426
script_url_node = ''
2420
2427
# When MODULARIZE this JS may be executed later,
2421
2428
# after document.currentScript is gone, so we save it.
@@ -2438,19 +2445,59 @@ def modularize():
2438
2445
'script_url_node' : script_url_node ,
2439
2446
'wrapper_function' : wrapper_function ,
2440
2447
}
2448
+ elif add_assertion_wrapper :
2449
+ src = '''\
2450
+ var %(EXPORT_NAME)s = (() => {
2451
+ var _scriptName = %(script_url)s;
2452
+ %(script_url_node)s
2453
+ %(wrapper_function)s;
2454
+ // Return a small, never-async wrapper around %(wrapper_name)s which
2455
+ // checks for callers incorrectly using it with `new`.
2456
+ return function(arg) {
2457
+ if (new.target) throw new Error("%(EXPORT_NAME)s() should not be called with `new %(EXPORT_NAME)s()`");
2458
+ return %(wrapper_name)s(arg);
2459
+ }
2460
+ })();
2461
+ ''' % {
2462
+ 'EXPORT_NAME' : settings .EXPORT_NAME ,
2463
+ 'script_url' : script_url ,
2464
+ 'script_url_node' : script_url_node ,
2465
+ 'wrapper_function' : wrapper_function ,
2466
+ 'wrapper_name' : wrapper_name ,
2467
+ }
2441
2468
else :
2442
2469
src = '''\
2443
2470
var %(EXPORT_NAME)s = (() => {
2444
2471
var _scriptName = %(script_url)s;
2445
2472
%(script_url_node)s
2446
- return ( %(wrapper_function)s) ;
2473
+ return %(wrapper_function)s;
2447
2474
})();
2448
2475
''' % {
2449
2476
'EXPORT_NAME' : settings .EXPORT_NAME ,
2450
2477
'script_url' : script_url ,
2451
2478
'script_url_node' : script_url_node ,
2452
2479
'wrapper_function' : wrapper_function ,
2480
+ 'wrapper_name' : wrapper_name ,
2453
2481
}
2482
+ elif add_assertion_wrapper :
2483
+ src = '''\
2484
+ var %(EXPORT_NAME)s = (() => {
2485
+ %(wrapper_function)s;
2486
+ // Return a small, never-async wrapper around %(wrapper_name)s which
2487
+ // checks for callers incorrectly using it with `new`.
2488
+ return function(arg) {
2489
+ if (new.target) throw new Error("%(EXPORT_NAME)s() should not be called with `new %(EXPORT_NAME)s()`");
2490
+ return %(wrapper_name)s(arg);
2491
+ }
2492
+ })();
2493
+ ''' % {
2494
+ 'EXPORT_NAME' : settings .EXPORT_NAME ,
2495
+ 'wrapper_function' : wrapper_function ,
2496
+ 'wrapper_name' : wrapper_name ,
2497
+ }
2498
+ else :
2499
+ # No wrapper required. A simple export declaration is enough.
2500
+ src = f'/** @nocollapse */ { wrapper_function } ;'
2454
2501
2455
2502
# Given the async nature of how the Module function and Module object
2456
2503
# come into existence in AudioWorkletGlobalScope, store the Module
0 commit comments