@@ -103,30 +103,29 @@ EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
103
103
return $getMaxListeners ( this ) ;
104
104
} ;
105
105
106
- // Returns the longest sequence of `a` that fully appears in `b`,
107
- // of length at least 3.
108
- // This is a lazy approach but should work well enough, given that stack
109
- // frames are usually unequal or otherwise appear in groups, and that
110
- // we only run this code in case of an unhandled exception.
111
- function longestSeqContainedIn ( a , b ) {
112
- for ( var len = a . length ; len >= 3 ; -- len ) {
113
- for ( var i = 0 ; i < a . length - len ; ++ i ) {
114
- // Attempt to find a[i:i+len] in b
115
- for ( var j = 0 ; j < b . length - len ; ++ j ) {
116
- let matches = true ;
117
- for ( var k = 0 ; k < len ; ++ k ) {
118
- if ( a [ i + k ] !== b [ j + k ] ) {
119
- matches = false ;
120
- break ;
121
- }
106
+ // Returns the length and line number of the first sequence of `a` that fully
107
+ // appears in `b` with a length of at least 4.
108
+ function identicalSequenceRange ( a , b ) {
109
+ for ( var i = 0 ; i < a . length - 3 ; i ++ ) {
110
+ // Find the first entry of b that matches the current entry of a.
111
+ const pos = b . indexOf ( a [ i ] ) ;
112
+ if ( pos !== - 1 ) {
113
+ const rest = b . length - pos ;
114
+ if ( rest > 3 ) {
115
+ let len = 1 ;
116
+ const maxLen = Math . min ( a . length - i , rest ) ;
117
+ // Count the number of consecutive entries.
118
+ while ( maxLen > len && a [ i + len ] === b [ pos + len ] ) {
119
+ len ++ ;
120
+ }
121
+ if ( len > 3 ) {
122
+ return [ len , i ] ;
122
123
}
123
- if ( matches )
124
- return [ len , i , j ] ;
125
124
}
126
125
}
127
126
}
128
127
129
- return [ 0 , 0 , 0 ] ;
128
+ return [ 0 , 0 ] ;
130
129
}
131
130
132
131
function enhanceStackTrace ( err , own ) {
@@ -135,9 +134,9 @@ function enhanceStackTrace(err, own) {
135
134
const errStack = err . stack . split ( '\n' ) . slice ( 1 ) ;
136
135
const ownStack = own . stack . split ( '\n' ) . slice ( 1 ) ;
137
136
138
- const [ len , off ] = longestSeqContainedIn ( ownStack , errStack ) ;
137
+ const [ len , off ] = identicalSequenceRange ( ownStack , errStack ) ;
139
138
if ( len > 0 ) {
140
- ownStack . splice ( off + 1 , len - 1 ,
139
+ ownStack . splice ( off + 1 , len - 2 ,
141
140
' [... lines matching original stack trace ...]' ) ;
142
141
}
143
142
// Do this last, because it is the only operation with side effects.
0 commit comments