Skip to content

Commit 0ee6b6f

Browse files
committed
Avoid creating wrapper thunks or wasm exports
In debug builds nothing really changes here since we exported functions still get statically assigned to debug wrappers/thunks. However, after this change, in release builds, if you attempt to access `_foo` (internally) or `Module['_foo']` externally before the module is loaded you will now get `undefined`. Since it was always the case that calling these function would crash anyway, the only effected folks would be folks that take the reference early and then call later. e.g. ``` var myfunc = Module['_foo']; // Run before module is loaded // wait until loaded myfunc(); // This will no longer work. ``` Fixes: #23339
1 parent 8e660ed commit 0ee6b6f

File tree

84 files changed

+146
-121
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+146
-121
lines changed

src/postamble_minimal.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,10 @@ WebAssembly.instantiate(Module['wasm'], imports).then((output) => {
180180
wasmOffsetConverter = new WasmOffsetConverter(Module['wasm'], output.module);
181181
#endif
182182

183-
#if !DECLARE_ASM_MODULE_EXPORTS
184-
exportWasmSymbols(wasmExports);
185-
#else
183+
#if DECLARE_ASM_MODULE_EXPORTS
186184
assignWasmExports(wasmExports);
185+
#else
186+
exportWasmSymbols(wasmExports);
187187
#endif
188188
#if '$wasmTable' in addedLibraryItems
189189
wasmTable = wasmExports['__indirect_function_table'];

src/preamble.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,9 @@ function getWasmImports() {
966966
instrumentWasmTableWithAbort();
967967
#endif
968968

969-
#if !DECLARE_ASM_MODULE_EXPORTS
969+
#if DECLARE_ASM_MODULE_EXPORTS
970+
assignWasmExports(wasmExports);
971+
#else
970972
// If we didn't declare the asm exports as top level enties this function
971973
// is in charge of programmatically exporting them on the global object.
972974
exportWasmSymbols(wasmExports);
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8343
1+
8337
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20273
1+
20247
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8327
1+
8321
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20241
1+
20215
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9343
1+
9316
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24041
1+
23938
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8294
1+
8286
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20166
1+
20136
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8294
1+
8286
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20166
1+
20136
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8357
1+
8348
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20348
1+
20312
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9349
1+
9320
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24041
1+
23938
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8343
1+
8337
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20273
1+
20247
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3564
1+
3558
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7676
1+
7650
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7647
1+
7639
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18820
1+
18794
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2804
1+
2797
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5984
1+
5958
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7883
1+
7881
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20983
1+
20969
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2658
1+
2649
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6837
1+
6808
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2320
1+
2314
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4778
1+
4752
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2278
1+
2271
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4720
1+
4694
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2278
1+
2271
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4720
1+
4694
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2278
1+
2271
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4720
1+
4694
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5992
1+
5973
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
13241
1+
13167
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2278
1+
2271
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4720
1+
4694
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1874
1+
1865
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3996
1+
3970
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1912
1+
1906
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4044
1+
4022
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2326
1+
2319
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4888
1+
4858
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2474
1+
2466
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5172
1+
5142
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2175
1+
2170
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4581
1+
4563
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2141
1+
2136
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4513
1+
4495
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1898
1+
1890
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4043
1+
4005
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1912
1+
1906
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4044
1+
4022
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1912
1+
1906
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4044
1+
4022
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1441
1+
1431
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3058
1+
3041
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6449
1+
6446
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
17094
1+
17089
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1534
1+
1524
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3702
1+
3681
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1380
1+
1371
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2806
1+
2789
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1347
1+
1337
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2756
1+
2739
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1347
1+
1337
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2756
1+
2739
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1338
1+
1329
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2741
1+
2724
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1347
1+
1337
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2756
1+
2739
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1542
1+
1536
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3210
1+
3193
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4186
1+
4140
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8728
1+
8514
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1347
1+
1337
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2756
1+
2739
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
52739
1+
52879
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
28487
1+
28607
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
51522
1+
51662

tools/emscripten.py

+59-36
Original file line numberDiff line numberDiff line change
@@ -886,9 +886,14 @@ def can_use_await():
886886
def make_export_wrappers(function_exports):
887887
assert not settings.MINIMAL_RUNTIME
888888

889-
wrappers = []
889+
# When exports are only available asyncronously we generate an extran assignWasmExports
890+
# function. When they are syncronously available we inline the assignment along
891+
# with the declaration.
892+
async_exports = (settings.WASM_ASYNC_COMPILATION and not can_use_await()) or settings.PTHREADS
890893

891-
def install_wrapper(sym):
894+
def install_debug_wrapper(sym):
895+
if not settings.ASSERTIONS:
896+
return False
892897
# The emscripten stack functions are called very early (by writeStackCookie) before
893898
# the runtime is initialized so we can't create these wrappers that check for
894899
# runtimeInitialized.
@@ -901,38 +906,58 @@ def install_wrapper(sym):
901906
# TODO: Look into removing these, and improving our robustness around thread termination.
902907
return sym not in {'__trap', 'pthread_self', '_emscripten_proxy_execute_task_queue'}
903908

904-
for name, types in function_exports.items():
905-
nargs = len(types.params)
906-
mangled = asmjs_mangle(name)
907-
wrapper = 'var %s = ' % mangled
908-
909-
# TODO(sbc): Can we avoid exporting the dynCall_ functions on the module.
909+
def outside_export(mangled):
910910
should_export = settings.EXPORT_KEEPALIVE and mangled in settings.EXPORTED_FUNCTIONS
911+
# TODO(sbc): Can we avoid exporting the dynCall_ functions on the module.
911912
if (name.startswith('dynCall_') and settings.MODULARIZE != 'instance') or should_export:
912913
if settings.MODULARIZE == 'instance':
913914
# Update the export declared at the top level.
914-
wrapper += f" __exp_{mangled} = "
915+
return f" __exp_{mangled}"
915916
else:
916-
exported = "Module['%s'] = " % mangled
917-
else:
918-
exported = ''
919-
wrapper += exported
920-
921-
if settings.ASSERTIONS and install_wrapper(name):
922-
# With assertions enabled we create a wrapper that are calls get routed through, for
923-
# the lifetime of the program.
924-
wrapper += f"createExportWrapper('{name}', {nargs});"
925-
elif (settings.WASM_ASYNC_COMPILATION and not can_use_await()) or settings.PTHREADS:
926-
# With WASM_ASYNC_COMPILATION wrapper will replace the global var and Module var on
927-
# first use.
928-
args = [f'a{i}' for i in range(nargs)]
929-
args = ', '.join(args)
930-
wrapper += f"({args}) => ({mangled} = {exported}wasmExports['{name}'])({args});"
931-
else:
932-
wrapper += f"wasmExports['{name}']"
917+
return "Module['%s']" % mangled
933918

934-
wrappers.append(wrapper)
935-
return wrappers
919+
rtn = []
920+
rtn.append('function assignWasmExports(wasmExports) {')
921+
for name, types in function_exports.items():
922+
# If a debug wrapper was used then we don't need to update anything, we want to
923+
# always use the wrapper, and never the direct export.
924+
if install_debug_wrapper(name):
925+
continue
926+
mangled = asmjs_mangle(name)
927+
wrapper = f' {mangled} = '
928+
additional_export = outside_export(mangled)
929+
if additional_export:
930+
wrapper += additional_export + ' = '
931+
wrapper += f"wasmExports['{name}'];"
932+
rtn.append(wrapper)
933+
934+
rtn.append('}')
935+
936+
rtn.append('')
937+
rtn.append('// Exported wasm functions.')
938+
if async_exports:
939+
rtn.append('// These are declared here but will be remain undefined until async wasm instanatiation is complete.')
940+
941+
if settings.ASSERTIONS:
942+
for name, types in function_exports.items():
943+
mangled = asmjs_mangle(name)
944+
if install_debug_wrapper(name):
945+
# With assertions enabled we create a wrapper that are calls get routed through, for
946+
# the lifetime of the program.
947+
nargs = len(types.params)
948+
additional_export = outside_export(mangled)
949+
if additional_export:
950+
rtn.append(f"var {mangled} = {additional_export} = createExportWrapper('{name}', {nargs});")
951+
else:
952+
rtn.append(f"var {mangled} = createExportWrapper('{name}', {nargs});")
953+
else:
954+
rtn.append(f'var {mangled};')
955+
else:
956+
mangled = [asmjs_mangle(name) for name in function_exports]
957+
sep = ',\n '
958+
rtn.append(f'var {sep.join(mangled)};')
959+
960+
return rtn
936961

937962

938963
def create_receiving(function_exports):
@@ -986,17 +1011,15 @@ def create_module(receiving, metadata, global_exports, library_symbols):
9861011
else:
9871012
module.append('var wasmImports = %s;\n' % sending)
9881013

1014+
module.append(receiving)
1015+
9891016
if not settings.MINIMAL_RUNTIME:
990-
if settings.WASM_ASYNC_COMPILATION:
991-
if can_use_await():
992-
# In modularize mode the generated code is within a factory function.
993-
module.append("var wasmExports = await createWasm();\n")
994-
else:
995-
module.append("var wasmExports;\ncreateWasm();\n")
1017+
if settings.WASM_ASYNC_COMPILATION and can_use_await():
1018+
# In modularize mode the generated code is within a factory function.
1019+
module.append("var wasmExports = await createWasm();\n")
9961020
else:
997-
module.append("var wasmExports = createWasm();\n")
1021+
module.append("var wasmExports;\ncreateWasm();\n")
9981022

999-
module.append(receiving)
10001023
if settings.SUPPORT_LONGJMP == 'emscripten' or not settings.DISABLE_EXCEPTION_CATCHING:
10011024
module.append(create_invoke_wrappers(metadata))
10021025
else:

0 commit comments

Comments
 (0)