Skip to content

Commit 7196878

Browse files
authored
Improve JS library error reporting (#25089)
If there are errors in JS library code we now have an option to save the preprocessed output to a temp location. From there lookup the error message and corresponding line number. For example: ``` $ emcc ~/test//hello.c error: /usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js: failure to execute js library "/usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js": error: /usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js: use -sVERBOSE to see more details Internal compiler error JS compiler Please create a bug report at https://github.com/emscripten-core/emscripten/issues/ with a log of the build and the input files used to run. Exception message: "/usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.preprocessed.js:1087 ds = fd ^^^^^^^ SyntaxError: Invalid shorthand property initializer at new Script (node:vm:117:7) at createScript (node:vm:269:10) at Module.runInContext (node:vm:300:10) at runInMacroContext (file:///usr/local/google/home/sbc/dev/wasm/emscripten/src/utility.mjs:324:13) at Object.load (file:///usr/local/google/home/sbc/dev/wasm/emscripten/src/modules.mjs:291:9) at Module.runJSify (file:///usr/local/google/home/sbc/dev/wasm/emscripten/src/jsifier.mjs:354:18) at file:///usr/local/google/home/sbc/dev/wasm/emscripten/tools/compiler.mjs:97:17 ``` Building with -sVERBOSE then generates: ``` $ emcc ~/test//hello.c -sVERBOSE processing system library: /usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libint53.js processing system library: /usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js error: /usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js: failure to execute js library "/usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js": error: /usr/local/google/home/sbc/dev/wasm/emscripten/src/lib/libcore.js: See preprocessed source in /tmp/emcc-jscompiler-3XmDDr/libcore.js Internal compiler error JS compiler Please create a bug report at https://github.com/emscripten-core/emscripten/issues/ with a log of the build and the input files used to run. Exception message: "/tmp/emcc-jscompiler-3XmDDr/libcore.js:1087 ds = fd ^^^^^^^ SyntaxError: Invalid shorthand property initializer at new Script (node:vm:117:7) at createScript (node:vm:269:10) at Module.runInContext (node:vm:300:10) at runInMacroContext (file:///usr/local/google/home/sbc/dev/wasm/emscripten/src/utility.mjs:324:13) at Object.load (file:///usr/local/google/home/sbc/dev/wasm/emscripten/src/modules.mjs:291:9) at Module.runJSify (file:///usr/local/google/home/sbc/dev/wasm/emscripten/src/jsifier.mjs:354:18) at file:///usr/local/google/home/sbc/dev/wasm/emscripten/tools/compiler.mjs:97:17 ``` No you can open the file mentioned in the error message (/tmp/emcc-jscompiler-3XmDDr/libcore.js) and go to line 1087. Without this change the file referenced in the error message will always be non-existant, and we would instead dump the whole file (which could be huge) to stderr.
1 parent d1935cd commit 7196878

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

src/modules.mjs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* SPDX-License-Identifier: MIT
55
*/
66

7+
import * as os from 'node:os';
8+
import * as fs from 'node:fs';
79
import * as path from 'node:path';
810
import {fileURLToPath} from 'node:url';
911
import assert from 'node:assert';
@@ -213,6 +215,17 @@ function calculateLibraries() {
213215
return libraries;
214216
}
215217

218+
let tempDir;
219+
220+
function getTempDir() {
221+
if (!tempDir) {
222+
const tempRoot = os.tmpdir();
223+
tempDir = fs.mkdtempSync(path.join(tempRoot, 'emcc-jscompiler-'));
224+
}
225+
return tempDir;
226+
}
227+
228+
216229
export const LibraryManager = {
217230
library: {},
218231
// The JS and JS docs of each library definition indexed my mangled name.
@@ -269,22 +282,22 @@ export const LibraryManager = {
269282
this.library = userLibraryProxy;
270283
}
271284
pushCurrentFile(filename);
285+
let preprocessedName = filename.replace(/\.\w+$/, '.preprocessed$&')
286+
if (VERBOSE) {
287+
preprocessedName = path.join(getTempDir(), path.basename(filename));
288+
}
272289
try {
273290
processed = processMacros(preprocess(filename), filename);
274-
runInMacroContext(processed, {filename: filename.replace(/\.\w+$/, '.preprocessed$&')});
291+
runInMacroContext(processed, {filename: preprocessedName})
275292
} catch (e) {
276-
error(`failure to execute js library "${filename}":`);
277-
if (VERBOSE) {
278-
const orig = readFile(filename);
279-
if (processed) {
280-
error(
281-
`preprocessed source (you can run a js engine on this to get a clearer error message sometimes):\n=============\n${processed}\n=============`,
282-
);
293+
error(`failure to execute JS library "${filename}":`);
294+
if (processed) {
295+
if (VERBOSE) {
296+
fs.writeFileSync(preprocessedName, processed);
297+
error(`preprocessed JS saved to ${preprocessedName}`)
283298
} else {
284-
error(`original source:\n=============\n${orig}\n=============`);
299+
error('use -sVERBOSE to save preprocessed JS');
285300
}
286-
} else {
287-
error('use -sVERBOSE to see more details');
288301
}
289302
throw e;
290303
} finally {
@@ -293,6 +306,9 @@ export const LibraryManager = {
293306
this.library = origLibrary;
294307
}
295308
}
309+
if (VERBOSE) {
310+
fs.rmSync(getTempDir(), { recursive: true, force: true });
311+
}
296312
}
297313
},
298314
};

0 commit comments

Comments
 (0)