Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions scripts/bench-source-map.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -114,11 +114,11 @@ for (const kib of SIZES_KIB) {
[
'query full value range',
() => {
for (let r = 0; r < 1000; r++) sourceMap.getSourceRange(node, 0, len);
for (let r = 0; r < 10_000; r++) sourceMap.getSourceRange(node, 0, len);
},
],
[
'random queries',
'random single-unit queries',
() => {
let seed = 12345;
const rand = () => {
Expand All @@ -131,6 +131,21 @@ for (const kib of SIZES_KIB) {
}
},
],
[
'random range queries',
() => {
let seed = 12345;
const rand = () => {
seed = (seed * 1103515245 + 12345) & 0x7FFFFFFF;
return seed / 0x7FFFFFFF;
};
for (let r = 0; r < 10_000; r++) {
const a = Math.floor(rand() * len);
const b = Math.floor(rand() * (len - a)) + a + 1;
sourceMap.getSourceRange(node, a, Math.min(b, len));
}
},
],
[
'sequential span queries',
() => {
Expand All @@ -144,7 +159,7 @@ for (const kib of SIZES_KIB) {
const selectedPatterns = SMOKE ? [patterns[0]] : patterns;

for (const [label, fn] of selectedPatterns) {
const r = time(label, fn);
const r = timeMedian(label, fn);
console.log(` ${r.label.padEnd(28)} ${fmt(r.ms)}`);

if (SMOKE && r.ms > SMOKE_QUERY_BUDGET_MS) {
Expand Down
49 changes: 15 additions & 34 deletions src/source-map/build-source-map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -424,25 +424,6 @@ function validateValueRange(
};
}

function sourceOffsetAt(
segments: MarkdownSourceMapSegment[],
valueLength: number,
valueIndex: number,
pastUnit: boolean,
incompleteMessage: string,
): number {
const segment = findSegmentAt(segments, valueIndex);
if (!segment) {
if (valueIndex === valueLength && segments.length > 0)
return segments[segments.length - 1].sourceEnd;
throw new RangeError(incompleteMessage);
}
if (segment.kind !== 'literal')
return pastUnit ? segment.sourceEnd : segment.sourceStart;
const units = (pastUnit ? valueIndex + 1 : valueIndex) - segment.valueStart;
return segment.sourceStart + units;
}

function resolveEmptyRange(
options: SegmentRangeOptions,
): number {
Expand Down Expand Up @@ -473,7 +454,6 @@ function resolveEmptyRange(
function resolveSegmentRange(options: SegmentRangeOptions): ParsedPosition {
const {
segments,
valueLength,
valueStart,
valueEnd,
sourceGapPrefix,
Expand Down Expand Up @@ -506,20 +486,21 @@ function resolveSegmentRange(options: SegmentRangeOptions): ParsedPosition {
throw new RangeError(messages.nonContiguous);
}

const startOffset = sourceOffsetAt(
segments,
valueLength,
valueStart,
false,
messages.incomplete,
);
const endOffset = sourceOffsetAt(
segments,
valueLength,
valueEnd - 1,
true,
messages.incomplete,
);
const startSegment = segments[startSegmentIndex];
const endSegment = segments[endSegmentIndex];

let startOffset: number;
if (startSegment.kind !== 'literal')
startOffset = startSegment.sourceStart;
else
startOffset = startSegment.sourceStart + valueStart - startSegment.valueStart;

let endOffset: number;
if (endSegment.kind !== 'literal')
endOffset = endSegment.sourceEnd;
else
endOffset = endSegment.sourceStart + (valueEnd - 1) + 1 - endSegment.valueStart;

return {
start: pointAtOffset(lineStarts, source, startOffset),
end: pointAtOffset(lineStarts, source, endOffset),
Expand Down