-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
repl: remove internal frames from runtime errors
When a user executes code in the REPLServer which generates an exception, there is no need to display the REPLServer internal stack frames. PR-URL: #15351 Reviewed-By: Prince John Wesley <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Refs: #9601
- Loading branch information
Showing
5 changed files
with
174 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
'use strict'; | ||
|
||
function a() { | ||
b(); | ||
} | ||
|
||
function b() { | ||
c(); | ||
} | ||
|
||
function c() { | ||
d(function() { throw new Error('Whoops!'); }); | ||
} | ||
|
||
function d(f) { | ||
f(); | ||
} | ||
|
||
a(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
const fixtures = require('../common/fixtures'); | ||
const assert = require('assert'); | ||
const repl = require('repl'); | ||
|
||
|
||
function run({ command, expected }) { | ||
let accum = ''; | ||
|
||
const inputStream = new common.ArrayStream(); | ||
const outputStream = new common.ArrayStream(); | ||
|
||
outputStream.write = (data) => accum += data.replace('\r', ''); | ||
|
||
const r = repl.start({ | ||
prompt: '', | ||
input: inputStream, | ||
output: outputStream, | ||
terminal: false, | ||
useColors: false | ||
}); | ||
|
||
r.write(`${command}\n`); | ||
assert.strictEqual(accum, expected); | ||
r.close(); | ||
} | ||
|
||
const origPrepareStackTrace = Error.prepareStackTrace; | ||
Error.prepareStackTrace = (err, stack) => { | ||
if (err instanceof SyntaxError) | ||
return err.toString(); | ||
stack.push(err); | ||
return stack.reverse().join('--->\n'); | ||
}; | ||
|
||
process.on('uncaughtException', (e) => { | ||
Error.prepareStackTrace = origPrepareStackTrace; | ||
throw e; | ||
}); | ||
|
||
process.on('exit', () => (Error.prepareStackTrace = origPrepareStackTrace)); | ||
|
||
const tests = [ | ||
{ | ||
// test .load for a file that throws | ||
command: `.load ${fixtures.path('repl-pretty-stack.js')}`, | ||
expected: 'Error: Whoops!--->\nrepl:9:24--->\nd (repl:12:3)--->\nc ' + | ||
'(repl:9:3)--->\nb (repl:6:3)--->\na (repl:3:3)\n' | ||
}, | ||
{ | ||
command: 'let x y;', | ||
expected: 'let x y;\n ^\n\nSyntaxError: Unexpected identifier\n' | ||
}, | ||
{ | ||
command: 'throw new Error(\'Whoops!\')', | ||
expected: 'Error: Whoops!\n' | ||
}, | ||
{ | ||
command: 'foo = bar;', | ||
expected: 'ReferenceError: bar is not defined\n' | ||
}, | ||
// test anonymous IIFE | ||
{ | ||
command: '(function() { throw new Error(\'Whoops!\'); })()', | ||
expected: 'Error: Whoops!--->\nrepl:1:21\n' | ||
} | ||
]; | ||
|
||
tests.forEach(run); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
const fixtures = require('../common/fixtures'); | ||
const assert = require('assert'); | ||
const repl = require('repl'); | ||
|
||
|
||
function run({ command, expected }) { | ||
let accum = ''; | ||
|
||
const inputStream = new common.ArrayStream(); | ||
const outputStream = new common.ArrayStream(); | ||
|
||
outputStream.write = (data) => accum += data.replace('\r', ''); | ||
|
||
const r = repl.start({ | ||
prompt: '', | ||
input: inputStream, | ||
output: outputStream, | ||
terminal: false, | ||
useColors: false | ||
}); | ||
|
||
r.write(`${command}\n`); | ||
assert.strictEqual(accum, expected); | ||
r.close(); | ||
} | ||
|
||
const tests = [ | ||
{ | ||
// test .load for a file that throws | ||
command: `.load ${fixtures.path('repl-pretty-stack.js')}`, | ||
expected: 'Error: Whoops!\n at repl:9:24\n at d (repl:12:3)\n ' + | ||
'at c (repl:9:3)\n at b (repl:6:3)\n at a (repl:3:3)\n' | ||
}, | ||
{ | ||
command: 'let x y;', | ||
expected: 'let x y;\n ^\n\nSyntaxError: Unexpected identifier\n\n' | ||
}, | ||
{ | ||
command: 'throw new Error(\'Whoops!\')', | ||
expected: 'Error: Whoops!\n' | ||
}, | ||
{ | ||
command: 'foo = bar;', | ||
expected: 'ReferenceError: bar is not defined\n' | ||
}, | ||
// test anonymous IIFE | ||
{ | ||
command: '(function() { throw new Error(\'Whoops!\'); })()', | ||
expected: 'Error: Whoops!\n at repl:1:21\n' | ||
} | ||
]; | ||
|
||
tests.forEach(run); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters