$ em++ -Wall main.cpp -o main.js
emscripten:ERROR: emscript: failure to parse metadata output from wasm-emscripten-finalize. raw output is:
{
"staticBump": 536,
"tableSize": 2,
"initializers": [
"__wasm_call_ctors"
],
"declares": [
"getTempRet0",
"__invoke_void_%"class.foo::Bar"*",
"emscripten_longjmp",
"setTempRet0",
"emscripten_resize_heap",
"emscripten_memcpy_big"
],
"externs": [
],
"exports": [
"__wasm_call_ctors",
"malloc",
"saveSetjmp",
"testSetjmp",
"free",
"main",
"__errno_location",
"fflush",
"stackSave",
"stackRestore",
"stackAlloc",
"realloc",
"setThrew"
],
"namedGlobals": {
"__data_end" : "1560"
},
"invokeFuncs": [
],
"mainReadsParams": 1,
"features": [
]
}
Traceback (most recent call last):
File "/usr/local/Cellar/emscripten/2.0.7/libexec/em++.py", line 14, in <module>
sys.exit(emcc.run(sys.argv))
File "/usr/local/Cellar/emscripten/2.0.7/libexec/emcc.py", line 2182, in run
emscripten.run(tmp_wasm, final_js, memfile)
File "/usr/local/Cellar/emscripten/2.0.7/libexec/emscripten.py", line 964, in run
return temp_files.run_and_clean(lambda: emscript(
File "/usr/local/Cellar/emscripten/2.0.7/libexec/tools/tempfiles.py", line 105, in run_and_clean
return func()
File "/usr/local/Cellar/emscripten/2.0.7/libexec/emscripten.py", line 964, in <lambda>
return temp_files.run_and_clean(lambda: emscript(
File "/usr/local/Cellar/emscripten/2.0.7/libexec/emscripten.py", line 387, in emscript
metadata = finalize_wasm(infile, memfile, DEBUG)
File "/usr/local/Cellar/emscripten/2.0.7/libexec/emscripten.py", line 566, in finalize_wasm
return load_metadata_wasm(stdout, DEBUG)
File "/usr/local/Cellar/emscripten/2.0.7/libexec/emscripten.py", line 869, in load_metadata_wasm
metadata_json = json.loads(metadata_raw)
File "/usr/local/Cellar/python@3.8/3.8.6/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python@3.8/3.8.6/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python@3.8/3.8.6/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 9 column 22 (char 146)
I'm tracking down a strange Emscripten error on a large project. Here's a minimal reproducible example:
The error (full text collapsed):
Full error
A symbol named
__invoke_void_%"class.foo::Bar"*is created, which is then dumped into JSON without any escaping.Indeed, after setting
EMCC_DEBUG=1and inspecting the generated object file, the oddly named symbol is present:I'm not sure if the bug is just (1)
wasm-emscripten-finalizeneeds to escape symbols properly, or also (2) the symbol name is wrong. Certainly a symbol name with a double quote in it feels extremely wrong, but I'm not sure if it actually is.Environment: