-
Notifications
You must be signed in to change notification settings - Fork 29.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
node_contextify: do not incept debug context
Currently a debug context is created for various calls to util. If the node debugger is being run the main context is the debug context. In this case node_contextify was freeing the debug context and causing everything to explode. This change moves around the logic and no longer frees the context. There is a concern about the dangling pointer The regression test was adapted from code submitted by @3y3 in #4815 Fixes: #4440 Fixes: #4815 Fixes: #4597 Fixes: #4952 PR-URL: #4815 Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Rich Trott <[email protected]>
- Loading branch information
Showing
3 changed files
with
83 additions
and
21 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,4 @@ | ||
'use strict'; | ||
const util = require('util'); | ||
const payload = util.inspect({a: 'b'}); | ||
console.log(payload); |
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,69 @@ | ||
'use strict'; | ||
const path = require('path'); | ||
const spawn = require('child_process').spawn; | ||
const assert = require('assert'); | ||
|
||
const common = require('../common'); | ||
|
||
const fixture = path.join( | ||
common.fixturesDir, | ||
'debugger-util-regression-fixture.js' | ||
); | ||
|
||
const args = [ | ||
'debug', | ||
fixture | ||
]; | ||
|
||
const proc = spawn(process.execPath, args, { stdio: 'pipe' }); | ||
proc.stdout.setEncoding('utf8'); | ||
proc.stderr.setEncoding('utf8'); | ||
|
||
function fail() { | ||
common.fail('the program should not hang'); | ||
} | ||
|
||
const timer = setTimeout(fail, common.platformTimeout(4000)); | ||
|
||
let stdout = ''; | ||
let stderr = ''; | ||
|
||
let nextCount = 0; | ||
|
||
proc.stdout.on('data', (data) => { | ||
stdout += data; | ||
if (stdout.includes('> 1') && nextCount < 1 || | ||
stdout.includes('> 2') && nextCount < 2 || | ||
stdout.includes('> 3') && nextCount < 3 || | ||
stdout.includes('> 4') && nextCount < 4) { | ||
nextCount++; | ||
proc.stdin.write('n\n'); | ||
} | ||
else if (stdout.includes('{ a: \'b\' }')) { | ||
clearTimeout(timer); | ||
proc.stdin.write('.exit\n'); | ||
} | ||
else if (stdout.includes('program terminated')) { | ||
// Catch edge case present in v4.x | ||
// process will terminate after call to util.inspect | ||
common.fail('the program should not terminate'); | ||
} | ||
}); | ||
|
||
proc.stderr.on('data', (data) => stderr += data); | ||
|
||
// FIXME | ||
// This test has been periodically failing on certain systems due to | ||
// uncaught errors on proc.stdin. This will stop the process from | ||
// exploding but is still not an elegant solution. Likely a deeper bug | ||
// causing this problem. | ||
proc.stdin.on('error', (err) => { | ||
console.error(err); | ||
}); | ||
|
||
process.on('exit', (code) => { | ||
assert.equal(code, 0, 'the program should exit cleanly'); | ||
assert.equal(stdout.includes('{ a: \'b\' }'), true, | ||
'the debugger should print the result of util.inspect'); | ||
assert.equal(stderr, '', 'stderr should be empty'); | ||
}); |