Skip to content

Commit 8b2e4d9

Browse files
committed
perf: remove branches and out of bound indexing
1 parent cd91306 commit 8b2e4d9

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

apps/oxlint/src-js/plugins/tokens.ts

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -475,18 +475,13 @@ export function getFirstToken(
475475
}
476476

477477
if (typeof filter !== "function") {
478-
if (typeof skip !== "number") {
479-
// If no tokens start at or after `rangeStart`, return `null`
480-
if (startIndex >= tokensLength) return null;
481-
// Check if the first candidate token is actually within the range
482-
if (nodeTokens[startIndex].range[0] >= rangeEnd) return null;
483-
return nodeTokens[startIndex];
484-
}
478+
const skipTo = startIndex + (skip ?? 0);
479+
// Avoid indexing out of bounds
480+
if (skipTo >= tokensLength) return null;
485481

486-
const firstTokenAfterSkip = nodeTokens[startIndex + skip];
487-
if (firstTokenAfterSkip === undefined) return null;
488-
if (firstTokenAfterSkip.range[0] >= rangeEnd) return null;
489-
return firstTokenAfterSkip;
482+
const token = nodeTokens[skipTo];
483+
if (token.range[0] >= rangeEnd) return null;
484+
return token;
490485
}
491486

492487
if (typeof skip !== "number") {
@@ -500,7 +495,7 @@ export function getFirstToken(
500495
const token = nodeTokens[i];
501496
if (token.range[0] >= rangeEnd) return null; // Token is outside the node
502497
if (filter(token)) {
503-
if (skip === 0) return token;
498+
if (skip <= 0) return token;
504499
skip--;
505500
}
506501
}
@@ -668,10 +663,11 @@ export function getLastToken(
668663
lastTokenIndex--;
669664

670665
if (typeof filter !== "function") {
671-
if (typeof skip !== "number") return nodeTokens[lastTokenIndex] ?? null;
672-
673-
const token = nodeTokens[lastTokenIndex - skip];
674-
if (token === undefined || token.range[0] < rangeStart) return null;
666+
const skipTo = lastTokenIndex - (skip ?? 0);
667+
// Avoid indexing out of bounds
668+
if (skipTo < 0) return null;
669+
const token = nodeTokens[skipTo];
670+
if (token.range[0] < rangeStart) return null;
675671
return token;
676672
}
677673

@@ -686,7 +682,7 @@ export function getLastToken(
686682
const token = nodeTokens[i];
687683
if (token.range[0] < rangeStart) return null;
688684
if (filter(token)) {
689-
if (skip === 0) return token;
685+
if (skip <= 0) return token;
690686
skip--;
691687
}
692688
}
@@ -858,8 +854,10 @@ export function getTokenBefore(
858854
beforeIndex--;
859855

860856
if (typeof filter !== "function") {
861-
if (typeof skip !== "number") return nodeTokens[beforeIndex] ?? null;
862-
return nodeTokens[beforeIndex - skip] ?? null;
857+
const skipTo = beforeIndex - (skip ?? 0);
858+
// Avoid indexing out of bounds
859+
if (skipTo < 0) return null;
860+
return nodeTokens[skipTo];
863861
}
864862

865863
if (typeof skip !== "number") {
@@ -872,7 +870,7 @@ export function getTokenBefore(
872870
while (beforeIndex >= 0) {
873871
const token = nodeTokens[beforeIndex];
874872
if (filter(token)) {
875-
if (skip === 0) return token;
873+
if (skip <= 0) return token;
876874
skip--;
877875
}
878876
beforeIndex--;
@@ -1006,8 +1004,8 @@ export function getTokenAfter(
10061004
typeof skipOptions === "number"
10071005
? skipOptions
10081006
: typeof skipOptions === "object" && skipOptions !== null
1009-
? (skipOptions.skip ?? 0)
1010-
: 0;
1007+
? skipOptions.skip
1008+
: null;
10111009

10121010
const filter =
10131011
typeof skipOptions === "function"
@@ -1049,8 +1047,10 @@ export function getTokenAfter(
10491047

10501048
// Fast path for the common case
10511049
if (typeof filter !== "function") {
1052-
if (typeof skip !== "number") return nodeTokens[startIndex] ?? null;
1053-
return nodeTokens[startIndex + skip] ?? null;
1050+
const skipTo = startIndex + (skip ?? 0);
1051+
// Avoid indexing out of bounds
1052+
if (skipTo >= tokensLength) return null;
1053+
return nodeTokens[skipTo];
10541054
}
10551055

10561056
if (typeof skip !== "number") {
@@ -1062,7 +1062,7 @@ export function getTokenAfter(
10621062
for (let i = startIndex; i < tokensLength; i++) {
10631063
const token = nodeTokens[i];
10641064
if (filter(token)) {
1065-
if (skip === 0) return token;
1065+
if (skip <= 0) return token;
10661066
skip--;
10671067
}
10681068
}
@@ -1339,8 +1339,11 @@ export function getFirstTokenBetween(
13391339
}
13401340

13411341
if (typeof filter !== "function") {
1342-
const token = nodeTokens[typeof skip === "number" ? firstTokenIndex + skip : firstTokenIndex];
1343-
if (token === undefined || token.range[0] >= rangeEnd) return null;
1342+
const skipTo = firstTokenIndex + (skip ?? 0);
1343+
// Avoid indexing out of bounds
1344+
if (skipTo >= tokensLength) return null;
1345+
const token = nodeTokens[skipTo];
1346+
if (token.range[0] >= rangeEnd) return null;
13441347
return token;
13451348
}
13461349

@@ -1530,8 +1533,11 @@ export function getLastTokenBetween(
15301533

15311534
// Fast path for the common case
15321535
if (typeof filter !== "function") {
1533-
const token = nodeTokens[typeof skip === "number" ? lastTokenIndex - skip : lastTokenIndex];
1534-
if (token === undefined || token.range[0] < rangeStart) return null;
1536+
const skipTo = lastTokenIndex - (skip ?? 0);
1537+
// Avoid indexing out of bounds
1538+
if (skipTo < 0) return null;
1539+
const token = nodeTokens[skipTo];
1540+
if (token.range[0] < rangeStart) return null;
15351541
return token;
15361542
}
15371543

@@ -1546,8 +1552,6 @@ export function getLastTokenBetween(
15461552
const token = nodeTokens[i];
15471553
if (token.range[0] < rangeStart) return null;
15481554
if (filter(token)) {
1549-
// `<=` because user input may be negative
1550-
// TODO: gracefully handle the negative case in other methods
15511555
if (skip <= 0) return token;
15521556
skip--;
15531557
}

0 commit comments

Comments
 (0)