Skip to content

Commit b0c8338

Browse files
committed
Implement strict/lax verification for definition scope
1 parent 0848ebc commit b0c8338

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

src/decode/decode.test.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
import { encodeSigned, encodeUnsigned } from "../vlq.ts";
1515
import { decode, DecodeMode } from "./decode.ts";
1616
import type { SourceMapJson } from "../scopes.d.ts";
17-
import { OriginalScopeFlags, Tag } from "../codec.ts";
17+
import { GeneratedRangeFlags, OriginalScopeFlags, Tag } from "../codec.ts";
1818

1919
class ItemEncoder {
2020
#encodedItems: string[] = [];
@@ -377,4 +377,35 @@ describe("decode", () => {
377377

378378
assertEquals(info.ranges[0]?.values, [""]);
379379
});
380+
381+
it("throws if GENERATED_RANGE_START.definition is not a valid original scope in strict mode", () => {
382+
const encoder = new ItemEncoder();
383+
encoder.addUnsignedVLQs(
384+
Tag.GENERATED_RANGE_START,
385+
GeneratedRangeFlags.HAS_DEFINITION,
386+
0,
387+
1,
388+
).finishItem();
389+
encoder.addUnsignedVLQs(Tag.GENERATED_RANGE_END, 2).finishItem();
390+
const map = createMap(encoder.encode(), []);
391+
392+
assertThrows(() => decode(map, { mode: DecodeMode.STRICT }));
393+
});
394+
395+
it("ignores if GENERATED_RANGE_START.definition is not a valid original scope in lax mode", () => {
396+
const encoder = new ItemEncoder();
397+
encoder.addUnsignedVLQs(
398+
Tag.GENERATED_RANGE_START,
399+
GeneratedRangeFlags.HAS_DEFINITION,
400+
0,
401+
1,
402+
).finishItem();
403+
encoder.addUnsignedVLQs(Tag.GENERATED_RANGE_END, 2).finishItem();
404+
const map = createMap(encoder.encode(), []);
405+
406+
const info = decode(map, { mode: DecodeMode.LAX });
407+
408+
assertExists(info.ranges[0]);
409+
assertStrictEquals(info.ranges[0].originalScope, undefined);
410+
});
380411
});

src/decode/decode.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,15 @@ class Decoder {
299299

300300
if (item.definitionIdx !== undefined) {
301301
this.#rangeState.defScopeIdx += item.definitionIdx;
302-
range.originalScope =
303-
this.#flatOriginalScopes[this.#rangeState.defScopeIdx];
304-
// TODO: Maybe throw if the idx is invalid?
302+
if (
303+
this.#rangeState.defScopeIdx < 0 ||
304+
this.#rangeState.defScopeIdx >= this.#flatOriginalScopes.length
305+
) {
306+
this.#throwInStrictMode("Invalid definition scope index");
307+
} else {
308+
range.originalScope =
309+
this.#flatOriginalScopes[this.#rangeState.defScopeIdx];
310+
}
305311
}
306312

307313
this.#rangeStack.push(range);

0 commit comments

Comments
 (0)