@flighthq/abc 0.3.0-next.1494.7333e82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ import type { AbcFile } from '@flighthq/types/contract';
2
+ export declare function readAbcFile(source: Uint8Array): AbcFile | null;
3
+ //# sourceMappingURL=abcFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abcFile.d.ts","sourceRoot":"","sources":["../src/abcFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EAWR,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI,CAmE9D"}
@@ -0,0 +1,388 @@
1
+ import { AbcMultinameKind, AbcTraitKind } from '@flighthq/types/contract';
2
+ // Reads an ABC (AVM2 bytecode) container into plain data, or null when the bytes are not a readable one.
3
+ // This parses; it never executes. What comes back is the file's own tables — constant pool, methods,
4
+ // classes, instances, scripts, and method bodies — with every cross-reference left as the index the format
5
+ // stored, so a consumer resolves only what it needs.
6
+ //
7
+ // Method bodies keep their instruction stream as raw bytes. Decoding instructions needs the whole opcode
8
+ // table and belongs in its own step, so a caller that only wants class names or trait layout never pays
9
+ // for it.
10
+ export function readAbcFile(source) {
11
+ const reader = new AbcReader(source);
12
+ const minorVersion = reader.readUint16();
13
+ const majorVersion = reader.readUint16();
14
+ if (!reader.valid)
15
+ return null;
16
+ const constantPool = readAbcConstantPool(reader);
17
+ if (constantPool === null)
18
+ return null;
19
+ const methods = [];
20
+ const methodCount = reader.readVarUint();
21
+ if (!reader.valid || methodCount > MAX_ENTRIES)
22
+ return null;
23
+ for (let i = 0; i < methodCount; i++) {
24
+ const method = readAbcMethod(reader);
25
+ if (method === null)
26
+ return null;
27
+ methods.push(method);
28
+ }
29
+ const metadata = [];
30
+ const metadataCount = reader.readVarUint();
31
+ if (!reader.valid || metadataCount > MAX_ENTRIES)
32
+ return null;
33
+ for (let i = 0; i < metadataCount; i++) {
34
+ const entry = readAbcMetadata(reader);
35
+ if (entry === null)
36
+ return null;
37
+ metadata.push(entry);
38
+ }
39
+ // Instances and classes are parallel lists sharing one count: every class has exactly one instance, and
40
+ // the format writes all instances before all classes.
41
+ const classCount = reader.readVarUint();
42
+ if (!reader.valid || classCount > MAX_ENTRIES)
43
+ return null;
44
+ const instances = [];
45
+ for (let i = 0; i < classCount; i++) {
46
+ const instance = readAbcInstance(reader);
47
+ if (instance === null)
48
+ return null;
49
+ instances.push(instance);
50
+ }
51
+ const classes = [];
52
+ for (let i = 0; i < classCount; i++) {
53
+ const initializer = reader.readVarUint();
54
+ const traits = readAbcTraits(reader);
55
+ if (traits === null)
56
+ return null;
57
+ classes.push({ initializer, traits });
58
+ }
59
+ const scripts = [];
60
+ const scriptCount = reader.readVarUint();
61
+ if (!reader.valid || scriptCount > MAX_ENTRIES)
62
+ return null;
63
+ for (let i = 0; i < scriptCount; i++) {
64
+ const initializer = reader.readVarUint();
65
+ const traits = readAbcTraits(reader);
66
+ if (traits === null)
67
+ return null;
68
+ scripts.push({ initializer, traits });
69
+ }
70
+ const methodBodies = [];
71
+ const bodyCount = reader.readVarUint();
72
+ if (!reader.valid || bodyCount > MAX_ENTRIES)
73
+ return null;
74
+ for (let i = 0; i < bodyCount; i++) {
75
+ const body = readAbcMethodBody(reader);
76
+ if (body === null)
77
+ return null;
78
+ methodBodies.push(body);
79
+ }
80
+ return reader.valid
81
+ ? { classes, constantPool, instances, majorVersion, metadata, methodBodies, methods, minorVersion, scripts }
82
+ : null;
83
+ }
84
+ // Every constant pool is 1-based: the format writes a count that is one more than the number of entries
85
+ // stored, and index 0 is a reserved placeholder no entry ever occupies. The placeholders are materialized
86
+ // here so a consumer can index the arrays directly with the indices the file carries.
87
+ function readAbcConstantPool(reader) {
88
+ const integers = [0];
89
+ if (!readAbcPool(reader, integers, () => reader.readVarInt()))
90
+ return null;
91
+ const unsignedIntegers = [0];
92
+ if (!readAbcPool(reader, unsignedIntegers, () => reader.readVarUint()))
93
+ return null;
94
+ const doubles = [Number.NaN];
95
+ if (!readAbcPool(reader, doubles, () => reader.readDouble()))
96
+ return null;
97
+ const strings = [''];
98
+ if (!readAbcPool(reader, strings, () => reader.readString()))
99
+ return null;
100
+ const namespaces = [{ kind: 0, name: 0 }];
101
+ if (!readAbcPool(reader, namespaces, () => ({ kind: reader.readUint8(), name: reader.readVarUint() })))
102
+ return null;
103
+ const namespaceSets = [[]];
104
+ if (!readAbcPool(reader, namespaceSets, () => {
105
+ const count = reader.readVarUint();
106
+ if (count > MAX_ENTRIES)
107
+ return null;
108
+ const set = [];
109
+ for (let i = 0; i < count; i++)
110
+ set.push(reader.readVarUint());
111
+ return set;
112
+ })) {
113
+ return null;
114
+ }
115
+ const multinames = [createAbcMultiname(0)];
116
+ if (!readAbcPool(reader, multinames, () => readAbcMultiname(reader)))
117
+ return null;
118
+ return reader.valid ? { doubles, integers, multinames, namespaceSets, namespaces, strings, unsignedIntegers } : null;
119
+ }
120
+ function readAbcPool(reader, out, read) {
121
+ const count = reader.readVarUint();
122
+ if (!reader.valid || count > MAX_ENTRIES)
123
+ return false;
124
+ for (let i = 1; i < count; i++) {
125
+ const entry = read();
126
+ if (entry === null || !reader.valid)
127
+ return false;
128
+ out.push(entry);
129
+ }
130
+ return true;
131
+ }
132
+ function createAbcMultiname(kind) {
133
+ return { kind, name: 0, namespace: 0, namespaceSet: 0, parameters: [], typeName: 0 };
134
+ }
135
+ function readAbcMultiname(reader) {
136
+ const multiname = createAbcMultiname(reader.readUint8());
137
+ if (multiname.kind === AbcMultinameKind.QName || multiname.kind === AbcMultinameKind.QNameA) {
138
+ multiname.namespace = reader.readVarUint();
139
+ multiname.name = reader.readVarUint();
140
+ }
141
+ else if (multiname.kind === AbcMultinameKind.RtqName || multiname.kind === AbcMultinameKind.RtqNameA) {
142
+ multiname.name = reader.readVarUint();
143
+ }
144
+ else if (multiname.kind === AbcMultinameKind.RtqNameL || multiname.kind === AbcMultinameKind.RtqNameLA) {
145
+ // Both parts come off the operand stack at runtime, so the record carries nothing.
146
+ }
147
+ else if (multiname.kind === AbcMultinameKind.Multiname || multiname.kind === AbcMultinameKind.MultinameA) {
148
+ multiname.name = reader.readVarUint();
149
+ multiname.namespaceSet = reader.readVarUint();
150
+ }
151
+ else if (multiname.kind === AbcMultinameKind.MultinameL || multiname.kind === AbcMultinameKind.MultinameLA) {
152
+ multiname.namespaceSet = reader.readVarUint();
153
+ }
154
+ else if (multiname.kind === AbcMultinameKind.TypeName) {
155
+ multiname.typeName = reader.readVarUint();
156
+ const count = reader.readVarUint();
157
+ if (count > MAX_ENTRIES)
158
+ return null;
159
+ for (let i = 0; i < count; i++)
160
+ multiname.parameters.push(reader.readVarUint());
161
+ }
162
+ else {
163
+ return null;
164
+ }
165
+ return reader.valid ? multiname : null;
166
+ }
167
+ function readAbcMethod(reader) {
168
+ const parameterCount = reader.readVarUint();
169
+ if (!reader.valid || parameterCount > MAX_ENTRIES)
170
+ return null;
171
+ const returnType = reader.readVarUint();
172
+ const parameterTypes = [];
173
+ for (let i = 0; i < parameterCount; i++)
174
+ parameterTypes.push(reader.readVarUint());
175
+ const name = reader.readVarUint();
176
+ const flags = reader.readUint8();
177
+ if (!reader.valid)
178
+ return null;
179
+ const optionalValues = [];
180
+ if ((flags & METHOD_HAS_OPTIONAL) !== 0) {
181
+ const count = reader.readVarUint();
182
+ if (!reader.valid || count > MAX_ENTRIES)
183
+ return null;
184
+ for (let i = 0; i < count; i++)
185
+ optionalValues.push({ kind: 0, value: reader.readVarUint() });
186
+ for (const optional of optionalValues)
187
+ optional.kind = reader.readUint8();
188
+ }
189
+ const parameterNames = [];
190
+ if ((flags & METHOD_HAS_PARAM_NAMES) !== 0) {
191
+ for (let i = 0; i < parameterCount; i++)
192
+ parameterNames.push(reader.readVarUint());
193
+ }
194
+ return reader.valid ? { flags, name, optionalValues, parameterNames, parameterTypes, returnType } : null;
195
+ }
196
+ function readAbcMetadata(reader) {
197
+ const name = reader.readVarUint();
198
+ const count = reader.readVarUint();
199
+ if (!reader.valid || count > MAX_ENTRIES)
200
+ return null;
201
+ const items = [];
202
+ for (let i = 0; i < count; i++)
203
+ items.push({ key: reader.readVarUint(), value: reader.readVarUint() });
204
+ return reader.valid ? { items, name } : null;
205
+ }
206
+ function readAbcInstance(reader) {
207
+ const name = reader.readVarUint();
208
+ const superName = reader.readVarUint();
209
+ const flags = reader.readUint8();
210
+ const protectedNamespace = (flags & INSTANCE_PROTECTED_NAMESPACE) !== 0 ? reader.readVarUint() : 0;
211
+ const interfaceCount = reader.readVarUint();
212
+ if (!reader.valid || interfaceCount > MAX_ENTRIES)
213
+ return null;
214
+ const interfaces = [];
215
+ for (let i = 0; i < interfaceCount; i++)
216
+ interfaces.push(reader.readVarUint());
217
+ const initializer = reader.readVarUint();
218
+ const traits = readAbcTraits(reader);
219
+ if (traits === null)
220
+ return null;
221
+ return { flags, initializer, interfaces, name, protectedNamespace, superName, traits };
222
+ }
223
+ function readAbcTraits(reader) {
224
+ const count = reader.readVarUint();
225
+ if (!reader.valid || count > MAX_ENTRIES)
226
+ return null;
227
+ const traits = [];
228
+ for (let i = 0; i < count; i++) {
229
+ const trait = readAbcTrait(reader);
230
+ if (trait === null)
231
+ return null;
232
+ traits.push(trait);
233
+ }
234
+ return traits;
235
+ }
236
+ function readAbcTrait(reader) {
237
+ const name = reader.readVarUint();
238
+ const packed = reader.readUint8();
239
+ if (!reader.valid)
240
+ return null;
241
+ const kind = packed & 0x0f;
242
+ const trait = {
243
+ attributes: packed >> 4,
244
+ classIndex: 0,
245
+ dispatchId: 0,
246
+ kind,
247
+ metadata: [],
248
+ methodIndex: 0,
249
+ name,
250
+ slotId: 0,
251
+ typeName: 0,
252
+ valueIndex: 0,
253
+ valueKind: 0,
254
+ };
255
+ if (kind === AbcTraitKind.Slot || kind === AbcTraitKind.Const) {
256
+ trait.slotId = reader.readVarUint();
257
+ trait.typeName = reader.readVarUint();
258
+ trait.valueIndex = reader.readVarUint();
259
+ // A default of index 0 has no kind byte, because there is no value to name a pool for.
260
+ if (trait.valueIndex !== 0)
261
+ trait.valueKind = reader.readUint8();
262
+ }
263
+ else if (kind === AbcTraitKind.Class) {
264
+ trait.slotId = reader.readVarUint();
265
+ trait.classIndex = reader.readVarUint();
266
+ }
267
+ else if (kind === AbcTraitKind.Function) {
268
+ trait.slotId = reader.readVarUint();
269
+ trait.methodIndex = reader.readVarUint();
270
+ }
271
+ else if (kind === AbcTraitKind.Method || kind === AbcTraitKind.Getter || kind === AbcTraitKind.Setter) {
272
+ trait.dispatchId = reader.readVarUint();
273
+ trait.methodIndex = reader.readVarUint();
274
+ }
275
+ else {
276
+ return null;
277
+ }
278
+ if ((trait.attributes & TRAIT_ATTRIBUTE_METADATA) !== 0) {
279
+ const count = reader.readVarUint();
280
+ if (!reader.valid || count > MAX_ENTRIES)
281
+ return null;
282
+ for (let i = 0; i < count; i++)
283
+ trait.metadata.push(reader.readVarUint());
284
+ }
285
+ return reader.valid ? trait : null;
286
+ }
287
+ function readAbcMethodBody(reader) {
288
+ const method = reader.readVarUint();
289
+ const maxStack = reader.readVarUint();
290
+ const localCount = reader.readVarUint();
291
+ const initScopeDepth = reader.readVarUint();
292
+ const maxScopeDepth = reader.readVarUint();
293
+ const codeLength = reader.readVarUint();
294
+ if (!reader.valid || codeLength > reader.remaining())
295
+ return null;
296
+ const code = reader.readBytes(codeLength);
297
+ const exceptionCount = reader.readVarUint();
298
+ if (!reader.valid || exceptionCount > MAX_ENTRIES)
299
+ return null;
300
+ const exceptions = [];
301
+ for (let i = 0; i < exceptionCount; i++) {
302
+ exceptions.push({
303
+ exceptionType: 0,
304
+ from: reader.readVarUint(),
305
+ target: 0,
306
+ to: reader.readVarUint(),
307
+ variableName: 0,
308
+ });
309
+ const exception = exceptions[i];
310
+ exception.target = reader.readVarUint();
311
+ exception.exceptionType = reader.readVarUint();
312
+ exception.variableName = reader.readVarUint();
313
+ }
314
+ const traits = readAbcTraits(reader);
315
+ if (traits === null)
316
+ return null;
317
+ return { code, exceptions, initScopeDepth, localCount, maxScopeDepth, maxStack, method, traits };
318
+ }
319
+ // A bounded little-endian reader over the primitives ABC is written in. Like the rest of Flight's byte
320
+ // readers it reports an overrun through `valid` rather than throwing, so a caller checks once after a
321
+ // group of reads instead of testing each one.
322
+ class AbcReader {
323
+ source;
324
+ pos = 0;
325
+ valid = true;
326
+ constructor(source) {
327
+ this.source = source;
328
+ }
329
+ readBytes(count) {
330
+ if (this.pos + count > this.source.length) {
331
+ this.valid = false;
332
+ return new Uint8Array(0);
333
+ }
334
+ const value = this.source.subarray(this.pos, this.pos + count);
335
+ this.pos += count;
336
+ return value;
337
+ }
338
+ readDouble() {
339
+ if (this.pos + 8 > this.source.length) {
340
+ this.valid = false;
341
+ return 0;
342
+ }
343
+ const value = new DataView(this.source.buffer, this.source.byteOffset + this.pos, 8).getFloat64(0, true);
344
+ this.pos += 8;
345
+ return value;
346
+ }
347
+ // The format's variable-length integer: seven bits per byte, least significant group first, at most five
348
+ // bytes. Read as a signed 32-bit value.
349
+ readVarInt() {
350
+ return this.readVarUint() | 0;
351
+ }
352
+ readString() {
353
+ const length = this.readVarUint();
354
+ return this.valid ? _decoder.decode(this.readBytes(length)) : '';
355
+ }
356
+ readUint8() {
357
+ if (this.pos >= this.source.length) {
358
+ this.valid = false;
359
+ return 0;
360
+ }
361
+ return this.source[this.pos++];
362
+ }
363
+ readUint16() {
364
+ const low = this.readUint8();
365
+ return low + this.readUint8() * 0x100;
366
+ }
367
+ readVarUint() {
368
+ let value = 0;
369
+ for (let i = 0; i < VAR_UINT_MAX_BYTES; i++) {
370
+ const byte = this.readUint8();
371
+ value += (byte & 0x7f) * 2 ** (7 * i);
372
+ if ((byte & 0x80) === 0)
373
+ break;
374
+ }
375
+ return this.valid ? value : 0;
376
+ }
377
+ remaining() {
378
+ return this.source.length - this.pos;
379
+ }
380
+ }
381
+ const INSTANCE_PROTECTED_NAMESPACE = 0x08;
382
+ const MAX_ENTRIES = 1_000_000;
383
+ const METHOD_HAS_OPTIONAL = 0x08;
384
+ const METHOD_HAS_PARAM_NAMES = 0x80;
385
+ const TRAIT_ATTRIBUTE_METADATA = 0x04;
386
+ const VAR_UINT_MAX_BYTES = 5;
387
+ const _decoder = new TextDecoder();
388
+ //# sourceMappingURL=abcFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abcFile.js","sourceRoot":"","sources":["../src/abcFile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './abcFile';
2
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './abcFile';
2
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { readAbcFile } from './abcFile';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { readAbcFile } from './abcFile';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@flighthq/abc",
3
+ "version": "0.3.0-next.1494.7333e82",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/flighthq/flight.git",
7
+ "directory": "packages/abc"
8
+ },
9
+ "type": "module",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./contract": {
18
+ "types": "./dist/contract.d.ts",
19
+ "default": "./dist/contract.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "src/**/*.test.ts",
25
+ "!dist/**/*.test.js",
26
+ "!dist/**/*.test.d.ts",
27
+ "!dist/**/*.test.js.map",
28
+ "!dist/**/*.test.d.ts.map"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -b",
32
+ "clean": "tsc -b --clean",
33
+ "test": "vitest run --config vitest.config.ts",
34
+ "test:watch": "vitest --watch --config vitest.config.ts",
35
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
36
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
37
+ },
38
+ "dependencies": {
39
+ "@flighthq/types": "0.3.0-next.1494.7333e82"
40
+ },
41
+ "devDependencies": {
42
+ "typescript": "^5.3.0"
43
+ },
44
+ "description": "ABC (AVM2) bytecode container parsing into plain data",
45
+ "sideEffects": false
46
+ }
@@ -0,0 +1,192 @@
1
+ import { AbcMultinameKind, AbcTraitKind } from '@flighthq/types/contract';
2
+
3
+ import { readAbcFile } from './abcFile';
4
+
5
+ describe('readAbcFile', () => {
6
+ it('reads the version and the whole constant pool, keeping the reserved zero entry', () => {
7
+ const file = readAbcFile(buildAbc());
8
+
9
+ expect(file?.minorVersion).toBe(16);
10
+ expect(file?.majorVersion).toBe(46);
11
+ // Index 0 of every pool is the placeholder the format reserves, so pool indices in the file's own
12
+ // records can be used directly.
13
+ expect(file?.constantPool.strings[0]).toBe('');
14
+ expect(file?.constantPool.strings.slice(1)).toEqual(['Main', 'stop', 'flash.display']);
15
+ expect(file?.constantPool.integers).toEqual([0, -7]);
16
+ expect(file?.constantPool.unsignedIntegers).toEqual([0, 9]);
17
+ expect(file?.constantPool.doubles[1]).toBeCloseTo(1.5);
18
+ });
19
+
20
+ it('reads namespaces, namespace sets, and both multiname shapes', () => {
21
+ const file = readAbcFile(buildAbc());
22
+
23
+ expect(file?.constantPool.namespaces[1]).toEqual({ kind: 0x16, name: 3 });
24
+ expect(file?.constantPool.namespaceSets[1]).toEqual([1]);
25
+
26
+ const qualified = file!.constantPool.multinames[1];
27
+ expect(qualified.kind).toBe(AbcMultinameKind.QName);
28
+ expect(qualified.namespace).toBe(1);
29
+ expect(file?.constantPool.strings[qualified.name]).toBe('Main');
30
+
31
+ const multiname = file!.constantPool.multinames[2];
32
+ expect(multiname.kind).toBe(AbcMultinameKind.Multiname);
33
+ expect(file?.constantPool.strings[multiname.name]).toBe('stop');
34
+ expect(multiname.namespaceSet).toBe(1);
35
+ });
36
+
37
+ it('reads methods with their optional defaults and parameter names', () => {
38
+ const file = readAbcFile(buildAbc());
39
+
40
+ expect(file?.methods).toHaveLength(2);
41
+ expect(file?.methods[0]).toMatchObject({ name: 2, parameterTypes: [], returnType: 0 });
42
+ expect(file?.methods[1].optionalValues).toEqual([{ kind: 0x03, value: 1 }]);
43
+ expect(file?.methods[1].parameterNames).toEqual([1]);
44
+ });
45
+
46
+ it('reads instances and classes as parallel lists sharing one count', () => {
47
+ const file = readAbcFile(buildAbc());
48
+
49
+ expect(file?.instances).toHaveLength(1);
50
+ expect(file?.classes).toHaveLength(1);
51
+ expect(file?.instances[0]).toMatchObject({ initializer: 1, name: 1, superName: 1 });
52
+ expect(file?.instances[0].traits[0]).toMatchObject({ kind: AbcTraitKind.Method, methodIndex: 0 });
53
+ expect(file?.classes[0].initializer).toBe(0);
54
+ });
55
+
56
+ it('reads script and method-body tables, keeping instruction bytes unparsed', () => {
57
+ const file = readAbcFile(buildAbc());
58
+
59
+ expect(file?.scripts[0]).toMatchObject({ initializer: 0 });
60
+ expect(file?.methodBodies).toHaveLength(1);
61
+ const body = file!.methodBodies[0];
62
+ expect(body).toMatchObject({ localCount: 1, maxStack: 2, method: 0 });
63
+ // The instruction stream is handed back whole: decoding it needs an opcode table and is a later step.
64
+ expect([...body.code]).toEqual([0xd0, 0x30, 0x47]);
65
+ expect(body.exceptions).toEqual([]);
66
+ });
67
+
68
+ it('returns null rather than throwing for input that is not a readable container', () => {
69
+ expect(readAbcFile(new Uint8Array())).toBeNull();
70
+ expect(readAbcFile(new Uint8Array([0x10, 0x00, 0x2e, 0x00]))).toBeNull();
71
+ // Truncated part-way through the constant pool.
72
+ expect(readAbcFile(buildAbc().subarray(0, 12))).toBeNull();
73
+ });
74
+
75
+ it('rejects a multiname whose kind the format does not define', () => {
76
+ const bytes = buildAbc();
77
+ // Overwrite the first multiname's kind byte with one no version of the format uses.
78
+ const index = bytes.indexOf(AbcMultinameKind.QName, 20);
79
+ bytes[index] = 0x7f;
80
+
81
+ expect(readAbcFile(bytes)).toBeNull();
82
+ });
83
+ });
84
+
85
+ // Builds a small but structurally complete ABC file: three strings, one namespace and set, two multinames,
86
+ // two methods (one with an optional default and a parameter name), one class and instance with a method
87
+ // trait, one script, and one method body whose code is `getlocal_0; pushscope; returnvoid`.
88
+ function buildAbc(): Uint8Array {
89
+ const bytes: number[] = [];
90
+ const u8 = (value: number): void => void bytes.push(value & 0xff);
91
+ const u16 = (value: number): void => {
92
+ u8(value);
93
+ u8(value >> 8);
94
+ };
95
+ const u30 = (value: number): void => {
96
+ let remaining = value;
97
+ do {
98
+ const byte = remaining % 0x80;
99
+ remaining = Math.floor(remaining / 0x80);
100
+ u8(remaining > 0 ? byte | 0x80 : byte);
101
+ } while (remaining > 0);
102
+ };
103
+ const str = (value: string): void => {
104
+ const encoded = new TextEncoder().encode(value);
105
+ u30(encoded.length);
106
+ for (const byte of encoded) u8(byte);
107
+ };
108
+ const double = (value: number): void => {
109
+ const buffer = new ArrayBuffer(8);
110
+ new DataView(buffer).setFloat64(0, value, true);
111
+ for (const byte of new Uint8Array(buffer)) u8(byte);
112
+ };
113
+
114
+ u16(16); // minor version
115
+ u16(46); // major version
116
+
117
+ u30(2); // int pool: one entry after the reserved slot
118
+ // A signed constant is written as its full 32-bit two's complement in the same seven-bits-per-byte
119
+ // form, so -7 occupies five bytes rather than one.
120
+ u30(0xfffffff9);
121
+ u30(2); // uint pool
122
+ u30(9);
123
+ u30(2); // double pool
124
+ double(1.5);
125
+ u30(4); // string pool
126
+ str('Main');
127
+ str('stop');
128
+ str('flash.display');
129
+ u30(2); // namespace pool
130
+ u8(0x16);
131
+ u30(3);
132
+ u30(2); // namespace set pool
133
+ u30(1);
134
+ u30(1);
135
+ u30(3); // multiname pool
136
+ u8(AbcMultinameKind.QName);
137
+ u30(1);
138
+ u30(1);
139
+ u8(AbcMultinameKind.Multiname);
140
+ u30(2);
141
+ u30(1);
142
+
143
+ u30(2); // method count
144
+ u30(0); // no parameters
145
+ u30(0); // return type
146
+ u30(2); // name -> 'stop'
147
+ u8(0); // flags
148
+ u30(1); // one parameter
149
+ u30(0);
150
+ u30(1);
151
+ u30(1);
152
+ u8(0x08 | 0x80); // has optional defaults, has parameter names
153
+ u30(1);
154
+ u30(1); // optional value index
155
+ u8(0x03); // optional value kind
156
+ u30(1); // parameter name
157
+
158
+ u30(0); // metadata count
159
+
160
+ u30(1); // class count
161
+ u30(1); // instance name
162
+ u30(1); // super name
163
+ u8(0); // flags
164
+ u30(0); // interface count
165
+ u30(1); // instance initializer
166
+ u30(1); // trait count
167
+ u30(2); // trait name
168
+ u8(AbcTraitKind.Method);
169
+ u30(0); // dispatch id
170
+ u30(0); // method index
171
+ u30(0); // class initializer
172
+ u30(0); // class trait count
173
+
174
+ u30(1); // script count
175
+ u30(0); // script initializer
176
+ u30(0); // script trait count
177
+
178
+ u30(1); // method body count
179
+ u30(0); // method
180
+ u30(2); // max stack
181
+ u30(1); // local count
182
+ u30(1); // init scope depth
183
+ u30(2); // max scope depth
184
+ u30(3); // code length
185
+ u8(0xd0);
186
+ u8(0x30);
187
+ u8(0x47);
188
+ u30(0); // exception count
189
+ u30(0); // trait count
190
+
191
+ return new Uint8Array(bytes);
192
+ }