@@ -2385,6 +2385,15 @@ def modularize():
2385
2385
if settings .EXPORT_ES6 and settings .ENVIRONMENT_MAY_BE_NODE :
2386
2386
async_emit = 'async '
2387
2387
2388
+ # Both pthreads and wasm workers rely on _scriptName in the absence of `import.meta`
2389
+ add_script_name_wrapper = settings .SHARED_MEMORY and not (settings .EXPORT_ES6 and settings .USE_ES6_IMPORT_META )
2390
+ add_assertion_wrapper = settings .ASSERTIONS and not settings .MODULARIZE == 'instance'
2391
+
2392
+ if add_script_name_wrapper or add_assertion_wrapper :
2393
+ wrapper_name = settings .EXPORT_NAME + '_inner' ;
2394
+ else :
2395
+ wrapper_name = settings .EXPORT_NAME ;
2396
+
2388
2397
if settings .MODULARIZE == 'instance' :
2389
2398
wrapper_function = '''
2390
2399
export default async function init(moduleArg = {}) {
@@ -2398,8 +2407,8 @@ def modularize():
2398
2407
'generated_js' : generated_js
2399
2408
}
2400
2409
else :
2401
- wrapper_function = '''
2402
- %(maybe_async)sfunction(moduleArg = {}) {
2410
+ wrapper_function = '''\
2411
+ %(maybe_async)sfunction %(wrapper_name)s (moduleArg = {}) {
2403
2412
var moduleRtn;
2404
2413
2405
2414
%(generated_js)s
@@ -2408,26 +2417,18 @@ def modularize():
2408
2417
}
2409
2418
''' % {
2410
2419
'maybe_async' : async_emit ,
2411
- 'generated_js' : generated_js
2420
+ 'generated_js' : generated_js ,
2421
+ 'wrapper_name' : wrapper_name
2412
2422
}
2413
2423
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 :
2424
+ if add_script_name_wrapper :
2419
2425
script_url_node = ''
2420
- # When MODULARIZE this JS may be executed later,
2421
- # after document.currentScript is gone, so we save it.
2422
- # In EXPORT_ES6 + PTHREADS the 'thread' is actually an ES6 module
2423
- # webworker running in strict mode, so doesn't have access to 'document'.
2424
- # In this case use 'import.meta' instead.
2425
- if settings .EXPORT_ES6 and settings .USE_ES6_IMPORT_META :
2426
- script_url = 'import.meta.url'
2427
- else :
2428
- script_url = "typeof document != 'undefined' ? document.currentScript?.src : undefined"
2429
- if settings .ENVIRONMENT_MAY_BE_NODE :
2430
- script_url_node = "if (typeof __filename != 'undefined') _scriptName = _scriptName || __filename;"
2426
+ # When MODULARIZE this JS may be executed later, after
2427
+ # document.currentScript is gone, so we save it. This is only
2428
+ # needed if the program actually requires `_scriptName`
2429
+ script_url = "typeof document != 'undefined' ? document.currentScript?.src : undefined"
2430
+ if settings .ENVIRONMENT_MAY_BE_NODE :
2431
+ script_url_node = "if (typeof __filename != 'undefined') _scriptName = _scriptName || __filename;"
2431
2432
if settings .MODULARIZE == 'instance' :
2432
2433
src = '''\
2433
2434
var _scriptName = %(script_url)s;
@@ -2443,14 +2444,33 @@ def modularize():
2443
2444
var %(EXPORT_NAME)s = (() => {
2444
2445
var _scriptName = %(script_url)s;
2445
2446
%(script_url_node)s
2446
- return ( %(wrapper_function)s);
2447
+ return %(wrapper_function)s
2447
2448
})();
2448
2449
''' % {
2449
2450
'EXPORT_NAME' : settings .EXPORT_NAME ,
2450
2451
'script_url' : script_url ,
2451
2452
'script_url_node' : script_url_node ,
2452
2453
'wrapper_function' : wrapper_function ,
2453
2454
}
2455
+ elif add_assertion_wrapper :
2456
+ src = '''\
2457
+ var %(EXPORT_NAME)s = (() => {
2458
+ %(wrapper_function)s
2459
+ // Return a small, never-async wrapper around %(wrapper_name)s which
2460
+ // checks for callers using `new`.
2461
+ return function(arg) {
2462
+ if (new.target) throw new Error("%(EXPORT_NAME)s() must not be called with new");
2463
+ return %(wrapper_name)s(arg);
2464
+ }
2465
+ })();
2466
+ ''' % {
2467
+ 'EXPORT_NAME' : settings .EXPORT_NAME ,
2468
+ 'wrapper_function' : wrapper_function ,
2469
+ 'wrapper_name' : wrapper_name ,
2470
+ }
2471
+ else :
2472
+ # No wrapper required. A simple export declaration is enough.
2473
+ src = f'/** @nocollapse */ { wrapper_function } ;'
2454
2474
2455
2475
# Given the async nature of how the Module function and Module object
2456
2476
# come into existence in AudioWorkletGlobalScope, store the Module
0 commit comments