@@ -2385,6 +2385,16 @@ def modularize():
23852385 if settings .EXPORT_ES6 and settings .ENVIRONMENT_MAY_BE_NODE :
23862386 async_emit = 'async '
23872387
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+
23882398 if settings .MODULARIZE == 'instance' :
23892399 wrapper_function = '''
23902400export default async function init(moduleArg = {}) {
@@ -2398,8 +2408,8 @@ def modularize():
23982408 'generated_js' : generated_js
23992409 }
24002410 else :
2401- wrapper_function = '''
2402- %(maybe_async)sfunction(moduleArg = {}) {
2411+ wrapper_function = '''\
2412+ %(maybe_async)sfunction %(wrapper_name)s (moduleArg = {}) {
24032413 var moduleRtn;
24042414
24052415%(generated_js)s
@@ -2408,14 +2418,11 @@ def modularize():
24082418}
24092419''' % {
24102420 'maybe_async' : async_emit ,
2411- 'generated_js' : generated_js
2421+ 'generated_js' : generated_js ,
2422+ 'wrapper_name' : wrapper_name
24122423 }
24132424
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 :
24192426 script_url_node = ''
24202427 # When MODULARIZE this JS may be executed later,
24212428 # after document.currentScript is gone, so we save it.
@@ -2438,19 +2445,59 @@ def modularize():
24382445 'script_url_node' : script_url_node ,
24392446 'wrapper_function' : wrapper_function ,
24402447 }
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+ }
24412468 else :
24422469 src = '''\
24432470 var %(EXPORT_NAME)s = (() => {
24442471 var _scriptName = %(script_url)s;
24452472 %(script_url_node)s
2446- return ( %(wrapper_function)s) ;
2473+ return %(wrapper_function)s;
24472474})();
24482475''' % {
24492476 'EXPORT_NAME' : settings .EXPORT_NAME ,
24502477 'script_url' : script_url ,
24512478 'script_url_node' : script_url_node ,
24522479 'wrapper_function' : wrapper_function ,
2480+ 'wrapper_name' : wrapper_name ,
24532481 }
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 } ;'
24542501
24552502 # Given the async nature of how the Module function and Module object
24562503 # come into existence in AudioWorkletGlobalScope, store the Module
0 commit comments