summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2018-11-18 04:25:05 +0100
committerRuben Bridgewater <ruben@bridgewater.de>2018-12-19 17:12:00 +0100
commita76750b49e70fbf32711d68608db3e320f19b359 (patch)
treebfdc8244e3576c1ad4433b3678cfd332a3ee9577 /lib
parent35a8906964dc4544dd59ad99b2c1f58a09d484f3 (diff)
downloadandroid-node-v8-a76750b49e70fbf32711d68608db3e320f19b359.tar.gz
android-node-v8-a76750b49e70fbf32711d68608db3e320f19b359.tar.bz2
android-node-v8-a76750b49e70fbf32711d68608db3e320f19b359.zip
events: simplify stack compare function
This simplifies the `longestSeqContainedIn()` logic by checking for the first identical occurance of at least three frames instead of the longest one. It also removes an unused argument. PR-URL: https://github.com/nodejs/node/pull/24744 Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/events.js41
1 files changed, 20 insertions, 21 deletions
diff --git a/lib/events.js b/lib/events.js
index 6c5b699faa..10cec4bd69 100644
--- a/lib/events.js
+++ b/lib/events.js
@@ -103,30 +103,29 @@ EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return $getMaxListeners(this);
};
-// Returns the longest sequence of `a` that fully appears in `b`,
-// of length at least 3.
-// This is a lazy approach but should work well enough, given that stack
-// frames are usually unequal or otherwise appear in groups, and that
-// we only run this code in case of an unhandled exception.
-function longestSeqContainedIn(a, b) {
- for (var len = a.length; len >= 3; --len) {
- for (var i = 0; i < a.length - len; ++i) {
- // Attempt to find a[i:i+len] in b
- for (var j = 0; j < b.length - len; ++j) {
- let matches = true;
- for (var k = 0; k < len; ++k) {
- if (a[i + k] !== b[j + k]) {
- matches = false;
- break;
- }
+// Returns the length and line number of the first sequence of `a` that fully
+// appears in `b` with a length of at least 4.
+function identicalSequenceRange(a, b) {
+ for (var i = 0; i < a.length - 3; i++) {
+ // Find the first entry of b that matches the current entry of a.
+ const pos = b.indexOf(a[i]);
+ if (pos !== -1) {
+ const rest = b.length - pos;
+ if (rest > 3) {
+ let len = 1;
+ const maxLen = Math.min(a.length - i, rest);
+ // Count the number of consecutive entries.
+ while (maxLen > len && a[i + len] === b[pos + len]) {
+ len++;
+ }
+ if (len > 3) {
+ return [len, i];
}
- if (matches)
- return [ len, i, j ];
}
}
}
- return [ 0, 0, 0 ];
+ return [0, 0];
}
function enhanceStackTrace(err, own) {
@@ -135,9 +134,9 @@ function enhanceStackTrace(err, own) {
const errStack = err.stack.split('\n').slice(1);
const ownStack = own.stack.split('\n').slice(1);
- const [ len, off ] = longestSeqContainedIn(ownStack, errStack);
+ const [ len, off ] = identicalSequenceRange(ownStack, errStack);
if (len > 0) {
- ownStack.splice(off + 1, len - 1,
+ ownStack.splice(off + 1, len - 2,
' [... lines matching original stack trace ...]');
}
// Do this last, because it is the only operation with side effects.