@@ -265,23 +265,19 @@ function log (message, site) {
265265 */
266266
267267function callSiteLocation ( callSite ) {
268- var site
269- if ( callSite ) {
270- var file = callSite . getFileName ( ) || '<anonymous>'
271- var line = callSite . getLineNumber ( )
272- var colm = callSite . getColumnNumber ( )
273- if ( callSite . isEval ( ) ) {
274- file = callSite . getEvalOrigin ( ) + ', ' + file
275- }
276- site = [ file , line , colm ]
277- site . callSite = callSite
278- site . name = callSite . getFunctionName ( )
279- } else {
280- site = [ '<unknown file>' , '<unknown line>' , '<unknown column>' ]
281- site . callSite = { }
282- site . callSite . getThis = function ( ) { return null }
283- site . name = '<unknown function>'
268+ var file = callSite . getFileName ( ) || '<anonymous>'
269+ var line = callSite . getLineNumber ( )
270+ var colm = callSite . getColumnNumber ( )
271+
272+ if ( callSite . isEval ( ) ) {
273+ file = callSite . getEvalOrigin ( ) + ', ' + file
284274 }
275+
276+ var site = [ file , line , colm ]
277+
278+ site . callSite = callSite
279+ site . name = callSite . getFunctionName ( )
280+
285281 return site
286282}
287283
@@ -393,21 +389,68 @@ function getStack () {
393389 // capture the stack
394390 Error . captureStackTrace ( obj )
395391
396- if ( typeof obj . stack === 'string' || obj . stack instanceof String ) {
392+ var stack = obj . stack
393+ if ( typeof stack === 'string' || stack instanceof String ) {
397394 // Means that prepareObjectStackTrace failed, obj.stack is not a CallSite array.
398- // We fallback to returning an empty array.
399- return [ ]
395+ // We fallback to returning an array of custom-made CallSite objects:
396+ stack = stack . split ( '\n' ) . slice ( 1 ) . map ( makeCallSite )
400397 }
401398
402399 // slice this function off the top
403- var stack = obj . stack . slice ( 1 )
400+ stack = stack . slice ( 1 )
404401
405402 Error . prepareStackTrace = prep
406403 Error . stackTraceLimit = limit
407404
408405 return stack
409406}
410407
408+ /**
409+ * Build a substitute CallSite object out of a stack trace line.
410+ */
411+
412+ function makeCallSite ( line ) {
413+ var at = line . split ( ' at ' ) . slice ( 1 ) . join ( ' at ' )
414+ var filePath = at
415+ var functionName = '<anonymous>'
416+ var lineNumber = 1
417+ var columnNumber = ''
418+ if ( filePath . indexOf ( '(' ) !== - 1 ) {
419+ var parts = filePath . split ( ' (' )
420+ if ( parts [ 0 ] !== 'eval' ) {
421+ functionName = parts [ 0 ]
422+ }
423+ filePath = parts . slice ( 1 ) . join ( ' (' ) . slice ( 0 , - 1 )
424+ }
425+ if ( functionName !== '<anonymous>' ) {
426+ var parts2 = rsplit ( filePath , ':' , 2 )
427+ filePath = parts2 [ 0 ]
428+ lineNumber = Number ( parts2 [ 1 ] )
429+ columnNumber = Number ( parts2 [ 2 ] )
430+ if ( functionName . indexOf ( 'Object.' ) === 0 ) {
431+ functionName = functionName . slice ( 7 )
432+ }
433+ }
434+ return {
435+ getFileName : function ( ) { return filePath } ,
436+ getLineNumber : function ( ) { return lineNumber } ,
437+ getColumnNumber : function ( ) { return columnNumber } ,
438+ isEval : function ( ) { return false } ,
439+ getFunctionName : function ( ) { return functionName } ,
440+ getThis : function ( ) { return null } ,
441+ toString : function ( ) { return at }
442+ }
443+ }
444+
445+ /**
446+ * Function to split a string from the right, based on a separator pattern.
447+ */
448+
449+ function rsplit ( str , sep , maxsplit ) {
450+ var split = str . split ( sep )
451+ return [ split . slice ( 0 , - maxsplit ) . join ( sep ) ] . concat ( split . slice ( - maxsplit ) )
452+ }
453+
411454/**
412455 * Capture call site stack from v8.
413456 */
0 commit comments