json-as 1.2.6 → 1.3.1

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 (135) hide show
  1. package/CHANGELOG.md +417 -0
  2. package/README.md +135 -36
  3. package/assembly/custom/util.ts +24 -70
  4. package/assembly/deserialize/float.ts +181 -0
  5. package/assembly/deserialize/helpers/uint.ts +12 -0
  6. package/assembly/deserialize/index/arbitrary.ts +25 -0
  7. package/assembly/deserialize/index/array.ts +61 -0
  8. package/assembly/deserialize/index/bool.ts +1 -0
  9. package/assembly/deserialize/index/date.ts +1 -0
  10. package/assembly/deserialize/index/float.ts +1 -0
  11. package/assembly/deserialize/index/integer.ts +1 -0
  12. package/assembly/deserialize/index/map.ts +1 -0
  13. package/assembly/deserialize/index/object.ts +1 -0
  14. package/assembly/deserialize/index/raw.ts +1 -0
  15. package/assembly/deserialize/index/set.ts +1 -0
  16. package/assembly/deserialize/index/staticarray.ts +1 -0
  17. package/assembly/deserialize/index/string.ts +15 -0
  18. package/assembly/deserialize/index/struct.ts +1 -0
  19. package/assembly/deserialize/index/typedarray.ts +15 -0
  20. package/assembly/deserialize/index/unsigned.ts +1 -0
  21. package/assembly/deserialize/index.ts +14 -0
  22. package/assembly/deserialize/integer.ts +42 -0
  23. package/assembly/deserialize/simd/array/integer.ts +307 -0
  24. package/assembly/deserialize/simd/string.ts +130 -11
  25. package/assembly/deserialize/simple/arbitrary.ts +5 -12
  26. package/assembly/deserialize/simple/array/arbitrary.ts +12 -36
  27. package/assembly/deserialize/simple/array/array.ts +2 -8
  28. package/assembly/deserialize/simple/array/bool.ts +2 -8
  29. package/assembly/deserialize/simple/array/box.ts +2 -8
  30. package/assembly/deserialize/simple/array/float.ts +2 -8
  31. package/assembly/deserialize/simple/array/integer.ts +2 -8
  32. package/assembly/deserialize/simple/array/map.ts +6 -26
  33. package/assembly/deserialize/simple/array/object.ts +6 -26
  34. package/assembly/deserialize/simple/array/raw.ts +18 -61
  35. package/assembly/deserialize/simple/array/string.ts +5 -10
  36. package/assembly/deserialize/simple/array/struct.ts +6 -26
  37. package/assembly/deserialize/simple/array.ts +2 -5
  38. package/assembly/deserialize/simple/bool.ts +2 -6
  39. package/assembly/deserialize/simple/map.ts +29 -102
  40. package/assembly/deserialize/simple/object.ts +24 -81
  41. package/assembly/deserialize/simple/raw.ts +1 -4
  42. package/assembly/deserialize/simple/set.ts +11 -37
  43. package/assembly/deserialize/simple/staticarray/array.ts +1 -1
  44. package/assembly/deserialize/simple/staticarray/bool.ts +1 -1
  45. package/assembly/deserialize/simple/staticarray/float.ts +1 -1
  46. package/assembly/deserialize/simple/staticarray/integer.ts +1 -1
  47. package/assembly/deserialize/simple/staticarray/string.ts +7 -14
  48. package/assembly/deserialize/simple/staticarray/struct.ts +1 -1
  49. package/assembly/deserialize/simple/staticarray.ts +57 -21
  50. package/assembly/deserialize/simple/string.ts +90 -10
  51. package/assembly/deserialize/simple/struct.ts +25 -121
  52. package/assembly/deserialize/simple/typedarray.ts +94 -0
  53. package/assembly/deserialize/swar/array/arbitrary.ts +8 -0
  54. package/assembly/deserialize/swar/array/array.ts +39 -0
  55. package/assembly/deserialize/swar/array/bool.ts +47 -0
  56. package/assembly/deserialize/swar/array/box.ts +8 -0
  57. package/assembly/deserialize/swar/array/float.ts +39 -0
  58. package/assembly/deserialize/swar/array/integer.ts +461 -0
  59. package/assembly/deserialize/swar/array/map.ts +7 -0
  60. package/assembly/deserialize/swar/array/object.ts +44 -0
  61. package/assembly/deserialize/swar/array/raw.ts +8 -0
  62. package/assembly/deserialize/swar/array/shared.ts +96 -0
  63. package/assembly/deserialize/swar/array/string.ts +39 -0
  64. package/assembly/deserialize/swar/array/struct.ts +44 -0
  65. package/assembly/deserialize/swar/array.ts +49 -0
  66. package/assembly/deserialize/swar/string.ts +648 -15
  67. package/assembly/deserialize/unsigned.ts +75 -0
  68. package/assembly/index.d.ts +1 -3
  69. package/assembly/index.ts +316 -374
  70. package/assembly/serialize/index/arbitrary.ts +75 -0
  71. package/assembly/serialize/index/array.ts +1 -0
  72. package/assembly/serialize/index/bool.ts +1 -0
  73. package/assembly/serialize/index/date.ts +1 -0
  74. package/assembly/serialize/index/float.ts +1 -0
  75. package/assembly/serialize/index/integer.ts +1 -0
  76. package/assembly/serialize/index/map.ts +1 -0
  77. package/assembly/serialize/index/object.ts +46 -0
  78. package/assembly/serialize/index/raw.ts +1 -0
  79. package/assembly/serialize/index/set.ts +1 -0
  80. package/assembly/serialize/index/staticarray.ts +1 -0
  81. package/assembly/serialize/index/string.ts +15 -0
  82. package/assembly/serialize/index/struct.ts +1 -0
  83. package/assembly/serialize/index/typedarray.ts +66 -0
  84. package/assembly/serialize/index.ts +13 -0
  85. package/assembly/serialize/simd/string.ts +4 -13
  86. package/assembly/serialize/simple/arbitrary.ts +6 -0
  87. package/assembly/serialize/simple/raw.ts +1 -5
  88. package/assembly/serialize/simple/string.ts +3 -11
  89. package/assembly/serialize/simple/typedarray.ts +63 -0
  90. package/assembly/serialize/swar/string.ts +6 -21
  91. package/assembly/util/concat.ts +1 -5
  92. package/assembly/util/index.ts +1 -0
  93. package/assembly/util/masks.ts +12 -18
  94. package/assembly/util/memory.ts +0 -0
  95. package/assembly/util/snp.ts +1 -4
  96. package/assembly/util/stringScan.ts +24 -0
  97. package/assembly/util/swar.ts +50 -6
  98. package/lib/as-bs.ts +137 -127
  99. package/package.json +26 -5
  100. package/transform/lib/builder.d.ts.map +1 -1
  101. package/transform/lib/builder.js +5 -13
  102. package/transform/lib/builder.js.map +1 -1
  103. package/transform/lib/index.d.ts +1 -0
  104. package/transform/lib/index.d.ts.map +1 -1
  105. package/transform/lib/index.js +672 -757
  106. package/transform/lib/index.js.map +1 -1
  107. package/transform/lib/linkers/alias.d.ts.map +1 -1
  108. package/transform/lib/linkers/alias.js.map +1 -1
  109. package/transform/lib/linkers/custom.d.ts.map +1 -1
  110. package/transform/lib/linkers/custom.js +8 -9
  111. package/transform/lib/linkers/custom.js.map +1 -1
  112. package/transform/lib/linkers/imports.d.ts.map +1 -1
  113. package/transform/lib/linkers/imports.js.map +1 -1
  114. package/transform/lib/types.d.ts +6 -0
  115. package/transform/lib/types.d.ts.map +1 -1
  116. package/transform/lib/types.js +83 -21
  117. package/transform/lib/types.js.map +1 -1
  118. package/transform/lib/util.d.ts.map +1 -1
  119. package/transform/lib/util.js +1 -1
  120. package/transform/lib/util.js.map +1 -1
  121. package/transform/lib/visitor.d.ts.map +1 -1
  122. package/transform/lib/visitor.js +1 -2
  123. package/transform/lib/visitor.js.map +1 -1
  124. package/.prettierrc +0 -3
  125. package/ARCHITECTURE.md +0 -320
  126. package/CONTRIBUTING.md +0 -238
  127. package/TODO +0 -1
  128. package/assembly/deserialize/simple/float.ts +0 -11
  129. package/assembly/deserialize/simple/integer.ts +0 -9
  130. package/assembly/test.ts +0 -30
  131. package/eslint.config.js +0 -60
  132. package/lib/tsconfig.json +0 -8
  133. package/tools/assemblyscript-eslint-local.js +0 -29
  134. package/tools/assemblyscript-eslint.js +0 -29
  135. package/transform/tsconfig.json +0 -35
@@ -0,0 +1,25 @@
1
+ import { JSON } from "../..";
2
+ import { deserializeArray } from "./array";
3
+ import { deserializeBoolean } from "./bool";
4
+ import { deserializeFloat } from "./float";
5
+ import { deserializeObject } from "./object";
6
+ import { deserializeString } from "./string";
7
+ import { BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE } from "../../custom/chars";
8
+
9
+ export function deserializeArbitrary(srcStart: usize, srcEnd: usize, dst: usize): JSON.Value {
10
+ const firstChar = load<u16>(srcStart);
11
+ if (firstChar == QUOTE) {
12
+ return JSON.Value.from(deserializeString(srcStart, srcEnd));
13
+ } else if (firstChar == BRACE_LEFT) {
14
+ return JSON.Value.from(deserializeObject(srcStart, srcEnd, 0));
15
+ } else if (firstChar - 48 <= 9 || firstChar == 45) {
16
+ return JSON.Value.from(deserializeFloat<f64>(srcStart, srcEnd));
17
+ } else if (firstChar == BRACKET_LEFT) {
18
+ return JSON.Value.from(deserializeArray<JSON.Value[]>(srcStart, srcEnd, 0));
19
+ } else if (firstChar == 116 || firstChar == 102) {
20
+ return JSON.Value.from(deserializeBoolean(srcStart, srcEnd));
21
+ } else if (firstChar == CHAR_N) {
22
+ return JSON.Value.from<usize>(0);
23
+ }
24
+ return unreachable();
25
+ }
@@ -0,0 +1,61 @@
1
+ import { JSON, JSONMode } from "../..";
2
+ import { deserializeArbitraryArray } from "../simple/array/arbitrary";
3
+ import { deserializeArrayArray } from "../simple/array/array";
4
+ import { deserializeBooleanArray } from "../simple/array/bool";
5
+ import { deserializeBoxArray } from "../simple/array/box";
6
+ import { deserializeFloatArray } from "../simple/array/float";
7
+ import { deserializeIntegerArray as deserializeIntegerArray_NAIVE } from "../simple/array/integer";
8
+ import { deserializeMapArray } from "../simple/array/map";
9
+ import { deserializeObjectArray } from "../simple/array/object";
10
+ import { deserializeRawArray } from "../simple/array/raw";
11
+ import { deserializeStringArray } from "../simple/array/string";
12
+ import { deserializeStructArray } from "../simple/array/struct";
13
+ import { deserializeIntegerArray_SIMD } from "../simd/array/integer";
14
+ import { deserializeIntegerArray_SWAR } from "../swar/array/integer";
15
+
16
+ export { deserializeArrayField, deserializeArrayField as deserializeArrayField_SWAR } from "../swar/array";
17
+
18
+ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
19
+ if (isString<valueof<T>>()) {
20
+ return <T>deserializeStringArray(srcStart, srcEnd, dst);
21
+ } else if (isBoolean<valueof<T>>()) {
22
+ return deserializeBooleanArray<T>(srcStart, srcEnd, dst);
23
+ } else if (isInteger<valueof<T>>()) {
24
+ if (JSON_MODE == JSONMode.SIMD) {
25
+ // @ts-ignore: integer array branch
26
+ return deserializeIntegerArray_SIMD<T>(srcStart, srcEnd, dst);
27
+ } else if (JSON_MODE == JSONMode.SWAR) {
28
+ // @ts-ignore: integer array branch
29
+ return deserializeIntegerArray_SWAR<T>(srcStart, srcEnd, dst);
30
+ } else {
31
+ // @ts-ignore: integer array branch
32
+ return deserializeIntegerArray_NAIVE<T>(srcStart, srcEnd, dst);
33
+ }
34
+ } else if (isFloat<valueof<T>>()) {
35
+ return deserializeFloatArray<T>(srcStart, srcEnd, dst);
36
+ } else if (isArray<valueof<T>>()) {
37
+ return deserializeArrayArray<T>(srcStart, srcEnd, dst);
38
+ } else if (isManaged<valueof<T>>() || isReference<valueof<T>>()) {
39
+ const type = changetype<nonnull<valueof<T>>>(0);
40
+ if (type instanceof JSON.Value) {
41
+ return deserializeArbitraryArray(srcStart, srcEnd, dst) as T;
42
+ } else if (type instanceof JSON.Box) {
43
+ return deserializeBoxArray<T>(srcStart, srcEnd, dst);
44
+ } else if (type instanceof JSON.Obj) {
45
+ return deserializeObjectArray<T>(srcStart, srcEnd, dst);
46
+ } else if (type instanceof JSON.Raw) {
47
+ return deserializeRawArray(srcStart, srcEnd, dst) as T;
48
+ } else if (type instanceof Map) {
49
+ return deserializeMapArray<T>(srcStart, srcEnd, dst);
50
+ // @ts-ignore: defined by transform
51
+ } else if (isDefined(type.__DESERIALIZE_CUSTOM)) {
52
+ return deserializeStructArray<T>(srcStart, srcEnd, dst);
53
+ // @ts-ignore: defined by transform
54
+ } else if (isDefined(type.__DESERIALIZE)) {
55
+ return deserializeStructArray<T>(srcStart, srcEnd, dst);
56
+ }
57
+ throw new Error("Could not parse array of type " + nameof<T>() + "!");
58
+ } else {
59
+ throw new Error("Could not parse array of type " + nameof<T>() + "!");
60
+ }
61
+ }
@@ -0,0 +1 @@
1
+ export { deserializeBoolean } from "../simple/bool";
@@ -0,0 +1 @@
1
+ export { deserializeDate } from "../simple/date";
@@ -0,0 +1 @@
1
+ export { deserializeFloat } from "../float";
@@ -0,0 +1 @@
1
+ export { deserializeInteger } from "../integer";
@@ -0,0 +1 @@
1
+ export { deserializeMap } from "../simple/map";
@@ -0,0 +1 @@
1
+ export { deserializeObject } from "../simple/object";
@@ -0,0 +1 @@
1
+ export { deserializeRaw } from "../simple/raw";
@@ -0,0 +1 @@
1
+ export { deserializeSet } from "../simple/set";
@@ -0,0 +1 @@
1
+ export { deserializeStaticArray } from "../simple/staticarray";
@@ -0,0 +1,15 @@
1
+ import { JSONMode } from "../..";
2
+ import { deserializeString as deserializeString_NAIVE } from "../simple/string";
3
+ import { deserializeString_SIMD } from "../simd/string";
4
+ import { deserializeString_SWAR } from "../swar/string";
5
+
6
+
7
+ @inline export function deserializeString(srcStart: usize, srcEnd: usize): string {
8
+ if (JSON_MODE == JSONMode.SIMD) {
9
+ return deserializeString_SIMD(srcStart, srcEnd);
10
+ } else if (JSON_MODE == JSONMode.NAIVE) {
11
+ return deserializeString_NAIVE(srcStart, srcEnd);
12
+ } else {
13
+ return deserializeString_SWAR(srcStart, srcEnd);
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ export { deserializeStruct } from "../simple/struct";
@@ -0,0 +1,15 @@
1
+ import { bytes } from "../../util";
2
+ export { deserializeArrayBuffer, deserializeTypedArray } from "../simple/typedarray";
3
+ import { deserializeArrayBuffer, deserializeTypedArray } from "../simple/typedarray";
4
+
5
+
6
+ @inline export function parseArrayBuffer(data: string): ArrayBuffer {
7
+ const dataSize = bytes(data);
8
+ const dataPtr = changetype<usize>(data);
9
+ return deserializeArrayBuffer(dataPtr, dataPtr + dataSize, 0);
10
+ }
11
+
12
+
13
+ @inline export function __deserializeArrayBuffer(srcStart: usize, srcEnd: usize, dst: usize = 0): ArrayBuffer {
14
+ return deserializeArrayBuffer(srcStart, srcEnd, dst);
15
+ }
@@ -0,0 +1 @@
1
+ export { deserializeUnsigned } from "../unsigned";
@@ -0,0 +1,14 @@
1
+ export * from "./index/arbitrary";
2
+ export * from "./index/array";
3
+ export * from "./index/bool";
4
+ export * from "./index/date";
5
+ export * from "./index/float";
6
+ export * from "./index/integer";
7
+ export * from "./index/map";
8
+ export * from "./index/object";
9
+ export * from "./index/raw";
10
+ export * from "./index/set";
11
+ export * from "./index/staticarray";
12
+ export * from "./index/string";
13
+ export * from "./index/struct";
14
+ export * from "./index/unsigned";
@@ -0,0 +1,42 @@
1
+ import { atoi } from "../util/atoi";
2
+
3
+ // @ts-ignore: inline
4
+ @inline export function deserializeInteger<T>(srcStart: usize, srcEnd: usize): T {
5
+ return atoi<T>(srcStart, srcEnd);
6
+ }
7
+
8
+ // @ts-ignore: inline
9
+ @inline export function deserializeIntegerField<T extends number>(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
10
+ let negative = false;
11
+ if (load<u16>(srcStart) == 45) {
12
+ negative = true;
13
+ srcStart += 2;
14
+ if (srcStart >= srcEnd) unreachable();
15
+ }
16
+
17
+ let digit = <u32>load<u16>(srcStart) - 48;
18
+ if (digit > 9) unreachable();
19
+
20
+ let value: u64 = digit;
21
+ srcStart += 2;
22
+ while (srcStart < srcEnd) {
23
+ digit = <u32>load<u16>(srcStart) - 48;
24
+ if (digit > 9) break;
25
+ value = value * 10 + digit;
26
+ srcStart += 2;
27
+ }
28
+
29
+ if (sizeof<T>() == sizeof<i8>()) {
30
+ store<i8>(fieldPtr, negative ? -(<i8>value) : <i8>value);
31
+ } else if (sizeof<T>() == sizeof<i16>()) {
32
+ store<i16>(fieldPtr, negative ? -(<i16>value) : <i16>value);
33
+ } else if (sizeof<T>() == sizeof<i32>()) {
34
+ store<i32>(fieldPtr, negative ? -(<i32>value) : <i32>value);
35
+ } else if (sizeof<T>() == sizeof<isize>()) {
36
+ store<isize>(fieldPtr, negative ? -(<isize>value) : <isize>value);
37
+ } else {
38
+ store<i64>(fieldPtr, negative ? -(<i64>value) : <i64>value);
39
+ }
40
+
41
+ return srcStart;
42
+ }
@@ -0,0 +1,307 @@
1
+ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
2
+ import { deserializeIntegerArray_SLOW } from "../../swar/array/integer";
3
+
4
+ const ASCII_LANE_MASK_4: u64 = 0x00ff00ff00ff00ff;
5
+ const ASCII_ZERO_4: u64 = 0x0030003000300030;
6
+
7
+
8
+ @lazy const SPLAT_30 = i16x8.splat(0x30);
9
+
10
+
11
+ @lazy const SPLAT_09 = i16x8.splat(9);
12
+
13
+
14
+ @lazy const ZERO_I16X8 = i16x8.splat(0);
15
+
16
+
17
+ @lazy const ZERO_I32X4 = i32x4.splat(0);
18
+
19
+
20
+ @lazy const PACK_WEIGHTS_10_1 = i8x16(10, 1, 10, 1, 10, 1, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0);
21
+
22
+
23
+ @lazy const PAIR_WEIGHTS_100_1 = i16x8(100, 1, 100, 1, 0, 0, 0, 0);
24
+
25
+
26
+ @inline function pushSignedInteger<T extends number[]>(out: T, value: i64): void {
27
+ if (sizeof<valueof<T>>() == sizeof<i8>()) {
28
+ out.push(<valueof<T>>(<i8>value));
29
+ } else if (sizeof<valueof<T>>() == sizeof<i16>()) {
30
+ out.push(<valueof<T>>(<i16>value));
31
+ } else if (sizeof<valueof<T>>() == sizeof<i32>()) {
32
+ out.push(<valueof<T>>(<i32>value));
33
+ } else if (sizeof<valueof<T>>() == sizeof<isize>()) {
34
+ out.push(<valueof<T>>(<isize>value));
35
+ } else {
36
+ out.push(<valueof<T>>value);
37
+ }
38
+ }
39
+
40
+
41
+ @inline function pushUnsignedInteger<T extends number[]>(out: T, value: u64): void {
42
+ if (sizeof<valueof<T>>() == sizeof<u8>()) {
43
+ out.push(<valueof<T>>(<u8>value));
44
+ } else if (sizeof<valueof<T>>() == sizeof<u16>()) {
45
+ out.push(<valueof<T>>(<u16>value));
46
+ } else if (sizeof<valueof<T>>() == sizeof<u32>()) {
47
+ out.push(<valueof<T>>(<u32>value));
48
+ } else if (sizeof<valueof<T>>() == sizeof<usize>()) {
49
+ out.push(<valueof<T>>(<usize>value));
50
+ } else {
51
+ out.push(<valueof<T>>value);
52
+ }
53
+ }
54
+
55
+
56
+ @inline function storeSignedInteger<T extends number[]>(slot: usize, value: i64): void {
57
+ if (sizeof<valueof<T>>() == sizeof<i8>()) {
58
+ store<i8>(slot, <i8>value);
59
+ } else if (sizeof<valueof<T>>() == sizeof<i16>()) {
60
+ store<i16>(slot, <i16>value);
61
+ } else if (sizeof<valueof<T>>() == sizeof<i32>()) {
62
+ store<i32>(slot, <i32>value);
63
+ } else if (sizeof<valueof<T>>() == sizeof<isize>()) {
64
+ store<isize>(slot, <isize>value);
65
+ } else {
66
+ store<i64>(slot, value);
67
+ }
68
+ }
69
+
70
+
71
+ @inline function storeUnsignedInteger<T extends number[]>(slot: usize, value: u64): void {
72
+ if (sizeof<valueof<T>>() == sizeof<u8>()) {
73
+ store<u8>(slot, <u8>value);
74
+ } else if (sizeof<valueof<T>>() == sizeof<u16>()) {
75
+ store<u16>(slot, <u16>value);
76
+ } else if (sizeof<valueof<T>>() == sizeof<u32>()) {
77
+ store<u32>(slot, <u32>value);
78
+ } else if (sizeof<valueof<T>>() == sizeof<usize>()) {
79
+ store<usize>(slot, <usize>value);
80
+ } else {
81
+ store<u64>(slot, value);
82
+ }
83
+ }
84
+
85
+
86
+ @inline function tryParseEightDigitsSIMD(srcStart: usize, value: u64): u64 {
87
+ const block = load<v128>(srcStart);
88
+ const digits = i16x8.sub(block, SPLAT_30);
89
+ if (v128.any_true(i16x8.gt_u(digits, SPLAT_09))) return 0;
90
+
91
+ const packed = i8x16.narrow_i16x8_u(digits, ZERO_I16X8);
92
+ const products = i16x8.extmul_low_i8x16_u(packed, PACK_WEIGHTS_10_1);
93
+ const pairs = i32x4.extadd_pairwise_i16x8_u(products);
94
+ const pairs16 = i16x8.narrow_i32x4_u(pairs, ZERO_I32X4);
95
+ const groups = i32x4.dot_i16x8_s(pairs16, PAIR_WEIGHTS_100_1);
96
+
97
+ const lo = i32x4.extract_lane(groups, 0);
98
+ const hi = i32x4.extract_lane(groups, 1);
99
+ return value * 100000000 + (<u64>lo * 10000 + <u64>hi);
100
+ }
101
+
102
+
103
+ @inline function parseSignedIntegerSIMD<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
104
+ let negative = false;
105
+ let code = load<u16>(srcStart);
106
+ if (code == 45) {
107
+ negative = true;
108
+ srcStart += 2;
109
+ if (srcStart >= srcEnd) return 0;
110
+ code = load<u16>(srcStart);
111
+ }
112
+
113
+ let digit = <u32>code - 48;
114
+ if (digit > 9) return 0;
115
+
116
+ let value: u64 = digit;
117
+ srcStart += 2;
118
+
119
+ while (srcStart + 14 < srcEnd) {
120
+ const next = tryParseEightDigitsSIMD(srcStart, value);
121
+ if (!next) break;
122
+ value = next;
123
+ srcStart += 16;
124
+ }
125
+
126
+ while (srcStart < srcEnd) {
127
+ digit = <u32>load<u16>(srcStart) - 48;
128
+ if (digit > 9) break;
129
+ value = value * 10 + digit;
130
+ srcStart += 2;
131
+ }
132
+
133
+ pushSignedInteger<T>(out, negative ? -(<i64>value) : <i64>value);
134
+ return srcStart;
135
+ }
136
+
137
+
138
+ @inline function parseUnsignedIntegerSIMD<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
139
+ let digit = <u32>load<u16>(srcStart) - 48;
140
+ if (digit > 9) return 0;
141
+
142
+ let value: u64 = digit;
143
+ srcStart += 2;
144
+
145
+ while (srcStart + 14 < srcEnd) {
146
+ const next = tryParseEightDigitsSIMD(srcStart, value);
147
+ if (!next) break;
148
+ value = next;
149
+ srcStart += 16;
150
+ }
151
+
152
+ while (srcStart < srcEnd) {
153
+ digit = <u32>load<u16>(srcStart) - 48;
154
+ if (digit > 9) break;
155
+ value = value * 10 + digit;
156
+ srcStart += 2;
157
+ }
158
+
159
+ pushUnsignedInteger<T>(out, value);
160
+ return srcStart;
161
+ }
162
+
163
+ // @ts-ignore: Decorator valid here
164
+ export function deserializeIntegerArray_SIMD<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
165
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
166
+ const originalSrcStart = srcStart;
167
+ const reusableLength = out.length;
168
+
169
+ if (reusableLength != 0) {
170
+ const dataStart = out.dataStart;
171
+ let index = 0;
172
+
173
+ do {
174
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
175
+ srcStart += 2;
176
+ if (srcStart >= srcEnd) break;
177
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
178
+ out.length = 0;
179
+ return out;
180
+ }
181
+
182
+ if (isSigned<valueof<T>>()) {
183
+ while (srcStart < srcEnd) {
184
+ let negative = false;
185
+ let code = load<u16>(srcStart);
186
+ if (code == 45) {
187
+ negative = true;
188
+ srcStart += 2;
189
+ if (srcStart >= srcEnd) break;
190
+ code = load<u16>(srcStart);
191
+ }
192
+
193
+ let digit = <u32>code - 48;
194
+ if (digit > 9) break;
195
+
196
+ let value: u64 = digit;
197
+ srcStart += 2;
198
+ while (srcStart + 14 < srcEnd) {
199
+ const next = tryParseEightDigitsSIMD(srcStart, value);
200
+ if (!next) break;
201
+ value = next;
202
+ srcStart += 16;
203
+ }
204
+ while (srcStart < srcEnd) {
205
+ digit = <u32>load<u16>(srcStart) - 48;
206
+ if (digit > 9) break;
207
+ value = value * 10 + digit;
208
+ srcStart += 2;
209
+ }
210
+
211
+ if (index >= reusableLength) break;
212
+ storeSignedInteger<T>(dataStart + <usize>index * sizeof<valueof<T>>(), negative ? -(<i64>value) : <i64>value);
213
+ index++;
214
+ if (srcStart >= srcEnd) break;
215
+
216
+ code = load<u16>(srcStart);
217
+ if (code == COMMA) {
218
+ srcStart += 2;
219
+ continue;
220
+ }
221
+ if (code == BRACKET_RIGHT) {
222
+ out.length = index;
223
+ return out;
224
+ }
225
+ break;
226
+ }
227
+ } else {
228
+ while (srcStart < srcEnd) {
229
+ let digit = <u32>load<u16>(srcStart) - 48;
230
+ if (digit > 9) break;
231
+
232
+ let value: u64 = digit;
233
+ srcStart += 2;
234
+ while (srcStart + 14 < srcEnd) {
235
+ const next = tryParseEightDigitsSIMD(srcStart, value);
236
+ if (!next) break;
237
+ value = next;
238
+ srcStart += 16;
239
+ }
240
+ while (srcStart < srcEnd) {
241
+ digit = <u32>load<u16>(srcStart) - 48;
242
+ if (digit > 9) break;
243
+ value = value * 10 + digit;
244
+ srcStart += 2;
245
+ }
246
+
247
+ if (index >= reusableLength) break;
248
+ storeUnsignedInteger<T>(dataStart + <usize>index * sizeof<valueof<T>>(), value);
249
+ index++;
250
+ if (srcStart >= srcEnd) break;
251
+
252
+ const code = load<u16>(srcStart);
253
+ if (code == COMMA) {
254
+ srcStart += 2;
255
+ continue;
256
+ }
257
+ if (code == BRACKET_RIGHT) {
258
+ out.length = index;
259
+ return out;
260
+ }
261
+ break;
262
+ }
263
+ }
264
+ } while (false);
265
+
266
+ srcStart = originalSrcStart;
267
+ }
268
+
269
+ out.length = 0;
270
+
271
+ do {
272
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
273
+ srcStart += 2;
274
+ if (srcStart >= srcEnd) break;
275
+ if (load<u16>(srcStart) == BRACKET_RIGHT) return out;
276
+
277
+ if (isSigned<valueof<T>>()) {
278
+ while (srcStart < srcEnd) {
279
+ srcStart = parseSignedIntegerSIMD<T>(srcStart, srcEnd, out);
280
+ if (!srcStart || srcStart >= srcEnd) break;
281
+
282
+ const code = load<u16>(srcStart);
283
+ if (code == COMMA) {
284
+ srcStart += 2;
285
+ continue;
286
+ }
287
+ if (code == BRACKET_RIGHT) return out;
288
+ break;
289
+ }
290
+ } else {
291
+ while (srcStart < srcEnd) {
292
+ srcStart = parseUnsignedIntegerSIMD<T>(srcStart, srcEnd, out);
293
+ if (!srcStart || srcStart >= srcEnd) break;
294
+
295
+ const code = load<u16>(srcStart);
296
+ if (code == COMMA) {
297
+ srcStart += 2;
298
+ continue;
299
+ }
300
+ if (code == BRACKET_RIGHT) return out;
301
+ break;
302
+ }
303
+ }
304
+ } while (false);
305
+
306
+ return deserializeIntegerArray_SLOW<T>(originalSrcStart, srcEnd, changetype<usize>(out));
307
+ }