@swf2es/runtime 0.1.4 → 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.
Files changed (59) hide show
  1. package/dist/avm1/errors.d.ts +2 -1
  2. package/dist/avm1/errors.d.ts.map +1 -1
  3. package/dist/avm1/errors.js +1 -1
  4. package/dist/avm1/errors.js.map +1 -1
  5. package/dist/avm1/numbers.d.ts.map +1 -1
  6. package/dist/avm1/numbers.js +7 -8
  7. package/dist/avm1/numbers.js.map +1 -1
  8. package/dist/avm2/amf.d.ts.map +1 -1
  9. package/dist/avm2/amf.js +2 -1
  10. package/dist/avm2/amf.js.map +1 -1
  11. package/dist/avm2/names.d.ts +0 -4
  12. package/dist/avm2/names.d.ts.map +1 -1
  13. package/dist/avm2/names.js +0 -4
  14. package/dist/avm2/names.js.map +1 -1
  15. package/dist/avm2/natives/bytearray.d.ts +0 -7
  16. package/dist/avm2/natives/bytearray.d.ts.map +1 -1
  17. package/dist/avm2/natives/bytearray.js +6 -166
  18. package/dist/avm2/natives/bytearray.js.map +1 -1
  19. package/dist/avm2/natives/regexp.d.ts.map +1 -1
  20. package/dist/avm2/natives/regexp.js +68 -64
  21. package/dist/avm2/natives/regexp.js.map +1 -1
  22. package/dist/avm2/natives/shell-workers.js +1 -1
  23. package/dist/avm2/natives/shell-workers.js.map +1 -1
  24. package/dist/avm2/natives/shell.d.ts.map +1 -1
  25. package/dist/avm2/natives/shell.js +2 -1
  26. package/dist/avm2/natives/shell.js.map +1 -1
  27. package/dist/avm2/natives/xml/parser.d.ts +0 -2
  28. package/dist/avm2/natives/xml/parser.d.ts.map +1 -1
  29. package/dist/avm2/natives/xml/parser.js +2 -2
  30. package/dist/avm2/natives/xml/parser.js.map +1 -1
  31. package/dist/avm2/numbers.d.ts +0 -1
  32. package/dist/avm2/numbers.d.ts.map +1 -1
  33. package/dist/avm2/numbers.js +1 -1
  34. package/dist/avm2/numbers.js.map +1 -1
  35. package/dist/avm2/runtime.d.ts.map +1 -1
  36. package/dist/avm2/runtime.js +10 -8
  37. package/dist/avm2/runtime.js.map +1 -1
  38. package/dist/avm2/traits.d.ts +0 -12
  39. package/dist/avm2/traits.d.ts.map +1 -1
  40. package/dist/avm2/traits.js +1 -1
  41. package/dist/avm2/traits.js.map +1 -1
  42. package/dist/avm2/utf8.d.ts +10 -0
  43. package/dist/avm2/utf8.d.ts.map +1 -0
  44. package/dist/avm2/utf8.js +168 -0
  45. package/dist/avm2/utf8.js.map +1 -0
  46. package/package.json +2 -2
  47. package/src/avm1/errors.ts +1 -1
  48. package/src/avm1/numbers.ts +7 -10
  49. package/src/avm2/amf.ts +2 -1
  50. package/src/avm2/names.ts +0 -4
  51. package/src/avm2/natives/bytearray.ts +6 -193
  52. package/src/avm2/natives/regexp.ts +70 -68
  53. package/src/avm2/natives/shell-workers.ts +1 -1
  54. package/src/avm2/natives/shell.ts +1 -2
  55. package/src/avm2/natives/xml/parser.ts +2 -2
  56. package/src/avm2/numbers.ts +1 -1
  57. package/src/avm2/runtime.ts +10 -6
  58. package/src/avm2/traits.ts +1 -1
  59. package/src/avm2/utf8.ts +194 -0
@@ -0,0 +1,168 @@
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
+ /** The host's UTF-8 encoder, which writes a lone surrogate as U+FFFD, as utf8() does. */
8
+ const encoder = new TextEncoder();
9
+ /**
10
+ * Below this length, a string encodes faster here than through
11
+ * TextEncoder, whose call costs more than the loop saves (about 90
12
+ * characters in V8).
13
+ */
14
+ const ENCODER_LENGTH = 96;
15
+ /**
16
+ * As UnicodeUtils::Utf16ToUtf8: a surrogate pair as four bytes, a lone
17
+ * surrogate as U+FFFD. avmshell's writeUTFBytes loses characters around a
18
+ * lone one instead; this keeps them, and the UTF-8 valid.
19
+ */
20
+ export function utf8(s) {
21
+ if (s.length >= ENCODER_LENGTH) {
22
+ return encoder.encode(s);
23
+ }
24
+ // ASCII, byte for byte.
25
+ let ascii = true;
26
+ for (let i = 0; i < s.length && ascii; i++) {
27
+ ascii = s.charCodeAt(i) < 0x80;
28
+ }
29
+ if (ascii) {
30
+ const out = new Uint8Array(s.length);
31
+ for (let i = 0; i < s.length; i++) {
32
+ out[i] = s.charCodeAt(i);
33
+ }
34
+ return out;
35
+ }
36
+ const out = new Uint8Array(s.length * 3);
37
+ let n = 0;
38
+ for (let i = 0; i < s.length; i++) {
39
+ let ch = s.charCodeAt(i);
40
+ if (ch < 0x80) {
41
+ out[n++] = ch;
42
+ continue;
43
+ }
44
+ if (ch < 0x800) {
45
+ out[n++] = 0xc0 | ((ch >> 6) & 0x1f);
46
+ out[n++] = 0x80 | (ch & 0x3f);
47
+ continue;
48
+ }
49
+ if (ch >= 0xd800 && ch <= 0xdbff) {
50
+ const ch2 = i + 1 < s.length ? s.charCodeAt(i + 1) : 0;
51
+ if (ch2 >= 0xdc00 && ch2 <= 0xdfff) {
52
+ i++;
53
+ const ucs4 = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000;
54
+ out[n++] = 0xf0 | ((ucs4 >> 18) & 0x07);
55
+ out[n++] = 0x80 | ((ucs4 >> 12) & 0x3f);
56
+ out[n++] = 0x80 | ((ucs4 >> 6) & 0x3f);
57
+ out[n++] = 0x80 | (ucs4 & 0x3f);
58
+ continue;
59
+ }
60
+ ch = 0xfffd;
61
+ }
62
+ else if (ch >= 0xdc00 && ch <= 0xdfff) {
63
+ ch = 0xfffd;
64
+ }
65
+ out[n++] = 0xe0 | ((ch >> 12) & 0x0f);
66
+ out[n++] = 0x80 | ((ch >> 6) & 0x3f);
67
+ out[n++] = 0x80 | (ch & 0x3f);
68
+ }
69
+ return out.subarray(0, n);
70
+ }
71
+ /**
72
+ * As UnicodeUtils::Utf8ToUtf16, not strict: a byte that does not start a
73
+ * valid sequence is the character of its value, and a four-byte sequence
74
+ * may start with 0xF8 to 0xFF, as Flash Player 9 and 10 read them.
75
+ */
76
+ /** The length from which fromUtf8 first looks for ASCII. */
77
+ const ASCII_LENGTH = 16;
78
+ export function fromUtf8(bytes) {
79
+ const n = bytes.length;
80
+ // ASCII, as most text is: its bytes are its characters. Below
81
+ // ASCII_LENGTH bytes, a character at a time, until one is not.
82
+ if (n < ASCII_LENGTH) {
83
+ let s = "";
84
+ let k = 0;
85
+ for (; k < n && bytes[k] < 0x80; k++) {
86
+ s += String.fromCharCode(bytes[k]);
87
+ }
88
+ if (k === n) {
89
+ return s;
90
+ }
91
+ }
92
+ else {
93
+ let ascii = 0;
94
+ while (ascii < n && bytes[ascii] < 0x80) {
95
+ ascii++;
96
+ }
97
+ if (ascii === n) {
98
+ let s = "";
99
+ for (let k = 0; k < n; k += 8192) {
100
+ s += String.fromCharCode.apply(null, bytes.subarray(k, k + 8192));
101
+ }
102
+ return s;
103
+ }
104
+ }
105
+ const out = [];
106
+ let i = 0;
107
+ while (i < n) {
108
+ const c = bytes[i];
109
+ const left = n - i;
110
+ switch (c >> 4) {
111
+ case 12:
112
+ case 13: {
113
+ if (left >= 2 && (bytes[i + 1] & 0xc0) === 0x80) {
114
+ const ch = ((c << 6) & 0x7c0) | (bytes[i + 1] & 0x3f);
115
+ if (ch >= 0x80) {
116
+ out.push(ch);
117
+ i += 2;
118
+ continue;
119
+ }
120
+ }
121
+ break;
122
+ }
123
+ case 14: {
124
+ if (left >= 3 && (bytes[i + 1] & 0xc0) === 0x80 && (bytes[i + 2] & 0xc0) === 0x80) {
125
+ const ch = ((c << 12) & 0xf000) | ((bytes[i + 1] << 6) & 0xfc0) | (bytes[i + 2] & 0x3f);
126
+ if (ch >= 0x800) {
127
+ out.push(ch);
128
+ i += 3;
129
+ continue;
130
+ }
131
+ }
132
+ break;
133
+ }
134
+ case 15: {
135
+ if (left >= 4 &&
136
+ (bytes[i + 1] & 0xc0) === 0x80 &&
137
+ (bytes[i + 2] & 0xc0) === 0x80 &&
138
+ (bytes[i + 3] & 0xc0) === 0x80) {
139
+ const ch = ((c << 18) & 0x1c0000) |
140
+ ((bytes[i + 1] << 12) & 0x3f000) |
141
+ ((bytes[i + 2] << 6) & 0xfc0) |
142
+ (bytes[i + 3] & 0x3f);
143
+ if (ch >= 0x10000) {
144
+ out.push((((ch - 0x10000) >> 10) & 0x3ff) + 0xd800, ((ch - 0x10000) & 0x3ff) + 0xdc00);
145
+ i += 4;
146
+ continue;
147
+ }
148
+ }
149
+ break;
150
+ }
151
+ default:
152
+ break;
153
+ }
154
+ // Not a sequence: the byte itself.
155
+ out.push(c);
156
+ i++;
157
+ }
158
+ return fromCodes(out);
159
+ }
160
+ /** A string of UTF-16 code units, in chunks, as String.fromCharCode takes only so many arguments. */
161
+ export function fromCodes(units) {
162
+ let s = "";
163
+ for (let k = 0; k < units.length; k += 8192) {
164
+ s += String.fromCharCode(...units.slice(k, k + 8192));
165
+ }
166
+ return s;
167
+ }
168
+ //# sourceMappingURL=utf8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8.js","sourceRoot":"","sources":["../../src/avm2/utf8.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swf2es/runtime",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "AVM2 and AVM1 language runtime used by generated code",
5
5
  "keywords": [
6
6
  "actionscript",
@@ -41,6 +41,6 @@
41
41
  "LICENSE.third-party"
42
42
  ],
43
43
  "dependencies": {
44
- "@swf2es/format": "0.1.4"
44
+ "@swf2es/format": "0.1.5"
45
45
  }
46
46
  }
@@ -23,7 +23,7 @@ export class Halt extends Error {
23
23
  * own check (adl; Ruffle's continue_if_base_clip_exists). One instance,
24
24
  * thrown as a signal and never shown.
25
25
  */
26
- export class BaseRemoved extends Error {
26
+ class BaseRemoved extends Error {
27
27
  override name = "Avm1BaseRemoved";
28
28
  }
29
29
 
@@ -52,16 +52,13 @@ export function numberToString(n: number): string {
52
52
  return "NaN";
53
53
  }
54
54
 
55
- if (n === Number.POSITIVE_INFINITY) {
56
- return "Infinity";
57
- }
58
-
59
- if (n === Number.NEGATIVE_INFINITY) {
60
- return "-Infinity";
61
- }
62
-
63
- if (n === 0) {
64
- return "0";
55
+ switch (n) {
56
+ case Number.POSITIVE_INFINITY:
57
+ return "Infinity";
58
+ case Number.NEGATIVE_INFINITY:
59
+ return "-Infinity";
60
+ case 0:
61
+ return "0";
65
62
  }
66
63
 
67
64
  if (n >= -2147483648 && n <= 2147483647 && Number.isInteger(n)) {
package/src/avm2/amf.ts CHANGED
@@ -15,10 +15,11 @@
15
15
  import type { AsObject, Value } from "./descriptors.js";
16
16
  import { FloatValue } from "./float.js";
17
17
  import { NS_PackageInternal, NS_Public, namespace, publicQname, qname } from "./names.js";
18
- import { type Bytes, bytesOf, fromUtf8, utf8 } from "./natives/bytearray.js";
18
+ import { type Bytes, bytesOf } from "./natives/bytearray.js";
19
19
  import { xmlToXMLString } from "./natives/xml/strings.js";
20
20
  import type { Runtime } from "./runtime.js";
21
21
  import type { Traits } from "./traits.js";
22
+ import { fromUtf8, utf8 } from "./utf8.js";
22
23
 
23
24
  const kUndefined = 0;
24
25
  const kNull = 1;
package/src/avm2/names.ts CHANGED
@@ -11,9 +11,6 @@ import { NO_CACHE, type PropertyCache } from "./property-cache.js";
11
11
  /** Namespace kinds, numbered as the compiler's NS_* constants. */
12
12
  export const NS_Public = 0;
13
13
  export const NS_PackageInternal = 1;
14
- export const NS_Protected = 2;
15
- export const NS_Explicit = 3;
16
- export const NS_StaticProtected = 4;
17
14
  export const NS_Private = 5;
18
15
 
19
16
  export class Namespace {
@@ -87,7 +84,6 @@ export const CONSTANT_Multiname = 0x09;
87
84
  export const CONSTANT_MultinameA = 0x0e;
88
85
  export const CONSTANT_MultinameL = 0x1b;
89
86
  export const CONSTANT_MultinameLA = 0x1c;
90
- export const CONSTANT_TypeName = 0x1d;
91
87
 
92
88
  /**
93
89
  * A name as a property lookup uses it: its namespaces, each with the API
@@ -2,12 +2,12 @@
2
2
  // DataInput/DataOutput implement them. The buffer keeps avmplus' capacity:
3
3
  // it grows as avmplus' Grower grows it, zeroing what a reallocation adds,
4
4
  // so bytes a shorter length left behind come back when the length grows
5
- // within the capacity, as they do in avmplus. UTF-8 is avmplus' own: an
6
- // invalid byte reads as the character of its value.
5
+ // within the capacity, as they do in avmplus. UTF-8 is avmplus' own
6
+ // (utf8.ts).
7
7
  //
8
- // Translated from avmplus' core/ByteArrayGlue.cpp, core/DataIO.cpp and
9
- // core/UnicodeUtils.cpp, this file is subject to the Mozilla Public
10
- // License, v. 2.0: http://mozilla.org/MPL/2.0/.
8
+ // Translated from avmplus' core/ByteArrayGlue.cpp and core/DataIO.cpp,
9
+ // this file is subject to the Mozilla Public License, v. 2.0:
10
+ // http://mozilla.org/MPL/2.0/.
11
11
  import {
12
12
  CompressedDataError,
13
13
  CompressedDataTooLargeError,
@@ -23,6 +23,7 @@ import type { AsObject, Method, Value } from "../descriptors.js";
23
23
  import type { IndexHook } from "../hooks.js";
24
24
  import type { Runtime } from "../runtime.js";
25
25
  import type { Traits } from "../traits.js";
26
+ import { fromCodes, fromUtf8, utf8 } from "../utf8.js";
26
27
  import { type Natives, registerNativeClass } from "./define.js";
27
28
 
28
29
  const kGrowthIncr = 4096;
@@ -653,194 +654,6 @@ export function knownSharedByteArray(rt: Runtime, id: number): AsObject | undefi
653
654
  return sharedObjectsOf(rt).get(id)?.deref();
654
655
  }
655
656
 
656
- // TextEncoder is the web's and node's alike, though not ECMAScript's,
657
- // whose library alone the runtime is typed against.
658
- declare const TextEncoder: new () => { encode(s: string): Uint8Array };
659
-
660
- /** The host's UTF-8 encoder, which writes a lone surrogate as U+FFFD, as utf8() does. */
661
- const encoder = new TextEncoder();
662
-
663
- /**
664
- * Below this length, a string encodes faster here than through
665
- * TextEncoder, whose call costs more than the loop saves (about 90
666
- * characters in V8).
667
- */
668
- const ENCODER_LENGTH = 96;
669
-
670
- /**
671
- * As UnicodeUtils::Utf16ToUtf8: a surrogate pair as four bytes, a lone
672
- * surrogate as U+FFFD. avmshell's writeUTFBytes loses characters around a
673
- * lone one instead; this keeps them, and the UTF-8 valid.
674
- */
675
- export function utf8(s: string): Uint8Array {
676
- if (s.length >= ENCODER_LENGTH) {
677
- return encoder.encode(s);
678
- }
679
-
680
- // ASCII, byte for byte.
681
- let ascii = true;
682
- for (let i = 0; i < s.length && ascii; i++) {
683
- ascii = s.charCodeAt(i) < 0x80;
684
- }
685
-
686
- if (ascii) {
687
- const out = new Uint8Array(s.length);
688
- for (let i = 0; i < s.length; i++) {
689
- out[i] = s.charCodeAt(i);
690
- }
691
-
692
- return out;
693
- }
694
-
695
- const out = new Uint8Array(s.length * 3);
696
- let n = 0;
697
- for (let i = 0; i < s.length; i++) {
698
- let ch = s.charCodeAt(i);
699
- if (ch < 0x80) {
700
- out[n++] = ch;
701
- continue;
702
- }
703
-
704
- if (ch < 0x800) {
705
- out[n++] = 0xc0 | ((ch >> 6) & 0x1f);
706
- out[n++] = 0x80 | (ch & 0x3f);
707
- continue;
708
- }
709
-
710
- if (ch >= 0xd800 && ch <= 0xdbff) {
711
- const ch2 = i + 1 < s.length ? s.charCodeAt(i + 1) : 0;
712
- if (ch2 >= 0xdc00 && ch2 <= 0xdfff) {
713
- i++;
714
- const ucs4 = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000;
715
- out[n++] = 0xf0 | ((ucs4 >> 18) & 0x07);
716
- out[n++] = 0x80 | ((ucs4 >> 12) & 0x3f);
717
- out[n++] = 0x80 | ((ucs4 >> 6) & 0x3f);
718
- out[n++] = 0x80 | (ucs4 & 0x3f);
719
- continue;
720
- }
721
-
722
- ch = 0xfffd;
723
- } else if (ch >= 0xdc00 && ch <= 0xdfff) {
724
- ch = 0xfffd;
725
- }
726
-
727
- out[n++] = 0xe0 | ((ch >> 12) & 0x0f);
728
- out[n++] = 0x80 | ((ch >> 6) & 0x3f);
729
- out[n++] = 0x80 | (ch & 0x3f);
730
- }
731
-
732
- return out.subarray(0, n);
733
- }
734
-
735
- /**
736
- * As UnicodeUtils::Utf8ToUtf16, not strict: a byte that does not start a
737
- * valid sequence is the character of its value, and a four-byte sequence
738
- * may start with 0xF8 to 0xFF, as Flash Player 9 and 10 read them.
739
- */
740
- /** The length from which fromUtf8 first looks for ASCII. */
741
- const ASCII_LENGTH = 16;
742
-
743
- export function fromUtf8(bytes: Uint8Array): string {
744
- const n = bytes.length;
745
- // ASCII, as most text is: its bytes are its characters. Below
746
- // ASCII_LENGTH bytes, a character at a time, until one is not.
747
- if (n < ASCII_LENGTH) {
748
- let s = "";
749
- let k = 0;
750
- for (; k < n && bytes[k] < 0x80; k++) {
751
- s += String.fromCharCode(bytes[k]);
752
- }
753
-
754
- if (k === n) {
755
- return s;
756
- }
757
- } else {
758
- let ascii = 0;
759
- while (ascii < n && bytes[ascii] < 0x80) {
760
- ascii++;
761
- }
762
-
763
- if (ascii === n) {
764
- let s = "";
765
- for (let k = 0; k < n; k += 8192) {
766
- s += String.fromCharCode.apply(null, bytes.subarray(k, k + 8192) as unknown as number[]);
767
- }
768
-
769
- return s;
770
- }
771
- }
772
-
773
- const out: number[] = [];
774
- let i = 0;
775
- while (i < n) {
776
- const c = bytes[i];
777
- const left = n - i;
778
- switch (c >> 4) {
779
- case 12:
780
- case 13: {
781
- if (left >= 2 && (bytes[i + 1] & 0xc0) === 0x80) {
782
- const ch = ((c << 6) & 0x7c0) | (bytes[i + 1] & 0x3f);
783
- if (ch >= 0x80) {
784
- out.push(ch);
785
- i += 2;
786
- continue;
787
- }
788
- }
789
- break;
790
- }
791
- case 14: {
792
- if (left >= 3 && (bytes[i + 1] & 0xc0) === 0x80 && (bytes[i + 2] & 0xc0) === 0x80) {
793
- const ch = ((c << 12) & 0xf000) | ((bytes[i + 1] << 6) & 0xfc0) | (bytes[i + 2] & 0x3f);
794
- if (ch >= 0x800) {
795
- out.push(ch);
796
- i += 3;
797
- continue;
798
- }
799
- }
800
- break;
801
- }
802
- case 15: {
803
- if (
804
- left >= 4 &&
805
- (bytes[i + 1] & 0xc0) === 0x80 &&
806
- (bytes[i + 2] & 0xc0) === 0x80 &&
807
- (bytes[i + 3] & 0xc0) === 0x80
808
- ) {
809
- const ch =
810
- ((c << 18) & 0x1c0000) |
811
- ((bytes[i + 1] << 12) & 0x3f000) |
812
- ((bytes[i + 2] << 6) & 0xfc0) |
813
- (bytes[i + 3] & 0x3f);
814
- if (ch >= 0x10000) {
815
- out.push((((ch - 0x10000) >> 10) & 0x3ff) + 0xd800, ((ch - 0x10000) & 0x3ff) + 0xdc00);
816
- i += 4;
817
- continue;
818
- }
819
- }
820
- break;
821
- }
822
- default:
823
- break;
824
- }
825
-
826
- // Not a sequence: the byte itself.
827
- out.push(c);
828
- i++;
829
- }
830
-
831
- return fromCodes(out);
832
- }
833
-
834
- /** A string of UTF-16 code units, in chunks, as String.fromCharCode takes only so many arguments. */
835
- function fromCodes(units: number[]): string {
836
- let s = "";
837
- for (let k = 0; k < units.length; k += 8192) {
838
- s += String.fromCharCode(...units.slice(k, k + 8192));
839
- }
840
-
841
- return s;
842
- }
843
-
844
657
  /** The bytes up to the first NUL, as avmplus reads a C string. */
845
658
  function toNul(bytes: Uint8Array): Uint8Array {
846
659
  const nul = bytes.indexOf(0);
@@ -212,30 +212,28 @@ function variableLookbehind(source: string): boolean {
212
212
  /** The length of the item at i, which it steps past. */
213
213
  const item = (): number => {
214
214
  const c = source[i++];
215
- if (c === "(") {
216
- return group();
217
- }
215
+ switch (c) {
216
+ case "(":
217
+ return group();
218
+ case "^":
219
+ case "$":
220
+ return 0;
221
+ case "[":
222
+ if (source[i] === "^") {
223
+ i++;
224
+ }
218
225
 
219
- if (c === "^" || c === "$") {
220
- return 0;
221
- }
226
+ // A ] first is a literal.
227
+ if (source[i] === "]") {
228
+ i++;
229
+ }
222
230
 
223
- if (c === "[") {
224
- if (source[i] === "^") {
225
- i++;
226
- }
231
+ while (i < source.length && source[i] !== "]") {
232
+ i += source[i] === "\\" ? 2 : 1;
233
+ }
227
234
 
228
- // A ] first is a literal.
229
- if (source[i] === "]") {
230
235
  i++;
231
- }
232
-
233
- while (i < source.length && source[i] !== "]") {
234
- i += source[i] === "\\" ? 2 : 1;
235
- }
236
-
237
- i++;
238
- return 1;
236
+ return 1;
239
237
  }
240
238
 
241
239
  if (c !== "\\") {
@@ -324,62 +322,66 @@ function nestedTooDeep(source: string): boolean {
324
322
  for (let i = 0; i < source.length; i++) {
325
323
  const c = source[i];
326
324
  let item = 2;
327
- if (c === "(") {
328
- const capture = source[i + 1] !== "?" || source.startsWith("(?P<", i);
329
- outer.push(held);
330
- held += previous + (capture ? 5 : 3);
331
- previous = 0;
332
- if (held > WORKSPACE) {
333
- return true;
334
- }
335
-
336
- // Past the group's kind: ?: ?= ?! ?<= ?<! ?P<name> or flags.
337
- if (source[i + 1] === "?") {
338
- const end = source.slice(i + 2).search(/[:=!>)]/);
339
- i = end < 0 ? source.length : i + 2 + end;
340
- }
341
-
342
- continue;
343
- }
344
-
345
- if (c === ")") {
346
- held = outer.pop() ?? held;
347
- // The group is the next one's previous item, but what it holds is gone.
348
- previous = 0;
349
- continue;
350
- }
325
+ switch (c) {
326
+ case "(": {
327
+ const capture = source[i + 1] !== "?" || source.startsWith("(?P<", i);
328
+ outer.push(held);
329
+ held += previous + (capture ? 5 : 3);
330
+ previous = 0;
331
+ if (held > WORKSPACE) {
332
+ return true;
333
+ }
351
334
 
352
- if (c === "|") {
353
- previous = 0;
354
- continue;
355
- }
335
+ // Past the group's kind: ?: ?= ?! ?<= ?<! ?P<name> or flags.
336
+ if (source[i + 1] === "?") {
337
+ const end = source.slice(i + 2).search(/[:=!>)]/);
338
+ i = end < 0 ? source.length : i + 2 + end;
339
+ }
356
340
 
357
- if (c === "\\") {
358
- i++;
359
- } else if (c === "[") {
360
- // A class is its opcode and a 32-byte bitmap.
361
- item = 33;
362
- i++;
363
- if (source[i] === "^") {
364
- i++;
341
+ continue;
365
342
  }
366
-
367
- // A ] first is a literal.
368
- if (source[i] === "]") {
343
+ case ")":
344
+ held = outer.pop() ?? held;
345
+ // The group is the next one's previous item, but what it holds is gone.
346
+ previous = 0;
347
+ continue;
348
+ case "|":
349
+ previous = 0;
350
+ continue;
351
+ case "\\":
369
352
  i++;
370
- }
353
+ break;
354
+ case "[":
355
+ // A class is its opcode and a 32-byte bitmap.
356
+ item = 33;
357
+ i++;
358
+ if (source[i] === "^") {
359
+ i++;
360
+ }
371
361
 
372
- while (i < source.length && source[i] !== "]") {
373
- if (source[i] === "\\") {
362
+ // A ] first is a literal.
363
+ if (source[i] === "]") {
374
364
  i++;
375
365
  }
376
366
 
377
- i++;
378
- }
379
- } else if (c === "." || c === "^" || c === "$") {
380
- item = 1;
381
- } else if ("*+?{".includes(c)) {
382
- continue;
367
+ while (i < source.length && source[i] !== "]") {
368
+ if (source[i] === "\\") {
369
+ i++;
370
+ }
371
+
372
+ i++;
373
+ }
374
+ break;
375
+ case ".":
376
+ case "^":
377
+ case "$":
378
+ item = 1;
379
+ break;
380
+ case "*":
381
+ case "+":
382
+ case "?":
383
+ case "{":
384
+ continue;
383
385
  }
384
386
 
385
387
  previous = item;
@@ -11,7 +11,7 @@
11
11
 
12
12
  import type { Value } from "../descriptors.js";
13
13
  import type { ShellWorkerInit, ShellWorkersMemory } from "../options.js";
14
- import { fromUtf8, utf8 } from "./bytearray.js";
14
+ import { fromUtf8, utf8 } from "../utf8.js";
15
15
  import { Sync, type SyncMemory } from "./sync.js";
16
16
 
17
17
  /** avmplus' Isolate::State. */
@@ -9,15 +9,14 @@ import type { ClassHook } from "../hooks.js";
9
9
  import type { ShellThread } from "../options.js";
10
10
  import type { Runtime } from "../runtime.js";
11
11
  import { setStaticVar } from "../traits.js";
12
+ import { fromUtf8, utf8 } from "../utf8.js";
12
13
  import {
13
14
  byteArrayCapacity,
14
15
  bytesOf,
15
- fromUtf8,
16
16
  GLOBAL_MEMORY_MIN_SIZE,
17
17
  knownSharedByteArray,
18
18
  setDomainMemory,
19
19
  sharedByteArray,
20
- utf8,
21
20
  } from "./bytearray.js";
22
21
  import { syncObject, syncOf, syncRef } from "./concurrent.js";
23
22
  import { elements, type Natives, registerNativeClass } from "./define.js";