@@ -2385,6 +2385,15 @@ def modularize():
23852385 if settings .EXPORT_ES6 and settings .ENVIRONMENT_MAY_BE_NODE :
23862386 async_emit = 'async '
23872387
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+
23882397 if settings .MODULARIZE == 'instance' :
23892398 wrapper_function = '''
23902399export default async function init(moduleArg = {}) {
@@ -2398,8 +2407,8 @@ def modularize():
23982407 'generated_js' : generated_js
23992408 }
24002409 else :
2401- wrapper_function = '''
2402- %(maybe_async)sfunction(moduleArg = {}) {
2410+ wrapper_function = '''\
2411+ %(maybe_async)sfunction %(wrapper_name)s (moduleArg = {}) {
24032412 var moduleRtn;
24042413
24052414%(generated_js)s
@@ -2408,26 +2417,18 @@ def modularize():
24082417}
24092418''' % {
24102419 'maybe_async' : async_emit ,
2411- 'generated_js' : generated_js
2420+ 'generated_js' : generated_js ,
2421+ 'wrapper_name' : wrapper_name
24122422 }
24132423
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 :
24192425 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;"
24312432 if settings .MODULARIZE == 'instance' :
24322433 src = '''\
24332434 var _scriptName = %(script_url)s;
@@ -2443,14 +2444,33 @@ def modularize():
24432444 var %(EXPORT_NAME)s = (() => {
24442445 var _scriptName = %(script_url)s;
24452446 %(script_url_node)s
2446- return ( %(wrapper_function)s);
2447+ return %(wrapper_function)s
24472448})();
24482449''' % {
24492450 'EXPORT_NAME' : settings .EXPORT_NAME ,
24502451 'script_url' : script_url ,
24512452 'script_url_node' : script_url_node ,
24522453 'wrapper_function' : wrapper_function ,
24532454 }
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 } ;'
24542474
24552475 # Given the async nature of how the Module function and Module object
24562476 # come into existence in AudioWorkletGlobalScope, store the Module
0 commit comments