@swf2es/runtime 0.1.3 → 0.1.5
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/avm1/errors.d.ts +2 -1
- package/dist/avm1/errors.d.ts.map +1 -1
- package/dist/avm1/errors.js +1 -1
- package/dist/avm1/errors.js.map +1 -1
- package/dist/avm1/numbers.d.ts.map +1 -1
- package/dist/avm1/numbers.js +7 -8
- package/dist/avm1/numbers.js.map +1 -1
- package/dist/avm2/amf.d.ts.map +1 -1
- package/dist/avm2/amf.js +2 -1
- package/dist/avm2/amf.js.map +1 -1
- package/dist/avm2/names.d.ts +0 -4
- package/dist/avm2/names.d.ts.map +1 -1
- package/dist/avm2/names.js +0 -4
- package/dist/avm2/names.js.map +1 -1
- package/dist/avm2/natives/bytearray.d.ts +0 -7
- package/dist/avm2/natives/bytearray.d.ts.map +1 -1
- package/dist/avm2/natives/bytearray.js +6 -166
- package/dist/avm2/natives/bytearray.js.map +1 -1
- package/dist/avm2/natives/regexp.d.ts.map +1 -1
- package/dist/avm2/natives/regexp.js +68 -64
- package/dist/avm2/natives/regexp.js.map +1 -1
- package/dist/avm2/natives/shell-workers.js +1 -1
- package/dist/avm2/natives/shell-workers.js.map +1 -1
- package/dist/avm2/natives/shell.d.ts.map +1 -1
- package/dist/avm2/natives/shell.js +2 -1
- package/dist/avm2/natives/shell.js.map +1 -1
- package/dist/avm2/natives/xml/parser.d.ts +0 -2
- package/dist/avm2/natives/xml/parser.d.ts.map +1 -1
- package/dist/avm2/natives/xml/parser.js +2 -2
- package/dist/avm2/natives/xml/parser.js.map +1 -1
- package/dist/avm2/numbers.d.ts +0 -1
- package/dist/avm2/numbers.d.ts.map +1 -1
- package/dist/avm2/numbers.js +1 -1
- package/dist/avm2/numbers.js.map +1 -1
- package/dist/avm2/runtime.d.ts.map +1 -1
- package/dist/avm2/runtime.js +10 -8
- package/dist/avm2/runtime.js.map +1 -1
- package/dist/avm2/traits.d.ts +0 -12
- package/dist/avm2/traits.d.ts.map +1 -1
- package/dist/avm2/traits.js +1 -1
- package/dist/avm2/traits.js.map +1 -1
- package/dist/avm2/utf8.d.ts +10 -0
- package/dist/avm2/utf8.d.ts.map +1 -0
- package/dist/avm2/utf8.js +168 -0
- package/dist/avm2/utf8.js.map +1 -0
- package/package.json +2 -2
- package/src/avm1/errors.ts +1 -1
- package/src/avm1/numbers.ts +7 -10
- package/src/avm2/amf.ts +2 -1
- package/src/avm2/names.ts +0 -4
- package/src/avm2/natives/bytearray.ts +6 -193
- package/src/avm2/natives/regexp.ts +70 -68
- package/src/avm2/natives/shell-workers.ts +1 -1
- package/src/avm2/natives/shell.ts +1 -2
- package/src/avm2/natives/xml/parser.ts +2 -2
- package/src/avm2/numbers.ts +1 -1
- package/src/avm2/runtime.ts +10 -6
- package/src/avm2/traits.ts +1 -1
- package/src/avm2/utf8.ts +194 -0
|
@@ -12,8 +12,8 @@ export const TAG_TEXT = 3;
|
|
|
12
12
|
export const TAG_CDATA = 4;
|
|
13
13
|
export const TAG_PROCESSING_INSTRUCTION = 7;
|
|
14
14
|
export const TAG_COMMENT = 8;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const TAG_DOCTYPE = 10;
|
|
16
|
+
const TAG_XML_DECLARATION = 13;
|
|
17
17
|
|
|
18
18
|
// What getNext gives, as XMLParser's status codes: a tag, the end, or the
|
|
19
19
|
// error E4X throws for each (see PARSE_ERRORS in values.ts).
|
package/src/avm2/numbers.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Translated from avmplus' core/MathUtils.cpp and core/d2a.cpp, this file is
|
|
9
9
|
// subject to the Mozilla Public License, v. 2.0: http://mozilla.org/MPL/2.0/.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
const DTOSTR_NORMAL = 0;
|
|
12
12
|
export const DTOSTR_FIXED = 1;
|
|
13
13
|
export const DTOSTR_PRECISION = 2;
|
|
14
14
|
export const DTOSTR_EXPONENTIAL = 3;
|
package/src/avm2/runtime.ts
CHANGED
|
@@ -782,12 +782,16 @@ export class Runtime {
|
|
|
782
782
|
if (!traits) {
|
|
783
783
|
traits = this.builtinClass(name).$it as Traits;
|
|
784
784
|
this.builtinTraitsByName.set(name, traits);
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
785
|
+
switch (name) {
|
|
786
|
+
case "String":
|
|
787
|
+
this.stringTraits = traits;
|
|
788
|
+
break;
|
|
789
|
+
case "Number":
|
|
790
|
+
this.numberTraits = traits;
|
|
791
|
+
break;
|
|
792
|
+
case "Boolean":
|
|
793
|
+
this.booleanTraits = traits;
|
|
794
|
+
break;
|
|
791
795
|
}
|
|
792
796
|
}
|
|
793
797
|
|
package/src/avm2/traits.ts
CHANGED
|
@@ -546,7 +546,7 @@ const HOME_SLACK = 16;
|
|
|
546
546
|
* array through an accessor on the prototype (spilledSlot), so that what
|
|
547
547
|
* looks slots up by name finds them as any other.
|
|
548
548
|
*/
|
|
549
|
-
|
|
549
|
+
const SPILL_SLOTS = 900;
|
|
550
550
|
|
|
551
551
|
/** Slot `slot`'s accessor in `home`, a prototype of its objects: the object's `$S` at its place. */
|
|
552
552
|
function spilledSlot(home: AsObject, slot: number): void {
|
package/src/avm2/utf8.ts
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// UTF-8 as avmplus reads and writes it: an invalid byte reads as the
|
|
2
|
+
// character of its value, a lone surrogate writes as U+FFFD. ByteArray,
|
|
3
|
+
// AMF and the shell's natives share it.
|
|
4
|
+
//
|
|
5
|
+
// Translated from avmplus' core/UnicodeUtils.cpp, this file is subject to
|
|
6
|
+
// the Mozilla Public License, v. 2.0: http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
// TextEncoder is the web's and node's alike, though not ECMAScript's,
|
|
9
|
+
// whose library alone the runtime is typed against.
|
|
10
|
+
declare const TextEncoder: new () => { encode(s: string): Uint8Array };
|
|
11
|
+
|
|
12
|
+
/** The host's UTF-8 encoder, which writes a lone surrogate as U+FFFD, as utf8() does. */
|
|
13
|
+
const encoder = new TextEncoder();
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Below this length, a string encodes faster here than through
|
|
17
|
+
* TextEncoder, whose call costs more than the loop saves (about 90
|
|
18
|
+
* characters in V8).
|
|
19
|
+
*/
|
|
20
|
+
const ENCODER_LENGTH = 96;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* As UnicodeUtils::Utf16ToUtf8: a surrogate pair as four bytes, a lone
|
|
24
|
+
* surrogate as U+FFFD. avmshell's writeUTFBytes loses characters around a
|
|
25
|
+
* lone one instead; this keeps them, and the UTF-8 valid.
|
|
26
|
+
*/
|
|
27
|
+
export function utf8(s: string): Uint8Array {
|
|
28
|
+
if (s.length >= ENCODER_LENGTH) {
|
|
29
|
+
return encoder.encode(s);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ASCII, byte for byte.
|
|
33
|
+
let ascii = true;
|
|
34
|
+
for (let i = 0; i < s.length && ascii; i++) {
|
|
35
|
+
ascii = s.charCodeAt(i) < 0x80;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (ascii) {
|
|
39
|
+
const out = new Uint8Array(s.length);
|
|
40
|
+
for (let i = 0; i < s.length; i++) {
|
|
41
|
+
out[i] = s.charCodeAt(i);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const out = new Uint8Array(s.length * 3);
|
|
48
|
+
let n = 0;
|
|
49
|
+
for (let i = 0; i < s.length; i++) {
|
|
50
|
+
let ch = s.charCodeAt(i);
|
|
51
|
+
if (ch < 0x80) {
|
|
52
|
+
out[n++] = ch;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (ch < 0x800) {
|
|
57
|
+
out[n++] = 0xc0 | ((ch >> 6) & 0x1f);
|
|
58
|
+
out[n++] = 0x80 | (ch & 0x3f);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (ch >= 0xd800 && ch <= 0xdbff) {
|
|
63
|
+
const ch2 = i + 1 < s.length ? s.charCodeAt(i + 1) : 0;
|
|
64
|
+
if (ch2 >= 0xdc00 && ch2 <= 0xdfff) {
|
|
65
|
+
i++;
|
|
66
|
+
const ucs4 = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000;
|
|
67
|
+
out[n++] = 0xf0 | ((ucs4 >> 18) & 0x07);
|
|
68
|
+
out[n++] = 0x80 | ((ucs4 >> 12) & 0x3f);
|
|
69
|
+
out[n++] = 0x80 | ((ucs4 >> 6) & 0x3f);
|
|
70
|
+
out[n++] = 0x80 | (ucs4 & 0x3f);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
ch = 0xfffd;
|
|
75
|
+
} else if (ch >= 0xdc00 && ch <= 0xdfff) {
|
|
76
|
+
ch = 0xfffd;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
out[n++] = 0xe0 | ((ch >> 12) & 0x0f);
|
|
80
|
+
out[n++] = 0x80 | ((ch >> 6) & 0x3f);
|
|
81
|
+
out[n++] = 0x80 | (ch & 0x3f);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return out.subarray(0, n);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* As UnicodeUtils::Utf8ToUtf16, not strict: a byte that does not start a
|
|
89
|
+
* valid sequence is the character of its value, and a four-byte sequence
|
|
90
|
+
* may start with 0xF8 to 0xFF, as Flash Player 9 and 10 read them.
|
|
91
|
+
*/
|
|
92
|
+
/** The length from which fromUtf8 first looks for ASCII. */
|
|
93
|
+
const ASCII_LENGTH = 16;
|
|
94
|
+
|
|
95
|
+
export function fromUtf8(bytes: Uint8Array): string {
|
|
96
|
+
const n = bytes.length;
|
|
97
|
+
// ASCII, as most text is: its bytes are its characters. Below
|
|
98
|
+
// ASCII_LENGTH bytes, a character at a time, until one is not.
|
|
99
|
+
if (n < ASCII_LENGTH) {
|
|
100
|
+
let s = "";
|
|
101
|
+
let k = 0;
|
|
102
|
+
for (; k < n && bytes[k] < 0x80; k++) {
|
|
103
|
+
s += String.fromCharCode(bytes[k]);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (k === n) {
|
|
107
|
+
return s;
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
let ascii = 0;
|
|
111
|
+
while (ascii < n && bytes[ascii] < 0x80) {
|
|
112
|
+
ascii++;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (ascii === n) {
|
|
116
|
+
let s = "";
|
|
117
|
+
for (let k = 0; k < n; k += 8192) {
|
|
118
|
+
s += String.fromCharCode.apply(null, bytes.subarray(k, k + 8192) as unknown as number[]);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return s;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const out: number[] = [];
|
|
126
|
+
let i = 0;
|
|
127
|
+
while (i < n) {
|
|
128
|
+
const c = bytes[i];
|
|
129
|
+
const left = n - i;
|
|
130
|
+
switch (c >> 4) {
|
|
131
|
+
case 12:
|
|
132
|
+
case 13: {
|
|
133
|
+
if (left >= 2 && (bytes[i + 1] & 0xc0) === 0x80) {
|
|
134
|
+
const ch = ((c << 6) & 0x7c0) | (bytes[i + 1] & 0x3f);
|
|
135
|
+
if (ch >= 0x80) {
|
|
136
|
+
out.push(ch);
|
|
137
|
+
i += 2;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 14: {
|
|
144
|
+
if (left >= 3 && (bytes[i + 1] & 0xc0) === 0x80 && (bytes[i + 2] & 0xc0) === 0x80) {
|
|
145
|
+
const ch = ((c << 12) & 0xf000) | ((bytes[i + 1] << 6) & 0xfc0) | (bytes[i + 2] & 0x3f);
|
|
146
|
+
if (ch >= 0x800) {
|
|
147
|
+
out.push(ch);
|
|
148
|
+
i += 3;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
case 15: {
|
|
155
|
+
if (
|
|
156
|
+
left >= 4 &&
|
|
157
|
+
(bytes[i + 1] & 0xc0) === 0x80 &&
|
|
158
|
+
(bytes[i + 2] & 0xc0) === 0x80 &&
|
|
159
|
+
(bytes[i + 3] & 0xc0) === 0x80
|
|
160
|
+
) {
|
|
161
|
+
const ch =
|
|
162
|
+
((c << 18) & 0x1c0000) |
|
|
163
|
+
((bytes[i + 1] << 12) & 0x3f000) |
|
|
164
|
+
((bytes[i + 2] << 6) & 0xfc0) |
|
|
165
|
+
(bytes[i + 3] & 0x3f);
|
|
166
|
+
if (ch >= 0x10000) {
|
|
167
|
+
out.push((((ch - 0x10000) >> 10) & 0x3ff) + 0xd800, ((ch - 0x10000) & 0x3ff) + 0xdc00);
|
|
168
|
+
i += 4;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
default:
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Not a sequence: the byte itself.
|
|
179
|
+
out.push(c);
|
|
180
|
+
i++;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return fromCodes(out);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** A string of UTF-16 code units, in chunks, as String.fromCharCode takes only so many arguments. */
|
|
187
|
+
export function fromCodes(units: number[]): string {
|
|
188
|
+
let s = "";
|
|
189
|
+
for (let k = 0; k < units.length; k += 8192) {
|
|
190
|
+
s += String.fromCharCode(...units.slice(k, k + 8192));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return s;
|
|
194
|
+
}
|