@@ -265,23 +265,19 @@ function log (message, site) {
265
265
*/
266
266
267
267
function 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
284
274
}
275
+
276
+ var site = [ file , line , colm ]
277
+
278
+ site . callSite = callSite
279
+ site . name = callSite . getFunctionName ( )
280
+
285
281
return site
286
282
}
287
283
@@ -393,21 +389,68 @@ function getStack () {
393
389
// capture the stack
394
390
Error . captureStackTrace ( obj )
395
391
396
- if ( typeof obj . stack === 'string' || obj . stack instanceof String ) {
392
+ var stack = obj . stack
393
+ if ( typeof stack === 'string' || stack instanceof String ) {
397
394
// 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 )
400
397
}
401
398
402
399
// slice this function off the top
403
- var stack = obj . stack . slice ( 1 )
400
+ stack = stack . slice ( 1 )
404
401
405
402
Error . prepareStackTrace = prep
406
403
Error . stackTraceLimit = limit
407
404
408
405
return stack
409
406
}
410
407
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
+
411
454
/**
412
455
* Capture call site stack from v8.
413
456
*/
0 commit comments