Merge pull request #9878 from atom/ns-mb-fix-prepare-stack-trace-recursion

Avoid infinite recursion in Error.prepareStackTrace
This commit is contained in:
Nathan Sobo
2015-11-30 12:32:06 -08:00
2 changed files with 28 additions and 3 deletions

View File

@@ -81,6 +81,27 @@ describe 'CompileCache', ->
waits(1)
runs ->
error = new Error("Oops again")
console.log error.stack
expect(error.stack).toContain('compile-cache-spec.coffee')
expect(Array.isArray(error.getRawStack())).toBe true
it 'does not infinitely loop when the original prepareStackTrace value is reassigned', ->
originalPrepareStackTrace = Error.prepareStackTrace
Error.prepareStackTrace = -> 'a-stack-trace'
Error.prepareStackTrace = originalPrepareStackTrace
error = new Error('Oops')
expect(error.stack).toContain('compile-cache-spec.coffee')
expect(Array.isArray(error.getRawStack())).toBe true
it 'does not infinitely loop when the assigned prepareStackTrace calls the original prepareStackTrace', ->
originalPrepareStackTrace = Error.prepareStackTrace
Error.prepareStackTrace = (error, stack) ->
error.foo = 'bar'
originalPrepareStackTrace(error, stack)
error = new Error('Oops')
expect(error.stack).toContain('compile-cache-spec.coffee')
expect(error.foo).toBe('bar')
expect(Array.isArray(error.getRawStack())).toBe true

View File

@@ -163,8 +163,12 @@ var prepareStackTraceWithSourceMapping = Error.prepareStackTrace
let prepareStackTrace = prepareStackTraceWithSourceMapping
function prepareStackTraceWithRawStackAssignment (error, frames) {
error.rawStack = frames
return prepareStackTrace(error, frames)
if (error.rawStack) { // avoid infinite recursion
return prepareStackTraceWithSourceMapping(error, frames)
} else {
error.rawStack = frames
return prepareStackTrace(error, frames)
}
}
Object.defineProperty(Error, 'prepareStackTrace', {