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,461 @@
1
+ import { deserializeIntegerField } from "../../integer";
2
+ import { deserializeUnsignedField } from "../../unsigned";
3
+ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
4
+ import { isSpace } from "../../../util";
5
+ import { ensureArrayElementSlot, ensureArrayField } from "./shared";
6
+
7
+ const ASCII_LANE_MASK_4: u64 = 0x00ff00ff00ff00ff;
8
+ const ASCII_ZERO_4: u64 = 0x0030003000300030;
9
+ const ASCII_RANGE_MASK_4: u64 = 0xfff0fff0fff0fff0;
10
+ const ASCII_RANGE_ADD_4: u64 = 0x0006000600060006;
11
+
12
+
13
+ @inline function pushSignedInteger<T extends number[]>(out: T, value: i64): void {
14
+ if (sizeof<valueof<T>>() == sizeof<i8>()) {
15
+ out.push(<valueof<T>>(<i8>value));
16
+ } else if (sizeof<valueof<T>>() == sizeof<i16>()) {
17
+ out.push(<valueof<T>>(<i16>value));
18
+ } else if (sizeof<valueof<T>>() == sizeof<i32>()) {
19
+ out.push(<valueof<T>>(<i32>value));
20
+ } else if (sizeof<valueof<T>>() == sizeof<isize>()) {
21
+ out.push(<valueof<T>>(<isize>value));
22
+ } else {
23
+ out.push(<valueof<T>>value);
24
+ }
25
+ }
26
+
27
+
28
+ @inline function pushUnsignedInteger<T extends number[]>(out: T, value: u64): void {
29
+ if (sizeof<valueof<T>>() == sizeof<u8>()) {
30
+ out.push(<valueof<T>>(<u8>value));
31
+ } else if (sizeof<valueof<T>>() == sizeof<u16>()) {
32
+ out.push(<valueof<T>>(<u16>value));
33
+ } else if (sizeof<valueof<T>>() == sizeof<u32>()) {
34
+ out.push(<valueof<T>>(<u32>value));
35
+ } else if (sizeof<valueof<T>>() == sizeof<usize>()) {
36
+ out.push(<valueof<T>>(<usize>value));
37
+ } else {
38
+ out.push(<valueof<T>>value);
39
+ }
40
+ }
41
+
42
+
43
+ @inline function storeSignedInteger<T extends number[]>(slot: usize, value: i64): void {
44
+ if (sizeof<valueof<T>>() == sizeof<i8>()) {
45
+ store<i8>(slot, <i8>value);
46
+ } else if (sizeof<valueof<T>>() == sizeof<i16>()) {
47
+ store<i16>(slot, <i16>value);
48
+ } else if (sizeof<valueof<T>>() == sizeof<i32>()) {
49
+ store<i32>(slot, <i32>value);
50
+ } else if (sizeof<valueof<T>>() == sizeof<isize>()) {
51
+ store<isize>(slot, <isize>value);
52
+ } else {
53
+ store<i64>(slot, value);
54
+ }
55
+ }
56
+
57
+
58
+ @inline function storeUnsignedInteger<T extends number[]>(slot: usize, value: u64): void {
59
+ if (sizeof<valueof<T>>() == sizeof<u8>()) {
60
+ store<u8>(slot, <u8>value);
61
+ } else if (sizeof<valueof<T>>() == sizeof<u16>()) {
62
+ store<u16>(slot, <u16>value);
63
+ } else if (sizeof<valueof<T>>() == sizeof<u32>()) {
64
+ store<u32>(slot, <u32>value);
65
+ } else if (sizeof<valueof<T>>() == sizeof<usize>()) {
66
+ store<usize>(slot, <usize>value);
67
+ } else {
68
+ store<u64>(slot, value);
69
+ }
70
+ }
71
+
72
+
73
+ @inline function parse4DigitsASCII(block: u64): u32 {
74
+ const digits = (block & ASCII_LANE_MASK_4) - ASCII_ZERO_4;
75
+ if (((digits | (digits + ASCII_RANGE_ADD_4)) & ASCII_RANGE_MASK_4) != 0) return U32.MAX_VALUE;
76
+
77
+ return <u32>(<u32>(digits & 0xffff) * 1000 + <u32>((digits >> 16) & 0xffff) * 100 + <u32>((digits >> 32) & 0xffff) * 10 + <u32>(digits >> 48));
78
+ }
79
+
80
+
81
+ @inline function parseSignedIntegerScalar<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
82
+ let negative = false;
83
+ let code = load<u16>(srcStart);
84
+ if (code == 45) {
85
+ negative = true;
86
+ srcStart += 2;
87
+ if (srcStart >= srcEnd) return 0;
88
+ code = load<u16>(srcStart);
89
+ }
90
+
91
+ let digit = <u32>code - 48;
92
+ if (digit > 9) return 0;
93
+
94
+ let value: u64 = digit;
95
+ srcStart += 2;
96
+ while (srcStart < srcEnd) {
97
+ digit = <u32>load<u16>(srcStart) - 48;
98
+ if (digit > 9) break;
99
+ value = value * 10 + digit;
100
+ srcStart += 2;
101
+ }
102
+
103
+ pushSignedInteger<T>(out, negative ? -(<i64>value) : <i64>value);
104
+ return srcStart;
105
+ }
106
+
107
+
108
+ @inline function parseUnsignedIntegerScalar<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
109
+ let digit = <u32>load<u16>(srcStart) - 48;
110
+ if (digit > 9) return 0;
111
+
112
+ let value: u64 = digit;
113
+ srcStart += 2;
114
+ while (srcStart < srcEnd) {
115
+ digit = <u32>load<u16>(srcStart) - 48;
116
+ if (digit > 9) break;
117
+ value = value * 10 + digit;
118
+ srcStart += 2;
119
+ }
120
+
121
+ pushUnsignedInteger<T>(out, value);
122
+ return srcStart;
123
+ }
124
+
125
+
126
+ @inline function parseSignedIntegerSWAR<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
127
+ let negative = false;
128
+ let code = load<u16>(srcStart);
129
+ if (code == 45) {
130
+ negative = true;
131
+ srcStart += 2;
132
+ if (srcStart >= srcEnd) return 0;
133
+ code = load<u16>(srcStart);
134
+ }
135
+
136
+ let digit = <u32>code - 48;
137
+ if (digit > 9) return 0;
138
+
139
+ let value: u64 = digit;
140
+ srcStart += 2;
141
+
142
+ while (srcStart + 6 < srcEnd) {
143
+ const parsed = parse4DigitsASCII(load<u64>(srcStart));
144
+ if (parsed == U32.MAX_VALUE) break;
145
+ value = value * 10000 + parsed;
146
+ srcStart += 8;
147
+ }
148
+
149
+ while (srcStart < srcEnd) {
150
+ digit = <u32>load<u16>(srcStart) - 48;
151
+ if (digit > 9) break;
152
+ value = value * 10 + digit;
153
+ srcStart += 2;
154
+ }
155
+
156
+ pushSignedInteger<T>(out, negative ? -(<i64>value) : <i64>value);
157
+ return srcStart;
158
+ }
159
+
160
+
161
+ @inline function parseUnsignedIntegerSWAR<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
162
+ let digit = <u32>load<u16>(srcStart) - 48;
163
+ if (digit > 9) return 0;
164
+
165
+ let value: u64 = digit;
166
+ srcStart += 2;
167
+
168
+ while (srcStart + 6 < srcEnd) {
169
+ const parsed = parse4DigitsASCII(load<u64>(srcStart));
170
+ if (parsed == U32.MAX_VALUE) break;
171
+ value = value * 10000 + parsed;
172
+ srcStart += 8;
173
+ }
174
+
175
+ while (srcStart < srcEnd) {
176
+ digit = <u32>load<u16>(srcStart) - 48;
177
+ if (digit > 9) break;
178
+ value = value * 10 + digit;
179
+ srcStart += 2;
180
+ }
181
+
182
+ pushUnsignedInteger<T>(out, value);
183
+ return srcStart;
184
+ }
185
+
186
+
187
+ @inline function skipIntegerArrayWhitespace(srcStart: usize, srcEnd: usize): usize {
188
+ while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) {
189
+ srcStart += 2;
190
+ }
191
+ return srcStart;
192
+ }
193
+
194
+ // @ts-ignore: Decorator valid here
195
+ export function deserializeIntegerArray_SLOW<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
196
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
197
+ let index = 0;
198
+
199
+ out.length = 0;
200
+ srcStart = skipIntegerArrayWhitespace(srcStart, srcEnd);
201
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) {
202
+ throw new Error("Failed to parse JSON!");
203
+ }
204
+
205
+ srcStart += 2;
206
+ while (srcStart < srcEnd) {
207
+ srcStart = skipIntegerArrayWhitespace(srcStart, srcEnd);
208
+ if (srcStart >= srcEnd) break;
209
+
210
+ let code = load<u16>(srcStart);
211
+ if (code == BRACKET_RIGHT) return out;
212
+
213
+ if (isSigned<valueof<T>>()) {
214
+ let negative = false;
215
+ if (code == 45) {
216
+ negative = true;
217
+ srcStart += 2;
218
+ if (srcStart >= srcEnd) break;
219
+ code = load<u16>(srcStart);
220
+ }
221
+
222
+ let digit = <u32>code - 48;
223
+ if (digit > 9) break;
224
+
225
+ let value: u64 = digit;
226
+ srcStart += 2;
227
+ while (srcStart < srcEnd) {
228
+ digit = <u32>load<u16>(srcStart) - 48;
229
+ if (digit > 9) break;
230
+ value = value * 10 + digit;
231
+ srcStart += 2;
232
+ }
233
+
234
+ storeSignedInteger<T>(ensureArrayElementSlot<T>(out, index), negative ? -(<i64>value) : <i64>value);
235
+ } else {
236
+ let digit = <u32>code - 48;
237
+ if (digit > 9) break;
238
+
239
+ let value: u64 = digit;
240
+ srcStart += 2;
241
+ while (srcStart < srcEnd) {
242
+ digit = <u32>load<u16>(srcStart) - 48;
243
+ if (digit > 9) break;
244
+ value = value * 10 + digit;
245
+ srcStart += 2;
246
+ }
247
+
248
+ storeUnsignedInteger<T>(ensureArrayElementSlot<T>(out, index), value);
249
+ }
250
+
251
+ index++;
252
+ srcStart = skipIntegerArrayWhitespace(srcStart, srcEnd);
253
+ if (srcStart >= srcEnd) break;
254
+
255
+ code = load<u16>(srcStart);
256
+ if (code == COMMA) {
257
+ srcStart += 2;
258
+ continue;
259
+ }
260
+ if (code == BRACKET_RIGHT) return out;
261
+ break;
262
+ }
263
+
264
+ throw new Error("Failed to parse JSON!");
265
+ }
266
+
267
+
268
+ @inline function deserializeIntegerArrayImpl<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize, useSWAR: bool): T {
269
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
270
+ const originalSrcStart = srcStart;
271
+ const reusableLength = out.length;
272
+
273
+ if (useSWAR && reusableLength != 0) {
274
+ const dataStart = out.dataStart;
275
+ let index = 0;
276
+
277
+ do {
278
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
279
+ srcStart += 2;
280
+ if (srcStart >= srcEnd) break;
281
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
282
+ out.length = 0;
283
+ return out;
284
+ }
285
+
286
+ if (isSigned<valueof<T>>()) {
287
+ while (srcStart < srcEnd) {
288
+ let negative = false;
289
+ let code = load<u16>(srcStart);
290
+ if (code == 45) {
291
+ negative = true;
292
+ srcStart += 2;
293
+ if (srcStart >= srcEnd) break;
294
+ code = load<u16>(srcStart);
295
+ }
296
+
297
+ let digit = <u32>code - 48;
298
+ if (digit > 9) break;
299
+
300
+ let value: u64 = digit;
301
+ srcStart += 2;
302
+
303
+ while (srcStart + 6 < srcEnd) {
304
+ const parsed = parse4DigitsASCII(load<u64>(srcStart));
305
+ if (parsed == U32.MAX_VALUE) break;
306
+ value = value * 10000 + parsed;
307
+ srcStart += 8;
308
+ }
309
+
310
+ while (srcStart < srcEnd) {
311
+ digit = <u32>load<u16>(srcStart) - 48;
312
+ if (digit > 9) break;
313
+ value = value * 10 + digit;
314
+ srcStart += 2;
315
+ }
316
+
317
+ if (index >= reusableLength) break;
318
+ storeSignedInteger<T>(dataStart + <usize>index * sizeof<valueof<T>>(), negative ? -(<i64>value) : <i64>value);
319
+ index++;
320
+ if (srcStart >= srcEnd) break;
321
+
322
+ code = load<u16>(srcStart);
323
+ if (code == COMMA) {
324
+ srcStart += 2;
325
+ continue;
326
+ }
327
+ if (code == BRACKET_RIGHT) {
328
+ out.length = index;
329
+ return out;
330
+ }
331
+ break;
332
+ }
333
+ } else {
334
+ while (srcStart < srcEnd) {
335
+ let digit = <u32>load<u16>(srcStart) - 48;
336
+ if (digit > 9) break;
337
+
338
+ let value: u64 = digit;
339
+ srcStart += 2;
340
+
341
+ while (srcStart + 6 < srcEnd) {
342
+ const parsed = parse4DigitsASCII(load<u64>(srcStart));
343
+ if (parsed == U32.MAX_VALUE) break;
344
+ value = value * 10000 + parsed;
345
+ srcStart += 8;
346
+ }
347
+
348
+ while (srcStart < srcEnd) {
349
+ digit = <u32>load<u16>(srcStart) - 48;
350
+ if (digit > 9) break;
351
+ value = value * 10 + digit;
352
+ srcStart += 2;
353
+ }
354
+
355
+ if (index >= reusableLength) break;
356
+ storeUnsignedInteger<T>(dataStart + <usize>index * sizeof<valueof<T>>(), value);
357
+ index++;
358
+ if (srcStart >= srcEnd) break;
359
+
360
+ const code = load<u16>(srcStart);
361
+ if (code == COMMA) {
362
+ srcStart += 2;
363
+ continue;
364
+ }
365
+ if (code == BRACKET_RIGHT) {
366
+ out.length = index;
367
+ return out;
368
+ }
369
+ break;
370
+ }
371
+ }
372
+ } while (false);
373
+
374
+ srcStart = originalSrcStart;
375
+ }
376
+
377
+ out.length = 0;
378
+
379
+ do {
380
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
381
+ srcStart += 2;
382
+ if (srcStart >= srcEnd) break;
383
+ if (load<u16>(srcStart) == BRACKET_RIGHT) return out;
384
+
385
+ if (isSigned<valueof<T>>()) {
386
+ while (srcStart < srcEnd) {
387
+ srcStart = useSWAR ? parseSignedIntegerSWAR<T>(srcStart, srcEnd, out) : parseSignedIntegerScalar<T>(srcStart, srcEnd, out);
388
+ if (!srcStart || srcStart >= srcEnd) break;
389
+
390
+ const code = load<u16>(srcStart);
391
+ if (code == COMMA) {
392
+ srcStart += 2;
393
+ continue;
394
+ }
395
+ if (code == BRACKET_RIGHT) return out;
396
+ break;
397
+ }
398
+ } else {
399
+ while (srcStart < srcEnd) {
400
+ srcStart = useSWAR ? parseUnsignedIntegerSWAR<T>(srcStart, srcEnd, out) : parseUnsignedIntegerScalar<T>(srcStart, srcEnd, out);
401
+ if (!srcStart || srcStart >= srcEnd) break;
402
+
403
+ const code = load<u16>(srcStart);
404
+ if (code == COMMA) {
405
+ srcStart += 2;
406
+ continue;
407
+ }
408
+ if (code == BRACKET_RIGHT) return out;
409
+ break;
410
+ }
411
+ }
412
+ } while (false);
413
+
414
+ return deserializeIntegerArray_SLOW<T>(originalSrcStart, srcEnd, changetype<usize>(out));
415
+ }
416
+
417
+ // @ts-ignore: Decorator valid here
418
+ export function deserializeIntegerArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
419
+ return deserializeIntegerArrayImpl<T>(srcStart, srcEnd, dst, false);
420
+ }
421
+
422
+ // @ts-ignore: Decorator valid here
423
+ export function deserializeIntegerArray_SWAR<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
424
+ return deserializeIntegerArrayImpl<T>(srcStart, srcEnd, dst, true);
425
+ }
426
+
427
+
428
+ @inline export function deserializeIntegerArrayField<T extends number[]>(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
429
+ const out = ensureArrayField<T>(fieldPtr);
430
+ let index = 0;
431
+
432
+ do {
433
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
434
+ srcStart += 2;
435
+ if (srcStart >= srcEnd) break;
436
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
437
+ out.length = 0;
438
+ return srcStart + 2;
439
+ }
440
+
441
+ while (srcStart < srcEnd) {
442
+ const slot = ensureArrayElementSlot<T>(out, index);
443
+ srcStart = isSigned<valueof<T>>() ? deserializeIntegerField<valueof<T>>(srcStart, srcEnd, slot) : deserializeUnsignedField<valueof<T>>(srcStart, srcEnd, slot);
444
+ if (!srcStart || srcStart >= srcEnd) break;
445
+
446
+ const code = load<u16>(srcStart);
447
+ if (code == COMMA) {
448
+ srcStart += 2;
449
+ index++;
450
+ continue;
451
+ }
452
+ if (code == BRACKET_RIGHT) {
453
+ out.length = index + 1;
454
+ return srcStart + 2;
455
+ }
456
+ break;
457
+ }
458
+ } while (false);
459
+
460
+ throw new Error("Failed to parse JSON!");
461
+ }
@@ -0,0 +1,7 @@
1
+ import { ensureArrayField } from "./shared";
2
+
3
+
4
+ @inline export function deserializeMapArrayField<T extends Map<any, any>[]>(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
5
+ ensureArrayField<T>(fieldPtr);
6
+ throw new Error("Failed to parse JSON!");
7
+ }
@@ -0,0 +1,44 @@
1
+ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
2
+ import { ensureArrayElementSlot, ensureArrayField } from "./shared";
3
+
4
+
5
+ @inline export function deserializeObjectArrayField<T extends unknown[]>(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
6
+ const out = ensureArrayField<T>(fieldPtr);
7
+ let index = 0;
8
+
9
+ do {
10
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
11
+ srcStart += 2;
12
+ if (srcStart >= srcEnd) break;
13
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
14
+ out.length = 0;
15
+ return srcStart + 2;
16
+ }
17
+
18
+ while (srcStart < srcEnd) {
19
+ const slot = ensureArrayElementSlot<T>(out, index);
20
+ let value = load<valueof<T>>(slot);
21
+ if (changetype<usize>(value) == 0) {
22
+ value = changetype<valueof<T>>(instantiate<nonnull<valueof<T>>>());
23
+ store<valueof<T>>(slot, value);
24
+ }
25
+
26
+ srcStart = changetype<nonnull<valueof<T>>>(value).__DESERIALIZE<valueof<T>>(srcStart, srcEnd, value);
27
+ if (!srcStart || srcStart >= srcEnd) break;
28
+
29
+ const code = load<u16>(srcStart);
30
+ if (code == COMMA) {
31
+ srcStart += 2;
32
+ index++;
33
+ continue;
34
+ }
35
+ if (code == BRACKET_RIGHT) {
36
+ out.length = index + 1;
37
+ return srcStart + 2;
38
+ }
39
+ break;
40
+ }
41
+ } while (false);
42
+
43
+ throw new Error("Failed to parse JSON!");
44
+ }
@@ -0,0 +1,8 @@
1
+ import { JSON } from "../../..";
2
+ import { ensureArrayField } from "./shared";
3
+
4
+
5
+ @inline export function deserializeRawArrayField(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
6
+ ensureArrayField<JSON.Raw[]>(fieldPtr);
7
+ throw new Error("Failed to parse JSON!");
8
+ }
@@ -0,0 +1,96 @@
1
+ import { BACK_SLASH, BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT, COMMA, QUOTE } from "../../../custom/chars";
2
+
3
+
4
+ @inline export function ensureArrayField<T extends Array<any>>(fieldPtr: usize): T {
5
+ let out = load<T>(fieldPtr);
6
+ if (!changetype<usize>(out)) {
7
+ out = changetype<T>(instantiate<T>());
8
+ store<T>(fieldPtr, out);
9
+ } else {
10
+ out.length = 0;
11
+ }
12
+ return out;
13
+ }
14
+
15
+
16
+ @inline function backslashOrQuoteMask(block: u64): u64 {
17
+ const b = block ^ 0x005c_005c_005c_005c;
18
+ const q = block ^ 0x0022_0022_0022_0022;
19
+ return (((q - 0x0001_0001_0001_0001) & ~q) | ((b - 0x0001_0001_0001_0001) & ~b)) & 0x0080_0080_0080_0080;
20
+ }
21
+
22
+
23
+ @inline export function ensureArrayElementSlot<T extends Array<any>>(out: T, index: i32): usize {
24
+ const nextLength = index + 1;
25
+ if (out.length < nextLength) out.length = nextLength;
26
+ return out.dataStart + <usize>index * sizeof<valueof<T>>();
27
+ }
28
+
29
+
30
+ @inline export function scanQuotedValueEnd_SWAR(srcStart: usize, srcEnd: usize): usize {
31
+ srcStart += 2;
32
+ const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
33
+
34
+ while (srcStart <= srcEnd8) {
35
+ let mask = inline.always(backslashOrQuoteMask(load<u64>(srcStart)));
36
+ if (mask === 0) {
37
+ srcStart += 8;
38
+ continue;
39
+ }
40
+
41
+ do {
42
+ const laneIdx = usize(ctz(mask) >> 3);
43
+ mask &= mask - 1;
44
+ const srcIdx = srcStart + laneIdx;
45
+ const char = load<u16>(srcIdx);
46
+ if (char == QUOTE) return srcIdx + 2;
47
+ if (char == BACK_SLASH) break;
48
+ } while (mask !== 0);
49
+
50
+ break;
51
+ }
52
+
53
+ while (srcStart < srcEnd) {
54
+ const char = load<u16>(srcStart);
55
+ if (char == QUOTE && load<u16>(srcStart - 2) != BACK_SLASH) return srcStart + 2;
56
+ srcStart += 2;
57
+ }
58
+
59
+ return 0;
60
+ }
61
+
62
+
63
+ @inline export function scanValueEnd(srcStart: usize, srcEnd: usize): usize {
64
+ if (srcStart >= srcEnd) return 0;
65
+ const first = load<u16>(srcStart);
66
+
67
+ if (first == QUOTE) return scanQuotedValueEnd_SWAR(srcStart, srcEnd);
68
+
69
+ if (first == BRACE_LEFT || first == BRACKET_LEFT) {
70
+ let depth: i32 = 1;
71
+ let ptr = srcStart + 2;
72
+ while (ptr < srcEnd) {
73
+ const code = load<u16>(ptr);
74
+ if (code == QUOTE) {
75
+ ptr = scanQuotedValueEnd_SWAR(ptr, srcEnd);
76
+ if (!ptr) return 0;
77
+ continue;
78
+ }
79
+ if (code == BRACE_LEFT || code == BRACKET_LEFT) {
80
+ depth++;
81
+ } else if (code == BRACE_RIGHT || code == BRACKET_RIGHT) {
82
+ if (--depth == 0) return ptr + 2;
83
+ }
84
+ ptr += 2;
85
+ }
86
+ return 0;
87
+ }
88
+
89
+ while (srcStart < srcEnd) {
90
+ const code = load<u16>(srcStart);
91
+ if (code == COMMA || code == BRACKET_RIGHT) return srcStart;
92
+ srcStart += 2;
93
+ }
94
+
95
+ return 0;
96
+ }
@@ -0,0 +1,39 @@
1
+ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
2
+ import { ensureArrayElementSlot, ensureArrayField } from "./shared";
3
+ import { deserializeStringField_SWAR } from "../string";
4
+
5
+
6
+ @inline export function deserializeStringArrayField<T extends string[]>(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
7
+ const out = ensureArrayField<T>(fieldPtr);
8
+ let index = 0;
9
+
10
+ do {
11
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
12
+ srcStart += 2;
13
+ if (srcStart >= srcEnd) break;
14
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
15
+ out.length = 0;
16
+ return srcStart + 2;
17
+ }
18
+
19
+ while (srcStart < srcEnd) {
20
+ const slot = ensureArrayElementSlot<T>(out, index);
21
+ srcStart = deserializeStringField_SWAR<valueof<T>>(srcStart, srcEnd, slot);
22
+ if (!srcStart || srcStart >= srcEnd) break;
23
+
24
+ const code = load<u16>(srcStart);
25
+ if (code == COMMA) {
26
+ srcStart += 2;
27
+ index++;
28
+ continue;
29
+ }
30
+ if (code == BRACKET_RIGHT) {
31
+ out.length = index + 1;
32
+ return srcStart + 2;
33
+ }
34
+ break;
35
+ }
36
+ } while (false);
37
+
38
+ throw new Error("Failed to parse JSON!");
39
+ }
@@ -0,0 +1,44 @@
1
+ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
2
+ import { ensureArrayElementSlot, ensureArrayField } from "./shared";
3
+
4
+
5
+ @inline export function deserializeStructArrayField<T extends unknown[]>(srcStart: usize, srcEnd: usize, fieldPtr: usize): usize {
6
+ const out = ensureArrayField<T>(fieldPtr);
7
+ let index = 0;
8
+
9
+ do {
10
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
11
+ srcStart += 2;
12
+ if (srcStart >= srcEnd) break;
13
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
14
+ out.length = 0;
15
+ return srcStart + 2;
16
+ }
17
+
18
+ while (srcStart < srcEnd) {
19
+ const slot = ensureArrayElementSlot<T>(out, index);
20
+ let value = load<valueof<T>>(slot);
21
+ if (changetype<usize>(value) == 0) {
22
+ value = changetype<valueof<T>>(instantiate<nonnull<valueof<T>>>());
23
+ store<valueof<T>>(slot, value);
24
+ }
25
+
26
+ srcStart = changetype<nonnull<valueof<T>>>(value).__DESERIALIZE<valueof<T>>(srcStart, srcEnd, value);
27
+ if (!srcStart || srcStart >= srcEnd) break;
28
+
29
+ const code = load<u16>(srcStart);
30
+ if (code == COMMA) {
31
+ srcStart += 2;
32
+ index++;
33
+ continue;
34
+ }
35
+ if (code == BRACKET_RIGHT) {
36
+ out.length = index + 1;
37
+ return srcStart + 2;
38
+ }
39
+ break;
40
+ }
41
+ } while (false);
42
+
43
+ throw new Error("Failed to parse JSON!");
44
+ }