@swf2es/format 0.1.16 → 0.1.18
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.
- package/dist/abc-surface.d.ts +67 -0
- package/dist/abc-surface.d.ts.map +1 -0
- package/dist/abc-surface.js +398 -0
- package/dist/abc-surface.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/abc-surface.ts +554 -0
- package/src/index.ts +15 -3
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export interface Surface {
|
|
2
|
+
version: string;
|
|
3
|
+
scripts: Script[];
|
|
4
|
+
/** Methods with neither a trait nor a class to own them, such as closures. */
|
|
5
|
+
orphans: Method[];
|
|
6
|
+
}
|
|
7
|
+
export interface Script {
|
|
8
|
+
init: Method;
|
|
9
|
+
traits: Trait[];
|
|
10
|
+
}
|
|
11
|
+
export interface Class {
|
|
12
|
+
name: string;
|
|
13
|
+
super: string | null;
|
|
14
|
+
flags: string[];
|
|
15
|
+
protectedNs?: string;
|
|
16
|
+
interfaces: string[];
|
|
17
|
+
init: Method;
|
|
18
|
+
instance: Trait[];
|
|
19
|
+
classInit: Method;
|
|
20
|
+
static: Trait[];
|
|
21
|
+
}
|
|
22
|
+
export type Trait = {
|
|
23
|
+
kind: "slot" | "const";
|
|
24
|
+
name: string;
|
|
25
|
+
slot: number;
|
|
26
|
+
type: string;
|
|
27
|
+
value?: Value;
|
|
28
|
+
meta?: Meta[];
|
|
29
|
+
} | {
|
|
30
|
+
kind: "class";
|
|
31
|
+
name: string;
|
|
32
|
+
slot: number;
|
|
33
|
+
class: Class;
|
|
34
|
+
meta?: Meta[];
|
|
35
|
+
} | {
|
|
36
|
+
kind: "function";
|
|
37
|
+
name: string;
|
|
38
|
+
slot: number;
|
|
39
|
+
method: Method;
|
|
40
|
+
meta?: Meta[];
|
|
41
|
+
} | {
|
|
42
|
+
kind: "method" | "getter" | "setter";
|
|
43
|
+
name: string;
|
|
44
|
+
disp: number;
|
|
45
|
+
flags: string[];
|
|
46
|
+
method: Method;
|
|
47
|
+
meta?: Meta[];
|
|
48
|
+
};
|
|
49
|
+
export interface Method {
|
|
50
|
+
params: Param[];
|
|
51
|
+
returns: string;
|
|
52
|
+
flags: string[];
|
|
53
|
+
/** Code bytes in the method's body; absent for a native method or a declaration. */
|
|
54
|
+
code?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface Param {
|
|
57
|
+
type: string;
|
|
58
|
+
name?: string;
|
|
59
|
+
default?: Value;
|
|
60
|
+
}
|
|
61
|
+
/** A constant: its kind, then its value as the ABC spells it. */
|
|
62
|
+
export type Value = [string, string | number | boolean | null];
|
|
63
|
+
/** A metadata entry: its name and its [key, value] items, key "" for a bare value. */
|
|
64
|
+
export type Meta = [string, [string, string][]];
|
|
65
|
+
/** The surface of the ABC `bytes`. */
|
|
66
|
+
export declare function readSurface(bytes: Uint8Array): Surface;
|
|
67
|
+
//# sourceMappingURL=abc-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abc-surface.d.ts","sourceRoot":"","sources":["../src/abc-surface.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,KAAK,GACb;IACE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;CACf,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,GAC/E;IACE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;CACf,CAAC;AAEN,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,iEAAiE;AACjE,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAE/D,sFAAsF;AACtF,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAiQhD,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CA4NtD"}
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
// An ABC's surface: its scripts, classes, traits and method signatures, as
|
|
2
|
+
// a SWF linking against it sees them, without the code. Method bodies are
|
|
3
|
+
// only counted, so a library's AS3 can be told from its natives.
|
|
4
|
+
//
|
|
5
|
+
// The reader trusts its input: it is for ABCs avmplus accepts, such as
|
|
6
|
+
// builtin.abc and playerglobal.abc, not for checking malformed ones, which
|
|
7
|
+
// it reads as garbage or throws on. It imports nothing, so that node runs
|
|
8
|
+
// it as it is (tools/abc-surface/read.ts).
|
|
9
|
+
const NS_KINDS = {
|
|
10
|
+
5: "private",
|
|
11
|
+
8: "namespace",
|
|
12
|
+
22: "package",
|
|
13
|
+
23: "internal",
|
|
14
|
+
24: "protected",
|
|
15
|
+
25: "explicit",
|
|
16
|
+
26: "staticprotected",
|
|
17
|
+
};
|
|
18
|
+
const METHOD_FLAGS = [
|
|
19
|
+
[0x01, "arguments"],
|
|
20
|
+
[0x02, "activation"],
|
|
21
|
+
[0x04, "rest"],
|
|
22
|
+
[0x10, "ignorerest"],
|
|
23
|
+
[0x20, "native"],
|
|
24
|
+
[0x40, "dxns"],
|
|
25
|
+
];
|
|
26
|
+
const CLASS_FLAGS = [
|
|
27
|
+
[0x01, "sealed"],
|
|
28
|
+
[0x02, "final"],
|
|
29
|
+
[0x04, "interface"],
|
|
30
|
+
];
|
|
31
|
+
const TRAIT_KINDS = ["slot", "method", "getter", "setter", "class", "function", "const"];
|
|
32
|
+
class Reader {
|
|
33
|
+
at = 0;
|
|
34
|
+
bytes;
|
|
35
|
+
view;
|
|
36
|
+
constructor(bytes) {
|
|
37
|
+
this.bytes = bytes;
|
|
38
|
+
this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
39
|
+
}
|
|
40
|
+
u8() {
|
|
41
|
+
return this.bytes[this.at++];
|
|
42
|
+
}
|
|
43
|
+
u16() {
|
|
44
|
+
const v = this.view.getUint16(this.at, true);
|
|
45
|
+
this.at += 2;
|
|
46
|
+
return v;
|
|
47
|
+
}
|
|
48
|
+
u30() {
|
|
49
|
+
let v = 0;
|
|
50
|
+
for (let shift = 0; shift < 35; shift += 7) {
|
|
51
|
+
const b = this.bytes[this.at++];
|
|
52
|
+
v += (b & 0x7f) * 2 ** shift;
|
|
53
|
+
if (!(b & 0x80)) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return v >>> 0;
|
|
58
|
+
}
|
|
59
|
+
f32() {
|
|
60
|
+
const v = this.view.getFloat32(this.at, true);
|
|
61
|
+
this.at += 4;
|
|
62
|
+
return v;
|
|
63
|
+
}
|
|
64
|
+
d64() {
|
|
65
|
+
const v = this.view.getFloat64(this.at, true);
|
|
66
|
+
this.at += 8;
|
|
67
|
+
return v;
|
|
68
|
+
}
|
|
69
|
+
utf8(length) {
|
|
70
|
+
const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + length));
|
|
71
|
+
this.at += length;
|
|
72
|
+
return s;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Where the version mark avmplus appends to a builtin namespace's URI begins. */
|
|
76
|
+
const MIN_API_MARK = 0xe294;
|
|
77
|
+
/** A URI with its version mark, if any, spelt as "uri@v<api>". */
|
|
78
|
+
function uri(s) {
|
|
79
|
+
const last = s.codePointAt(s.length - 1) ?? 0;
|
|
80
|
+
if (s.length && last >= MIN_API_MARK && last <= 0xf8ff) {
|
|
81
|
+
return `${s.slice(0, -1)}@v${last - MIN_API_MARK}`;
|
|
82
|
+
}
|
|
83
|
+
return s;
|
|
84
|
+
}
|
|
85
|
+
function readPool(r, hasFloats) {
|
|
86
|
+
const count = () => Math.max(r.u30() - 1, 0);
|
|
87
|
+
const ints = [0];
|
|
88
|
+
for (let n = count(); n > 0; n--) {
|
|
89
|
+
ints.push(r.u30() | 0);
|
|
90
|
+
}
|
|
91
|
+
const uints = [0];
|
|
92
|
+
for (let n = count(); n > 0; n--) {
|
|
93
|
+
uints.push(r.u30());
|
|
94
|
+
}
|
|
95
|
+
const doubles = [Number.NaN];
|
|
96
|
+
for (let n = count(); n > 0; n--) {
|
|
97
|
+
doubles.push(r.d64());
|
|
98
|
+
}
|
|
99
|
+
// AIR's float ABCs (47.16 on) have a pool of floats next, as codegen reads them.
|
|
100
|
+
const floats = [Number.NaN];
|
|
101
|
+
if (hasFloats) {
|
|
102
|
+
for (let n = count(); n > 0; n--) {
|
|
103
|
+
floats.push(r.f32());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const strings = [""];
|
|
107
|
+
for (let n = count(); n > 0; n--) {
|
|
108
|
+
strings.push(r.utf8(r.u30()));
|
|
109
|
+
}
|
|
110
|
+
// Each private namespace is its own, whatever its name: number them.
|
|
111
|
+
const namespaces = ["*"];
|
|
112
|
+
let privates = 0;
|
|
113
|
+
for (let n = count(); n > 0; n--) {
|
|
114
|
+
const kind = r.u8();
|
|
115
|
+
const name = uri(strings[r.u30()]);
|
|
116
|
+
const k = NS_KINDS[kind] ?? `ns${kind}`;
|
|
117
|
+
namespaces.push(kind === 0x05 ? `private#${privates++}:${name}` : `${k}:${name}`);
|
|
118
|
+
}
|
|
119
|
+
const nsSets = [[]];
|
|
120
|
+
for (let n = count(); n > 0; n--) {
|
|
121
|
+
const set = [];
|
|
122
|
+
for (let m = r.u30(); m > 0; m--) {
|
|
123
|
+
set.push(namespaces[r.u30()]);
|
|
124
|
+
}
|
|
125
|
+
nsSets.push(set);
|
|
126
|
+
}
|
|
127
|
+
const names = ["*"];
|
|
128
|
+
for (let n = count(); n > 0; n--) {
|
|
129
|
+
names.push(readName(r, strings, namespaces, nsSets));
|
|
130
|
+
}
|
|
131
|
+
return { ints, uints, doubles, floats, strings, namespaces, nsSets, names };
|
|
132
|
+
}
|
|
133
|
+
function readName(r, strings, namespaces, nsSets) {
|
|
134
|
+
const kind = r.u8();
|
|
135
|
+
switch (kind) {
|
|
136
|
+
case 0x07:
|
|
137
|
+
case 0x0d: {
|
|
138
|
+
const ns = namespaces[r.u30()];
|
|
139
|
+
return qualified(ns, strings[r.u30()]);
|
|
140
|
+
}
|
|
141
|
+
case 0x0f:
|
|
142
|
+
case 0x10:
|
|
143
|
+
return `(rt)::${strings[r.u30()]}`;
|
|
144
|
+
case 0x11:
|
|
145
|
+
case 0x12:
|
|
146
|
+
return "(rt)::(late)";
|
|
147
|
+
case 0x09:
|
|
148
|
+
case 0x0e: {
|
|
149
|
+
const name = strings[r.u30()];
|
|
150
|
+
return `{${nsSets[r.u30()].join(",")}}::${name}`;
|
|
151
|
+
}
|
|
152
|
+
case 0x1b:
|
|
153
|
+
case 0x1c:
|
|
154
|
+
return `{${nsSets[r.u30()].join(",")}}::(late)`;
|
|
155
|
+
case 0x1d: {
|
|
156
|
+
const base = r.u30();
|
|
157
|
+
const params = [];
|
|
158
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
159
|
+
params.push(r.u30());
|
|
160
|
+
}
|
|
161
|
+
// A type name may name a later entry: resolve it once the pool is read.
|
|
162
|
+
return `${base}.<${params.join(",")}>`;
|
|
163
|
+
}
|
|
164
|
+
default:
|
|
165
|
+
throw new Error(`multiname kind ${kind} at ${r.at - 1}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* A QName as a type is written: "Array" or "flash.utils::ByteArray" in a
|
|
170
|
+
* public namespace without a version mark, else "{ns}::name" as a
|
|
171
|
+
* multiname with its one namespace.
|
|
172
|
+
*/
|
|
173
|
+
function qualified(ns, name) {
|
|
174
|
+
if (ns.startsWith("package:") && !ns.includes("@v")) {
|
|
175
|
+
const pkg = ns.slice("package:".length);
|
|
176
|
+
return pkg ? `${pkg}::${name}` : name;
|
|
177
|
+
}
|
|
178
|
+
return `{${ns}}::${name}`;
|
|
179
|
+
}
|
|
180
|
+
/** The pool's type names, read as indices, written out by name. */
|
|
181
|
+
function resolveTypeNames(pool) {
|
|
182
|
+
for (let i = 0; i < pool.names.length; i++) {
|
|
183
|
+
const m = pool.names[i].match(/^(\d+)\.<([\d,]*)>$/);
|
|
184
|
+
if (m) {
|
|
185
|
+
const params = m[2] ? m[2].split(",").map((p) => pool.names[Number(p)]) : [];
|
|
186
|
+
pool.names[i] = `${pool.names[Number(m[1])]}.<${params.join(",")}>`;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function value(pool, index, kind) {
|
|
191
|
+
switch (kind) {
|
|
192
|
+
case 0x00:
|
|
193
|
+
return ["undefined", null];
|
|
194
|
+
case 0x01:
|
|
195
|
+
return ["string", pool.strings[index]];
|
|
196
|
+
case 0x03:
|
|
197
|
+
return ["int", pool.ints[index]];
|
|
198
|
+
case 0x04:
|
|
199
|
+
return ["uint", pool.uints[index]];
|
|
200
|
+
case 0x02:
|
|
201
|
+
case 0x06: {
|
|
202
|
+
const d = kind === 0x02 ? pool.floats[index] : pool.doubles[index];
|
|
203
|
+
// JSON has no NaN or infinities, and -0 would print as 0.
|
|
204
|
+
const finite = Number.isFinite(d) && !Object.is(d, -0);
|
|
205
|
+
return [kind === 0x02 ? "float" : "double", finite ? d : String(d === 0 ? "-0" : d)];
|
|
206
|
+
}
|
|
207
|
+
case 0x0a:
|
|
208
|
+
return ["boolean", false];
|
|
209
|
+
case 0x0b:
|
|
210
|
+
return ["boolean", true];
|
|
211
|
+
case 0x0c:
|
|
212
|
+
return ["null", null];
|
|
213
|
+
default:
|
|
214
|
+
return ["namespace", pool.namespaces[index]];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function flags(bits, table) {
|
|
218
|
+
return table.filter(([bit]) => bits & bit).map(([, name]) => name);
|
|
219
|
+
}
|
|
220
|
+
/** The surface of the ABC `bytes`. */
|
|
221
|
+
export function readSurface(bytes) {
|
|
222
|
+
const r = new Reader(bytes);
|
|
223
|
+
const minor = r.u16();
|
|
224
|
+
const major = r.u16();
|
|
225
|
+
const pool = readPool(r, major === 47 && minor >= 16);
|
|
226
|
+
resolveTypeNames(pool);
|
|
227
|
+
const typeName = (i) => pool.names[i];
|
|
228
|
+
const methods = [];
|
|
229
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
230
|
+
const count = r.u30();
|
|
231
|
+
const returns = typeName(r.u30());
|
|
232
|
+
const params = [];
|
|
233
|
+
for (let i = 0; i < count; i++) {
|
|
234
|
+
params.push({ type: typeName(r.u30()) });
|
|
235
|
+
}
|
|
236
|
+
r.u30(); // The method's name, which nothing linking against it sees.
|
|
237
|
+
const bits = r.u8();
|
|
238
|
+
if (bits & 0x08) {
|
|
239
|
+
const optional = r.u30();
|
|
240
|
+
for (let i = count - optional; i < count; i++) {
|
|
241
|
+
const index = r.u30();
|
|
242
|
+
params[i].default = value(pool, index, r.u8());
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (bits & 0x80) {
|
|
246
|
+
for (const p of params) {
|
|
247
|
+
p.name = pool.strings[r.u30()];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
methods.push({ params, returns, flags: flags(bits, METHOD_FLAGS) });
|
|
251
|
+
}
|
|
252
|
+
const metadata = [];
|
|
253
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
254
|
+
const name = pool.strings[r.u30()];
|
|
255
|
+
const count = r.u30();
|
|
256
|
+
const keys = [];
|
|
257
|
+
for (let i = 0; i < count; i++) {
|
|
258
|
+
keys.push(pool.strings[r.u30()]);
|
|
259
|
+
}
|
|
260
|
+
const items = keys.map((k) => [k, pool.strings[r.u30()]]);
|
|
261
|
+
metadata.push([name, items]);
|
|
262
|
+
}
|
|
263
|
+
const used = new Set();
|
|
264
|
+
const method = (i) => {
|
|
265
|
+
used.add(i);
|
|
266
|
+
return methods[i];
|
|
267
|
+
};
|
|
268
|
+
const readTraits = () => {
|
|
269
|
+
const traits = [];
|
|
270
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
271
|
+
const name = pool.names[r.u30()];
|
|
272
|
+
const tag = r.u8();
|
|
273
|
+
const kind = tag & 0x0f;
|
|
274
|
+
const t = {
|
|
275
|
+
name,
|
|
276
|
+
kind,
|
|
277
|
+
attrs: tag >> 4,
|
|
278
|
+
a: r.u30(),
|
|
279
|
+
b: r.u30(),
|
|
280
|
+
c: 0,
|
|
281
|
+
d: 0,
|
|
282
|
+
meta: [],
|
|
283
|
+
};
|
|
284
|
+
if (kind === 0 || kind === 6) {
|
|
285
|
+
t.c = r.u30();
|
|
286
|
+
if (t.c) {
|
|
287
|
+
t.d = r.u8();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (tag & 0x40) {
|
|
291
|
+
for (let m = r.u30(); m > 0; m--) {
|
|
292
|
+
t.meta.push(r.u30());
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
traits.push(t);
|
|
296
|
+
}
|
|
297
|
+
return traits;
|
|
298
|
+
};
|
|
299
|
+
const classCount = r.u30();
|
|
300
|
+
const instances = [];
|
|
301
|
+
for (let i = 0; i < classCount; i++) {
|
|
302
|
+
const name = pool.names[r.u30()];
|
|
303
|
+
const sup = r.u30();
|
|
304
|
+
const bits = r.u8();
|
|
305
|
+
const protectedNs = bits & 0x08 ? pool.namespaces[r.u30()] : undefined;
|
|
306
|
+
const interfaces = [];
|
|
307
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
308
|
+
interfaces.push(pool.names[r.u30()]);
|
|
309
|
+
}
|
|
310
|
+
const init = r.u30();
|
|
311
|
+
instances.push({
|
|
312
|
+
name,
|
|
313
|
+
super: sup ? pool.names[sup] : null,
|
|
314
|
+
flags: flags(bits, CLASS_FLAGS),
|
|
315
|
+
protectedNs,
|
|
316
|
+
interfaces,
|
|
317
|
+
init,
|
|
318
|
+
traits: readTraits(),
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
const statics = [];
|
|
322
|
+
for (let i = 0; i < classCount; i++) {
|
|
323
|
+
statics.push({ init: r.u30(), traits: readTraits() });
|
|
324
|
+
}
|
|
325
|
+
const rawScripts = [];
|
|
326
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
327
|
+
rawScripts.push({ init: r.u30(), traits: readTraits() });
|
|
328
|
+
}
|
|
329
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
330
|
+
const m = r.u30();
|
|
331
|
+
r.u30(); // max_stack
|
|
332
|
+
r.u30(); // local_count
|
|
333
|
+
r.u30(); // init_scope_depth
|
|
334
|
+
r.u30(); // max_scope_depth
|
|
335
|
+
const length = r.u30();
|
|
336
|
+
r.at += length;
|
|
337
|
+
for (let e = r.u30(); e > 0; e--) {
|
|
338
|
+
r.u30();
|
|
339
|
+
r.u30();
|
|
340
|
+
r.u30();
|
|
341
|
+
r.u30();
|
|
342
|
+
r.u30();
|
|
343
|
+
}
|
|
344
|
+
readTraits(); // An activation's traits, inside the method.
|
|
345
|
+
methods[m] = { ...methods[m], code: length };
|
|
346
|
+
}
|
|
347
|
+
const meta = (indices) => indices.length ? indices.map((i) => metadata[i]) : undefined;
|
|
348
|
+
const buildClass = (i) => {
|
|
349
|
+
const inst = instances[i];
|
|
350
|
+
return {
|
|
351
|
+
name: inst.name,
|
|
352
|
+
super: inst.super,
|
|
353
|
+
flags: inst.flags,
|
|
354
|
+
...(inst.protectedNs ? { protectedNs: inst.protectedNs } : {}),
|
|
355
|
+
interfaces: inst.interfaces,
|
|
356
|
+
init: method(inst.init),
|
|
357
|
+
instance: inst.traits.map(build),
|
|
358
|
+
classInit: method(statics[i].init),
|
|
359
|
+
static: statics[i].traits.map(build),
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
function build(t) {
|
|
363
|
+
const m = meta(t.meta);
|
|
364
|
+
const withMeta = m ? { meta: m } : {};
|
|
365
|
+
switch (t.kind) {
|
|
366
|
+
case 0:
|
|
367
|
+
case 6:
|
|
368
|
+
return {
|
|
369
|
+
kind: t.kind === 0 ? "slot" : "const",
|
|
370
|
+
name: t.name,
|
|
371
|
+
slot: t.a,
|
|
372
|
+
type: typeName(t.b),
|
|
373
|
+
...(t.c ? { value: value(pool, t.c, t.d) } : {}),
|
|
374
|
+
...withMeta,
|
|
375
|
+
};
|
|
376
|
+
case 4:
|
|
377
|
+
return { kind: "class", name: t.name, slot: t.a, class: buildClass(t.b), ...withMeta };
|
|
378
|
+
case 5:
|
|
379
|
+
return { kind: "function", name: t.name, slot: t.a, method: method(t.b), ...withMeta };
|
|
380
|
+
default:
|
|
381
|
+
return {
|
|
382
|
+
kind: TRAIT_KINDS[t.kind],
|
|
383
|
+
name: t.name,
|
|
384
|
+
disp: t.a,
|
|
385
|
+
flags: flags(t.attrs, [
|
|
386
|
+
[0x1, "final"],
|
|
387
|
+
[0x2, "override"],
|
|
388
|
+
]),
|
|
389
|
+
method: method(t.b),
|
|
390
|
+
...withMeta,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
const scripts = rawScripts.map((s) => ({ init: method(s.init), traits: s.traits.map(build) }));
|
|
395
|
+
const orphans = methods.filter((_, i) => !used.has(i));
|
|
396
|
+
return { version: `${major}.${minor}`, scripts, orphans };
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=abc-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abc-surface.js","sourceRoot":"","sources":["../src/abc-surface.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parsers for the SWF container and its tags: shapes, fonts, text, bitmaps,
|
|
3
3
|
* sounds, buttons and filters, a DoABC's bytes, which codegen parses, and
|
|
4
|
-
* the AVM1 action blocks, which it compiles;
|
|
5
|
-
*
|
|
6
|
-
* descriptor, and the ZIP
|
|
4
|
+
* the AVM1 action blocks, which it compiles; an ABC's declarations without
|
|
5
|
+
* its code; and Pixel Bender's bytecode, which a script hands
|
|
6
|
+
* flash.display.Shader. Also an AIR application's descriptor, and the ZIP
|
|
7
|
+
* archives AIR packages are.
|
|
7
8
|
* The compiler and the player both use this package, so it must stay free of
|
|
8
9
|
* DOM and node APIs.
|
|
9
10
|
*/
|
|
10
11
|
export { abcReferences } from "./abc-names.js";
|
|
12
|
+
export { type Class as AbcClass, type Meta as AbcMeta, type Method as AbcMethod, type Param as AbcParam, readSurface as readAbcSurface, type Script as AbcScript, type Surface as AbcSurface, type Trait as AbcTrait, type Value as AbcValue, } from "./abc-surface.js";
|
|
11
13
|
export { type ActionBlock, type ActionList, type ActionOwner, ButtonCondition, ClipEvent, readActions, } from "./actions.js";
|
|
12
14
|
export { type AirDescriptor, readAirDescriptor } from "./air-descriptor.js";
|
|
13
15
|
export { AIR_API_VERSION, API_VERSION, checkApiVersion } from "./api-versions.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parsers for the SWF container and its tags: shapes, fonts, text, bitmaps,
|
|
3
3
|
* sounds, buttons and filters, a DoABC's bytes, which codegen parses, and
|
|
4
|
-
* the AVM1 action blocks, which it compiles;
|
|
5
|
-
*
|
|
6
|
-
* descriptor, and the ZIP
|
|
4
|
+
* the AVM1 action blocks, which it compiles; an ABC's declarations without
|
|
5
|
+
* its code; and Pixel Bender's bytecode, which a script hands
|
|
6
|
+
* flash.display.Shader. Also an AIR application's descriptor, and the ZIP
|
|
7
|
+
* archives AIR packages are.
|
|
7
8
|
* The compiler and the player both use this package, so it must stay free of
|
|
8
9
|
* DOM and node APIs.
|
|
9
10
|
*/
|
|
10
11
|
export { abcReferences } from "./abc-names.js";
|
|
12
|
+
export { readSurface as readAbcSurface, } from "./abc-surface.js";
|
|
11
13
|
export { ButtonCondition, ClipEvent, readActions, } from "./actions.js";
|
|
12
14
|
export { readAirDescriptor } from "./air-descriptor.js";
|
|
13
15
|
export { AIR_API_VERSION, API_VERSION, checkApiVersion } from "./api-versions.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAKL,WAAW,IAAI,cAAc,GAK9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,eAAe,EACf,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAe,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,EAGT,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,uBAAuB,EAEvB,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,cAAc,EACd,SAAS,EACT,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,eAAe,GAEhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAoB,WAAW,EAAkB,MAAM,cAAc,CAAC;AAC7E,OAAO,EAKL,OAAO,EACP,QAAQ,EACR,SAAS,EACT,kBAAkB,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EAET,QAAQ,EAMR,KAAK,EAOL,YAAY,EACZ,OAAO,GACR,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,QAAQ,EAIR,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,SAAS,GAGV,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,eAAe,EACf,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GAOf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,KAAK,EAEL,OAAO,EACP,aAAa,EACb,QAAQ,EAIR,SAAS,GAEV,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAIL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,cAAc,GAGf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAAiB,QAAQ,EAAE,MAAM,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swf2es/format",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "SWF, ABC and AVM1 action parsers shared by the compiler and the player",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"swf",
|
|
@@ -31,6 +31,6 @@
|
|
|
31
31
|
"LICENSE.third-party"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@swf2es/native": "0.1.
|
|
34
|
+
"@swf2es/native": "0.1.18"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
// An ABC's surface: its scripts, classes, traits and method signatures, as
|
|
2
|
+
// a SWF linking against it sees them, without the code. Method bodies are
|
|
3
|
+
// only counted, so a library's AS3 can be told from its natives.
|
|
4
|
+
//
|
|
5
|
+
// The reader trusts its input: it is for ABCs avmplus accepts, such as
|
|
6
|
+
// builtin.abc and playerglobal.abc, not for checking malformed ones, which
|
|
7
|
+
// it reads as garbage or throws on. It imports nothing, so that node runs
|
|
8
|
+
// it as it is (tools/abc-surface/read.ts).
|
|
9
|
+
|
|
10
|
+
declare class TextDecoder {
|
|
11
|
+
decode(input: Uint8Array): string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface Surface {
|
|
15
|
+
version: string;
|
|
16
|
+
scripts: Script[];
|
|
17
|
+
/** Methods with neither a trait nor a class to own them, such as closures. */
|
|
18
|
+
orphans: Method[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface Script {
|
|
22
|
+
init: Method;
|
|
23
|
+
traits: Trait[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Class {
|
|
27
|
+
name: string;
|
|
28
|
+
super: string | null;
|
|
29
|
+
flags: string[];
|
|
30
|
+
protectedNs?: string;
|
|
31
|
+
interfaces: string[];
|
|
32
|
+
init: Method;
|
|
33
|
+
instance: Trait[];
|
|
34
|
+
classInit: Method;
|
|
35
|
+
static: Trait[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type Trait =
|
|
39
|
+
| {
|
|
40
|
+
kind: "slot" | "const";
|
|
41
|
+
name: string;
|
|
42
|
+
slot: number;
|
|
43
|
+
type: string;
|
|
44
|
+
value?: Value;
|
|
45
|
+
meta?: Meta[];
|
|
46
|
+
}
|
|
47
|
+
| { kind: "class"; name: string; slot: number; class: Class; meta?: Meta[] }
|
|
48
|
+
| { kind: "function"; name: string; slot: number; method: Method; meta?: Meta[] }
|
|
49
|
+
| {
|
|
50
|
+
kind: "method" | "getter" | "setter";
|
|
51
|
+
name: string;
|
|
52
|
+
disp: number;
|
|
53
|
+
flags: string[];
|
|
54
|
+
method: Method;
|
|
55
|
+
meta?: Meta[];
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export interface Method {
|
|
59
|
+
params: Param[];
|
|
60
|
+
returns: string;
|
|
61
|
+
flags: string[];
|
|
62
|
+
/** Code bytes in the method's body; absent for a native method or a declaration. */
|
|
63
|
+
code?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface Param {
|
|
67
|
+
type: string;
|
|
68
|
+
name?: string;
|
|
69
|
+
default?: Value;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A constant: its kind, then its value as the ABC spells it. */
|
|
73
|
+
export type Value = [string, string | number | boolean | null];
|
|
74
|
+
|
|
75
|
+
/** A metadata entry: its name and its [key, value] items, key "" for a bare value. */
|
|
76
|
+
export type Meta = [string, [string, string][]];
|
|
77
|
+
|
|
78
|
+
const NS_KINDS: Record<number, string> = {
|
|
79
|
+
5: "private",
|
|
80
|
+
8: "namespace",
|
|
81
|
+
22: "package",
|
|
82
|
+
23: "internal",
|
|
83
|
+
24: "protected",
|
|
84
|
+
25: "explicit",
|
|
85
|
+
26: "staticprotected",
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const METHOD_FLAGS: [number, string][] = [
|
|
89
|
+
[0x01, "arguments"],
|
|
90
|
+
[0x02, "activation"],
|
|
91
|
+
[0x04, "rest"],
|
|
92
|
+
[0x10, "ignorerest"],
|
|
93
|
+
[0x20, "native"],
|
|
94
|
+
[0x40, "dxns"],
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
const CLASS_FLAGS: [number, string][] = [
|
|
98
|
+
[0x01, "sealed"],
|
|
99
|
+
[0x02, "final"],
|
|
100
|
+
[0x04, "interface"],
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
const TRAIT_KINDS = ["slot", "method", "getter", "setter", "class", "function", "const"];
|
|
104
|
+
|
|
105
|
+
interface Pool {
|
|
106
|
+
ints: number[];
|
|
107
|
+
uints: number[];
|
|
108
|
+
doubles: number[];
|
|
109
|
+
floats: number[];
|
|
110
|
+
strings: string[];
|
|
111
|
+
namespaces: string[];
|
|
112
|
+
nsSets: string[][];
|
|
113
|
+
names: string[];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
class Reader {
|
|
117
|
+
at = 0;
|
|
118
|
+
private readonly bytes: Uint8Array;
|
|
119
|
+
private readonly view: DataView;
|
|
120
|
+
|
|
121
|
+
constructor(bytes: Uint8Array) {
|
|
122
|
+
this.bytes = bytes;
|
|
123
|
+
this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
u8(): number {
|
|
127
|
+
return this.bytes[this.at++];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
u16(): number {
|
|
131
|
+
const v = this.view.getUint16(this.at, true);
|
|
132
|
+
this.at += 2;
|
|
133
|
+
return v;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
u30(): number {
|
|
137
|
+
let v = 0;
|
|
138
|
+
for (let shift = 0; shift < 35; shift += 7) {
|
|
139
|
+
const b = this.bytes[this.at++];
|
|
140
|
+
v += (b & 0x7f) * 2 ** shift;
|
|
141
|
+
if (!(b & 0x80)) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return v >>> 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
f32(): number {
|
|
150
|
+
const v = this.view.getFloat32(this.at, true);
|
|
151
|
+
this.at += 4;
|
|
152
|
+
return v;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
d64(): number {
|
|
156
|
+
const v = this.view.getFloat64(this.at, true);
|
|
157
|
+
this.at += 8;
|
|
158
|
+
return v;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
utf8(length: number): string {
|
|
162
|
+
const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + length));
|
|
163
|
+
this.at += length;
|
|
164
|
+
return s;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Where the version mark avmplus appends to a builtin namespace's URI begins. */
|
|
169
|
+
const MIN_API_MARK = 0xe294;
|
|
170
|
+
|
|
171
|
+
/** A URI with its version mark, if any, spelt as "uri@v<api>". */
|
|
172
|
+
function uri(s: string): string {
|
|
173
|
+
const last = s.codePointAt(s.length - 1) ?? 0;
|
|
174
|
+
if (s.length && last >= MIN_API_MARK && last <= 0xf8ff) {
|
|
175
|
+
return `${s.slice(0, -1)}@v${last - MIN_API_MARK}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return s;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function readPool(r: Reader, hasFloats: boolean): Pool {
|
|
182
|
+
const count = () => Math.max(r.u30() - 1, 0);
|
|
183
|
+
const ints = [0];
|
|
184
|
+
for (let n = count(); n > 0; n--) {
|
|
185
|
+
ints.push(r.u30() | 0);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const uints = [0];
|
|
189
|
+
for (let n = count(); n > 0; n--) {
|
|
190
|
+
uints.push(r.u30());
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const doubles = [Number.NaN];
|
|
194
|
+
for (let n = count(); n > 0; n--) {
|
|
195
|
+
doubles.push(r.d64());
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// AIR's float ABCs (47.16 on) have a pool of floats next, as codegen reads them.
|
|
199
|
+
const floats = [Number.NaN];
|
|
200
|
+
if (hasFloats) {
|
|
201
|
+
for (let n = count(); n > 0; n--) {
|
|
202
|
+
floats.push(r.f32());
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const strings = [""];
|
|
207
|
+
for (let n = count(); n > 0; n--) {
|
|
208
|
+
strings.push(r.utf8(r.u30()));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Each private namespace is its own, whatever its name: number them.
|
|
212
|
+
const namespaces = ["*"];
|
|
213
|
+
let privates = 0;
|
|
214
|
+
for (let n = count(); n > 0; n--) {
|
|
215
|
+
const kind = r.u8();
|
|
216
|
+
const name = uri(strings[r.u30()]);
|
|
217
|
+
const k = NS_KINDS[kind] ?? `ns${kind}`;
|
|
218
|
+
namespaces.push(kind === 0x05 ? `private#${privates++}:${name}` : `${k}:${name}`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const nsSets: string[][] = [[]];
|
|
222
|
+
for (let n = count(); n > 0; n--) {
|
|
223
|
+
const set: string[] = [];
|
|
224
|
+
for (let m = r.u30(); m > 0; m--) {
|
|
225
|
+
set.push(namespaces[r.u30()]);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
nsSets.push(set);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const names = ["*"];
|
|
232
|
+
for (let n = count(); n > 0; n--) {
|
|
233
|
+
names.push(readName(r, strings, namespaces, nsSets));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return { ints, uints, doubles, floats, strings, namespaces, nsSets, names };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function readName(r: Reader, strings: string[], namespaces: string[], nsSets: string[][]): string {
|
|
240
|
+
const kind = r.u8();
|
|
241
|
+
switch (kind) {
|
|
242
|
+
case 0x07:
|
|
243
|
+
case 0x0d: {
|
|
244
|
+
const ns = namespaces[r.u30()];
|
|
245
|
+
return qualified(ns, strings[r.u30()]);
|
|
246
|
+
}
|
|
247
|
+
case 0x0f:
|
|
248
|
+
case 0x10:
|
|
249
|
+
return `(rt)::${strings[r.u30()]}`;
|
|
250
|
+
case 0x11:
|
|
251
|
+
case 0x12:
|
|
252
|
+
return "(rt)::(late)";
|
|
253
|
+
case 0x09:
|
|
254
|
+
case 0x0e: {
|
|
255
|
+
const name = strings[r.u30()];
|
|
256
|
+
return `{${nsSets[r.u30()].join(",")}}::${name}`;
|
|
257
|
+
}
|
|
258
|
+
case 0x1b:
|
|
259
|
+
case 0x1c:
|
|
260
|
+
return `{${nsSets[r.u30()].join(",")}}::(late)`;
|
|
261
|
+
case 0x1d: {
|
|
262
|
+
const base = r.u30();
|
|
263
|
+
const params: number[] = [];
|
|
264
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
265
|
+
params.push(r.u30());
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// A type name may name a later entry: resolve it once the pool is read.
|
|
269
|
+
return `${base}.<${params.join(",")}>`;
|
|
270
|
+
}
|
|
271
|
+
default:
|
|
272
|
+
throw new Error(`multiname kind ${kind} at ${r.at - 1}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* A QName as a type is written: "Array" or "flash.utils::ByteArray" in a
|
|
278
|
+
* public namespace without a version mark, else "{ns}::name" as a
|
|
279
|
+
* multiname with its one namespace.
|
|
280
|
+
*/
|
|
281
|
+
function qualified(ns: string, name: string): string {
|
|
282
|
+
if (ns.startsWith("package:") && !ns.includes("@v")) {
|
|
283
|
+
const pkg = ns.slice("package:".length);
|
|
284
|
+
return pkg ? `${pkg}::${name}` : name;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return `{${ns}}::${name}`;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** The pool's type names, read as indices, written out by name. */
|
|
291
|
+
function resolveTypeNames(pool: Pool): void {
|
|
292
|
+
for (let i = 0; i < pool.names.length; i++) {
|
|
293
|
+
const m = pool.names[i].match(/^(\d+)\.<([\d,]*)>$/);
|
|
294
|
+
if (m) {
|
|
295
|
+
const params = m[2] ? m[2].split(",").map((p) => pool.names[Number(p)]) : [];
|
|
296
|
+
pool.names[i] = `${pool.names[Number(m[1])]}.<${params.join(",")}>`;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function value(pool: Pool, index: number, kind: number): Value {
|
|
302
|
+
switch (kind) {
|
|
303
|
+
case 0x00:
|
|
304
|
+
return ["undefined", null];
|
|
305
|
+
case 0x01:
|
|
306
|
+
return ["string", pool.strings[index]];
|
|
307
|
+
case 0x03:
|
|
308
|
+
return ["int", pool.ints[index]];
|
|
309
|
+
case 0x04:
|
|
310
|
+
return ["uint", pool.uints[index]];
|
|
311
|
+
case 0x02:
|
|
312
|
+
case 0x06: {
|
|
313
|
+
const d = kind === 0x02 ? pool.floats[index] : pool.doubles[index];
|
|
314
|
+
// JSON has no NaN or infinities, and -0 would print as 0.
|
|
315
|
+
const finite = Number.isFinite(d) && !Object.is(d, -0);
|
|
316
|
+
return [kind === 0x02 ? "float" : "double", finite ? d : String(d === 0 ? "-0" : d)];
|
|
317
|
+
}
|
|
318
|
+
case 0x0a:
|
|
319
|
+
return ["boolean", false];
|
|
320
|
+
case 0x0b:
|
|
321
|
+
return ["boolean", true];
|
|
322
|
+
case 0x0c:
|
|
323
|
+
return ["null", null];
|
|
324
|
+
default:
|
|
325
|
+
return ["namespace", pool.namespaces[index]];
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function flags(bits: number, table: [number, string][]): string[] {
|
|
330
|
+
return table.filter(([bit]) => bits & bit).map(([, name]) => name);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/** The surface of the ABC `bytes`. */
|
|
334
|
+
export function readSurface(bytes: Uint8Array): Surface {
|
|
335
|
+
const r = new Reader(bytes);
|
|
336
|
+
const minor = r.u16();
|
|
337
|
+
const major = r.u16();
|
|
338
|
+
const pool = readPool(r, major === 47 && minor >= 16);
|
|
339
|
+
resolveTypeNames(pool);
|
|
340
|
+
|
|
341
|
+
const typeName = (i: number) => pool.names[i];
|
|
342
|
+
|
|
343
|
+
const methods: Method[] = [];
|
|
344
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
345
|
+
const count = r.u30();
|
|
346
|
+
const returns = typeName(r.u30());
|
|
347
|
+
const params: Param[] = [];
|
|
348
|
+
for (let i = 0; i < count; i++) {
|
|
349
|
+
params.push({ type: typeName(r.u30()) });
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
r.u30(); // The method's name, which nothing linking against it sees.
|
|
353
|
+
const bits = r.u8();
|
|
354
|
+
if (bits & 0x08) {
|
|
355
|
+
const optional = r.u30();
|
|
356
|
+
for (let i = count - optional; i < count; i++) {
|
|
357
|
+
const index = r.u30();
|
|
358
|
+
params[i].default = value(pool, index, r.u8());
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (bits & 0x80) {
|
|
363
|
+
for (const p of params) {
|
|
364
|
+
p.name = pool.strings[r.u30()];
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
methods.push({ params, returns, flags: flags(bits, METHOD_FLAGS) });
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const metadata: Meta[] = [];
|
|
372
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
373
|
+
const name = pool.strings[r.u30()];
|
|
374
|
+
const count = r.u30();
|
|
375
|
+
const keys: string[] = [];
|
|
376
|
+
for (let i = 0; i < count; i++) {
|
|
377
|
+
keys.push(pool.strings[r.u30()]);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const items: [string, string][] = keys.map((k) => [k, pool.strings[r.u30()]]);
|
|
381
|
+
metadata.push([name, items]);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const used = new Set<number>();
|
|
385
|
+
const method = (i: number): Method => {
|
|
386
|
+
used.add(i);
|
|
387
|
+
return methods[i];
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
// Classes refer to one another through class traits, so read their traits
|
|
391
|
+
// as indices first and build the tree once the scripts are read.
|
|
392
|
+
type RawTrait = {
|
|
393
|
+
name: string;
|
|
394
|
+
kind: number;
|
|
395
|
+
attrs: number;
|
|
396
|
+
a: number;
|
|
397
|
+
b: number;
|
|
398
|
+
c: number;
|
|
399
|
+
d: number;
|
|
400
|
+
meta: number[];
|
|
401
|
+
};
|
|
402
|
+
const readTraits = (): RawTrait[] => {
|
|
403
|
+
const traits: RawTrait[] = [];
|
|
404
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
405
|
+
const name = pool.names[r.u30()];
|
|
406
|
+
const tag = r.u8();
|
|
407
|
+
const kind = tag & 0x0f;
|
|
408
|
+
const t: RawTrait = {
|
|
409
|
+
name,
|
|
410
|
+
kind,
|
|
411
|
+
attrs: tag >> 4,
|
|
412
|
+
a: r.u30(),
|
|
413
|
+
b: r.u30(),
|
|
414
|
+
c: 0,
|
|
415
|
+
d: 0,
|
|
416
|
+
meta: [],
|
|
417
|
+
};
|
|
418
|
+
if (kind === 0 || kind === 6) {
|
|
419
|
+
t.c = r.u30();
|
|
420
|
+
if (t.c) {
|
|
421
|
+
t.d = r.u8();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (tag & 0x40) {
|
|
426
|
+
for (let m = r.u30(); m > 0; m--) {
|
|
427
|
+
t.meta.push(r.u30());
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
traits.push(t);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
return traits;
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
const classCount = r.u30();
|
|
438
|
+
const instances: {
|
|
439
|
+
name: string;
|
|
440
|
+
super: string | null;
|
|
441
|
+
flags: string[];
|
|
442
|
+
protectedNs?: string;
|
|
443
|
+
interfaces: string[];
|
|
444
|
+
init: number;
|
|
445
|
+
traits: RawTrait[];
|
|
446
|
+
}[] = [];
|
|
447
|
+
for (let i = 0; i < classCount; i++) {
|
|
448
|
+
const name = pool.names[r.u30()];
|
|
449
|
+
const sup = r.u30();
|
|
450
|
+
const bits = r.u8();
|
|
451
|
+
const protectedNs = bits & 0x08 ? pool.namespaces[r.u30()] : undefined;
|
|
452
|
+
const interfaces: string[] = [];
|
|
453
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
454
|
+
interfaces.push(pool.names[r.u30()]);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const init = r.u30();
|
|
458
|
+
instances.push({
|
|
459
|
+
name,
|
|
460
|
+
super: sup ? pool.names[sup] : null,
|
|
461
|
+
flags: flags(bits, CLASS_FLAGS),
|
|
462
|
+
protectedNs,
|
|
463
|
+
interfaces,
|
|
464
|
+
init,
|
|
465
|
+
traits: readTraits(),
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const statics: { init: number; traits: RawTrait[] }[] = [];
|
|
470
|
+
for (let i = 0; i < classCount; i++) {
|
|
471
|
+
statics.push({ init: r.u30(), traits: readTraits() });
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
const rawScripts: { init: number; traits: RawTrait[] }[] = [];
|
|
475
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
476
|
+
rawScripts.push({ init: r.u30(), traits: readTraits() });
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
for (let n = r.u30(); n > 0; n--) {
|
|
480
|
+
const m = r.u30();
|
|
481
|
+
r.u30(); // max_stack
|
|
482
|
+
r.u30(); // local_count
|
|
483
|
+
r.u30(); // init_scope_depth
|
|
484
|
+
r.u30(); // max_scope_depth
|
|
485
|
+
const length = r.u30();
|
|
486
|
+
r.at += length;
|
|
487
|
+
for (let e = r.u30(); e > 0; e--) {
|
|
488
|
+
r.u30();
|
|
489
|
+
r.u30();
|
|
490
|
+
r.u30();
|
|
491
|
+
r.u30();
|
|
492
|
+
r.u30();
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
readTraits(); // An activation's traits, inside the method.
|
|
496
|
+
methods[m] = { ...methods[m], code: length };
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
const meta = (indices: number[]): Meta[] | undefined =>
|
|
500
|
+
indices.length ? indices.map((i) => metadata[i]) : undefined;
|
|
501
|
+
|
|
502
|
+
const buildClass = (i: number): Class => {
|
|
503
|
+
const inst = instances[i];
|
|
504
|
+
return {
|
|
505
|
+
name: inst.name,
|
|
506
|
+
super: inst.super,
|
|
507
|
+
flags: inst.flags,
|
|
508
|
+
...(inst.protectedNs ? { protectedNs: inst.protectedNs } : {}),
|
|
509
|
+
interfaces: inst.interfaces,
|
|
510
|
+
init: method(inst.init),
|
|
511
|
+
instance: inst.traits.map(build),
|
|
512
|
+
classInit: method(statics[i].init),
|
|
513
|
+
static: statics[i].traits.map(build),
|
|
514
|
+
};
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
function build(t: RawTrait): Trait {
|
|
518
|
+
const m = meta(t.meta);
|
|
519
|
+
const withMeta = m ? { meta: m } : {};
|
|
520
|
+
switch (t.kind) {
|
|
521
|
+
case 0:
|
|
522
|
+
case 6:
|
|
523
|
+
return {
|
|
524
|
+
kind: t.kind === 0 ? "slot" : "const",
|
|
525
|
+
name: t.name,
|
|
526
|
+
slot: t.a,
|
|
527
|
+
type: typeName(t.b),
|
|
528
|
+
...(t.c ? { value: value(pool, t.c, t.d) } : {}),
|
|
529
|
+
...withMeta,
|
|
530
|
+
};
|
|
531
|
+
case 4:
|
|
532
|
+
return { kind: "class", name: t.name, slot: t.a, class: buildClass(t.b), ...withMeta };
|
|
533
|
+
case 5:
|
|
534
|
+
return { kind: "function", name: t.name, slot: t.a, method: method(t.b), ...withMeta };
|
|
535
|
+
default:
|
|
536
|
+
return {
|
|
537
|
+
kind: TRAIT_KINDS[t.kind] as "method" | "getter" | "setter",
|
|
538
|
+
name: t.name,
|
|
539
|
+
disp: t.a,
|
|
540
|
+
flags: flags(t.attrs, [
|
|
541
|
+
[0x1, "final"],
|
|
542
|
+
[0x2, "override"],
|
|
543
|
+
]),
|
|
544
|
+
method: method(t.b),
|
|
545
|
+
...withMeta,
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const scripts = rawScripts.map((s) => ({ init: method(s.init), traits: s.traits.map(build) }));
|
|
551
|
+
|
|
552
|
+
const orphans = methods.filter((_, i) => !used.has(i));
|
|
553
|
+
return { version: `${major}.${minor}`, scripts, orphans };
|
|
554
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parsers for the SWF container and its tags: shapes, fonts, text, bitmaps,
|
|
3
3
|
* sounds, buttons and filters, a DoABC's bytes, which codegen parses, and
|
|
4
|
-
* the AVM1 action blocks, which it compiles;
|
|
5
|
-
*
|
|
6
|
-
* descriptor, and the ZIP
|
|
4
|
+
* the AVM1 action blocks, which it compiles; an ABC's declarations without
|
|
5
|
+
* its code; and Pixel Bender's bytecode, which a script hands
|
|
6
|
+
* flash.display.Shader. Also an AIR application's descriptor, and the ZIP
|
|
7
|
+
* archives AIR packages are.
|
|
7
8
|
* The compiler and the player both use this package, so it must stay free of
|
|
8
9
|
* DOM and node APIs.
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
export { abcReferences } from "./abc-names.js";
|
|
13
|
+
export {
|
|
14
|
+
type Class as AbcClass,
|
|
15
|
+
type Meta as AbcMeta,
|
|
16
|
+
type Method as AbcMethod,
|
|
17
|
+
type Param as AbcParam,
|
|
18
|
+
readSurface as readAbcSurface,
|
|
19
|
+
type Script as AbcScript,
|
|
20
|
+
type Surface as AbcSurface,
|
|
21
|
+
type Trait as AbcTrait,
|
|
22
|
+
type Value as AbcValue,
|
|
23
|
+
} from "./abc-surface.js";
|
|
12
24
|
export {
|
|
13
25
|
type ActionBlock,
|
|
14
26
|
type ActionList,
|