Skip to content

Commit ed48402

Browse files
committed
Implement unsigned encoding/decoding
1 parent 5b9b2f3 commit ed48402

File tree

2 files changed

+37
-28
lines changed

2 files changed

+37
-28
lines changed

packages/sourcemap-codec/src/sourcemap-codec.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq';
1+
import {
2+
comma,
3+
decodeInteger,
4+
decodeSign,
5+
encodeInteger,
6+
encodeSign,
7+
hasMoreVlq,
8+
semicolon,
9+
} from './vlq';
210
import { StringWriter, StringReader } from './strings';
311

412
export {
@@ -36,17 +44,17 @@ export function decode(mappings: string): SourceMapMappings {
3644
while (reader.pos < semi) {
3745
let seg: SourceMapSegment;
3846

39-
genColumn = decodeInteger(reader, genColumn);
47+
genColumn += decodeSign(decodeInteger(reader));
4048
if (genColumn < lastCol) sorted = false;
4149
lastCol = genColumn;
4250

4351
if (hasMoreVlq(reader, semi)) {
44-
sourcesIndex = decodeInteger(reader, sourcesIndex);
45-
sourceLine = decodeInteger(reader, sourceLine);
46-
sourceColumn = decodeInteger(reader, sourceColumn);
52+
sourcesIndex += decodeSign(decodeInteger(reader));
53+
sourceLine += decodeSign(decodeInteger(reader));
54+
sourceColumn += decodeSign(decodeInteger(reader));
4755

4856
if (hasMoreVlq(reader, semi)) {
49-
namesIndex = decodeInteger(reader, namesIndex);
57+
namesIndex += decodeSign(decodeInteger(reader));
5058
seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];
5159
} else {
5260
seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];
@@ -95,15 +103,20 @@ export function encode(decoded: Readonly<SourceMapMappings>): string {
95103
const segment = line[j];
96104
if (j > 0) writer.write(comma);
97105

98-
genColumn = encodeInteger(writer, segment[0], genColumn);
106+
encodeInteger(writer, encodeSign(segment[0] - genColumn));
107+
genColumn = segment[0];
99108

100109
if (segment.length === 1) continue;
101-
sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);
102-
sourceLine = encodeInteger(writer, segment[2], sourceLine);
103-
sourceColumn = encodeInteger(writer, segment[3], sourceColumn);
110+
encodeInteger(writer, encodeSign(segment[1] - sourcesIndex));
111+
sourcesIndex = segment[1];
112+
encodeInteger(writer, encodeSign(segment[2] - sourceLine));
113+
sourceLine = segment[2];
114+
encodeInteger(writer, encodeSign(segment[3] - sourceColumn));
115+
sourceColumn = segment[3];
104116

105117
if (segment.length === 4) continue;
106-
namesIndex = encodeInteger(writer, segment[4], namesIndex);
118+
encodeInteger(writer, encodeSign(segment[4] - namesIndex));
119+
namesIndex = segment[4];
107120
}
108121
}
109122

packages/sourcemap-codec/src/vlq.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ for (let i = 0; i < chars.length; i++) {
1313
charToInt[c] = i;
1414
}
1515

16-
export function decodeInteger(reader: StringReader, relative: number): number {
16+
export function decodeInteger(reader: StringReader): number {
1717
let value = 0;
1818
let shift = 0;
1919
let integer = 0;
@@ -25,28 +25,24 @@ export function decodeInteger(reader: StringReader, relative: number): number {
2525
shift += 5;
2626
} while (integer & 32);
2727

28-
const shouldNegate = value & 1;
29-
value >>>= 1;
30-
31-
if (shouldNegate) {
32-
value = -0x80000000 | -value;
33-
}
34-
35-
return relative + value;
28+
return value;
3629
}
3730

38-
export function encodeInteger(builder: StringWriter, num: number, relative: number): number {
39-
let delta = num - relative;
31+
export function decodeSign(num: number): number {
32+
return num & 1 ? -0x80000000 | -(num >>> 1) : num >>> 1;
33+
}
4034

41-
delta = delta < 0 ? (-delta << 1) | 1 : delta << 1;
35+
export function encodeInteger(builder: StringWriter, num: number) {
4236
do {
43-
let clamped = delta & 0b011111;
44-
delta >>>= 5;
45-
if (delta > 0) clamped |= 0b100000;
37+
let clamped = num & 0b011111;
38+
num >>>= 5;
39+
if (num > 0) clamped |= 0b100000;
4640
builder.write(intToChar[clamped]);
47-
} while (delta > 0);
41+
} while (num > 0);
42+
}
4843

49-
return num;
44+
export function encodeSign(num: number): number {
45+
return num < 0 ? (-num << 1) | 1 : num << 1;
5046
}
5147

5248
export function hasMoreVlq(reader: StringReader, max: number) {

0 commit comments

Comments
 (0)