Skip to content

Commit 85c95df

Browse files
committed
Implement lax/strict original scope variable names
1 parent e259f58 commit 85c95df

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

src/decode/decode.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,60 @@ describe("decode", () => {
257257

258258
assertEquals(info.scopes, []);
259259
});
260+
261+
it("throws if ORIGINAL_SCOPE_VARIABLES indices are out-of-bounds (upper)", () => {
262+
const encoder = new ItemEncoder();
263+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_START, 0, 0, 0).finishItem();
264+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_VARIABLES);
265+
encoder.addSignedVLQs(0, 2).finishItem(); // The '2' is illegal as we only have 1 name.
266+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_END, 1, 0).finishItem();
267+
const map = createMap(encoder.encode(), ["foo"]);
268+
269+
assertThrows(
270+
() => decode(map, { mode: DecodeMode.STRICT }),
271+
Error,
272+
"index into the 'names'",
273+
);
274+
});
275+
276+
it("throws if ORIGINAL_SCOPE_VARIABLES indices are out-of-bounds (lower)", () => {
277+
const encoder = new ItemEncoder();
278+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_START, 0, 0, 0).finishItem();
279+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_VARIABLES);
280+
encoder.addSignedVLQs(0, -1).finishItem(); // The '-1' is illegal as we only have 1 name.
281+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_END, 1, 0).finishItem();
282+
const map = createMap(encoder.encode(), ["foo"]);
283+
284+
assertThrows(
285+
() => decode(map, { mode: DecodeMode.STRICT }),
286+
Error,
287+
"index into the 'names'",
288+
);
289+
});
290+
291+
it("ignores if ORIGINAL_SCOPE_VARIABLES indices are out-of-bounds (upper)", () => {
292+
const encoder = new ItemEncoder();
293+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_START, 0, 0, 0).finishItem();
294+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_VARIABLES);
295+
encoder.addSignedVLQs(0, 2).finishItem(); // The '2' is illegal as we only have 1 name.
296+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_END, 1, 0).finishItem();
297+
const map = createMap(encoder.encode(), ["foo"]);
298+
299+
const info = decode(map, { mode: DecodeMode.LAX });
300+
301+
assertEquals(info.scopes[0]?.variables, ["foo", ""]);
302+
});
303+
304+
it("ignores if ORIGINAL_SCOPE_VARIABLES indices are out-of-bounds (lower)", () => {
305+
const encoder = new ItemEncoder();
306+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_START, 0, 0, 0).finishItem();
307+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_VARIABLES);
308+
encoder.addSignedVLQs(0, -1).finishItem(); // The '-1' is illegal as we only have 1 name.
309+
encoder.addUnsignedVLQs(Tag.ORIGINAL_SCOPE_END, 1, 0).finishItem();
310+
const map = createMap(encoder.encode(), ["foo"]);
311+
312+
const info = decode(map, { mode: DecodeMode.LAX });
313+
314+
assertEquals(info.scopes[0]?.variables, ["foo", ""]);
315+
});
260316
});

src/decode/decode.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,16 @@ class Decoder {
245245

246246
for (const variableIdx of variableIdxs) {
247247
this.#scopeState.variable += variableIdx;
248-
scope.variables.push(this.#names[this.#scopeState.variable]);
249248

250-
// TODO: Potentially throw if we decode an illegal index.
249+
if (
250+
this.#scopeState.variable < 0 ||
251+
this.#scopeState.variable >= this.#names.length
252+
) {
253+
this.#throwInStrictMode(
254+
"ORIGINAL_SCOPE_VARIABLE is not a valid index into the 'names' array",
255+
);
256+
}
257+
scope.variables.push(this.#names[this.#scopeState.variable] ?? "");
251258
}
252259
}
253260

0 commit comments

Comments
 (0)