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
@@ -1,13 +1,15 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
+ import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
3
+ import { QUOTE } from "../../custom/chars";
2
4
  import { BACK_SLASH } from "../../custom/chars";
3
- import {
4
- DESERIALIZE_ESCAPE_TABLE,
5
- ESCAPE_HEX_TABLE,
6
- } from "../../globals/tables";
5
+ import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables";
7
6
  import { hex4_to_u16_swar } from "../../util/swar";
7
+ import { deserializeStringField_SWAR } from "../swar/string";
8
8
 
9
9
  // @ts-expect-error: @lazy is a valid decorator
10
10
  @lazy const SPLAT_5C = i16x8.splat(0x5c); // \
11
+ // @ts-expect-error: @lazy is a valid decorator
12
+ @lazy const SPLAT_22 = i16x8.splat(0x22); // "
11
13
 
12
14
  // Overflow Pattern for Unicode Escapes (READ)
13
15
  // \u0001 0 \u0001__| + 0
@@ -61,13 +63,48 @@ import { hex4_to_u16_swar } from "../../util/swar";
61
63
  * @param dst buffer to write to
62
64
  * @returns number of bytes written
63
65
  */
66
+ // @ts-expect-error: @inline is a valid decorator
67
+ @inline function copyStringFromSource_SIMD(srcStart: usize, byteLength: usize): string {
68
+ if (byteLength == 0) return changetype<string>("");
69
+ // @ts-expect-error: __new is a runtime builtin
70
+ const out = __new(byteLength, idof<string>());
71
+ memory.copy(out, srcStart, byteLength);
72
+ return changetype<string>(out);
73
+ }
74
+
75
+ // @ts-expect-error: @inline is a valid decorator
76
+ @inline function writeStringToField_SIMD(dstFieldPtr: usize, srcStart: usize, byteLength: u32): void {
77
+ if (byteLength == 0) {
78
+ store<usize>(dstFieldPtr, changetype<usize>(""));
79
+ return;
80
+ }
81
+
82
+ const current = load<usize>(dstFieldPtr);
83
+ let stringPtr: usize;
84
+ if (current != 0 && changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
85
+ stringPtr = current;
86
+ } else if (current != 0 && current != changetype<usize>("")) {
87
+ stringPtr = __renew(current, byteLength);
88
+ store<usize>(dstFieldPtr, stringPtr);
89
+ } else {
90
+ stringPtr = __new(byteLength, idof<string>());
91
+ store<usize>(dstFieldPtr, stringPtr);
92
+ }
93
+ memory.copy(stringPtr, srcStart, byteLength);
94
+ }
95
+
64
96
  // todo: optimize and stuff. it works, its not pretty. ideally, i'd like this to be (nearly) branchless
65
- export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
66
- // Strip quotes
67
- srcStart += 2;
68
- srcEnd -= 2;
97
+ // @ts-expect-error: @inline is a valid decorator
98
+ @inline function deserializeEscapedString_SIMD(payloadStart: usize, escapeStart: usize, srcEnd: usize): string {
99
+ const prefixLen = <u32>(escapeStart - payloadStart);
100
+ let srcStart = escapeStart;
69
101
  const srcEnd16 = srcEnd - 16;
102
+ const outStart = bs.offset - bs.buffer;
70
103
  bs.ensureSize(u32(srcEnd - srcStart));
104
+ if (prefixLen != 0) {
105
+ memory.copy(bs.offset, payloadStart, prefixLen);
106
+ bs.offset += prefixLen;
107
+ }
71
108
 
72
109
  while (srcStart < srcEnd16) {
73
110
  const block = load<v128>(srcStart);
@@ -145,8 +182,7 @@ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
145
182
  const code = load<u16>(srcStart);
146
183
  if (code !== 0x75) {
147
184
  // Short escapes (\n \t \" \\)
148
- const block = load<u16>(srcStart);
149
- const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
185
+ const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
150
186
  store<u16>(bs.offset, escape);
151
187
  srcStart += 2;
152
188
  } else {
@@ -159,5 +195,88 @@ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
159
195
  bs.offset += 2;
160
196
  }
161
197
 
162
- return bs.out<string>();
198
+ return bs.sliceOut<string>(outStart);
199
+ }
200
+
201
+ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
202
+ // Strip quotes
203
+ srcStart += 2;
204
+ srcEnd -= 2;
205
+ const payloadStart = srcStart;
206
+ const srcEnd16 = srcEnd - 16;
207
+
208
+ while (srcStart < srcEnd16) {
209
+ const block = load<v128>(srcStart);
210
+ const eq5C = i16x8.eq(block, SPLAT_5C);
211
+
212
+ if (!v128.any_true(eq5C)) {
213
+ srcStart += 16;
214
+ continue;
215
+ }
216
+
217
+ const laneIdx = usize(ctz(i16x8.bitmask(eq5C)) << 1);
218
+ return inline.always(deserializeEscapedString_SIMD(payloadStart, srcStart + laneIdx, srcEnd));
219
+ }
220
+
221
+ while (srcStart < srcEnd) {
222
+ if (load<u16>(srcStart) == BACK_SLASH) {
223
+ return inline.always(deserializeEscapedString_SIMD(payloadStart, srcStart, srcEnd));
224
+ }
225
+ srcStart += 2;
226
+ }
227
+
228
+ return copyStringFromSource_SIMD(payloadStart, srcEnd - payloadStart);
229
+ }
230
+
231
+ // @ts-expect-error: @inline is a valid decorator
232
+ @inline export function deserializeStringField_SIMD<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
233
+ if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
234
+
235
+ const quotedStart = srcStart;
236
+ const payloadStart = srcStart + 2;
237
+ const srcEnd16 = srcEnd >= 16 ? srcEnd - 16 : 0;
238
+ srcStart = payloadStart;
239
+
240
+ while (srcStart <= srcEnd16) {
241
+ const block = load<v128>(srcStart);
242
+ let mask = i16x8.bitmask(v128.or(i16x8.eq(block, SPLAT_5C), i16x8.eq(block, SPLAT_22)));
243
+
244
+ if (mask == 0) {
245
+ srcStart += 16;
246
+ continue;
247
+ }
248
+
249
+ do {
250
+ const laneIdx = usize(ctz(mask) << 1);
251
+ mask &= mask - 1;
252
+ const srcIdx = srcStart + laneIdx;
253
+ const char = load<u16>(srcIdx);
254
+
255
+ if (char == QUOTE) {
256
+ writeStringToField_SIMD(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
257
+ return srcIdx + 2;
258
+ }
259
+
260
+ if (char == BACK_SLASH) {
261
+ return deserializeStringField_SWAR<T>(quotedStart, srcEnd, dstFieldPtr);
262
+ }
263
+ } while (mask != 0);
264
+
265
+ srcStart += 16;
266
+ }
267
+
268
+ while (srcStart < srcEnd) {
269
+ const char = load<u16>(srcStart);
270
+ if (char == QUOTE) {
271
+ writeStringToField_SIMD(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
272
+ return srcStart + 2;
273
+ }
274
+ if (char == BACK_SLASH) {
275
+ return deserializeStringField_SWAR<T>(quotedStart, srcEnd, dstFieldPtr);
276
+ }
277
+ srcStart += 2;
278
+ }
279
+
280
+ abort("Unterminated string literal");
281
+ return srcStart;
163
282
  }
@@ -1,27 +1,20 @@
1
1
  import { JSON } from "../..";
2
2
  import { deserializeArray } from "./array";
3
3
  import { deserializeBoolean } from "./bool";
4
- import { deserializeFloat } from "./float";
4
+ import { deserializeFloat } from "../float";
5
5
  import { deserializeString } from "./string";
6
6
  import { deserializeObject } from "./object";
7
7
  import { BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE } from "../../custom/chars";
8
8
 
9
- export function deserializeArbitrary(
10
- srcStart: usize,
11
- srcEnd: usize,
12
- dst: usize,
13
- ): JSON.Value {
9
+ export function deserializeArbitrary(srcStart: usize, srcEnd: usize, dst: usize): JSON.Value {
14
10
  const firstChar = load<u16>(srcStart);
15
11
  if (firstChar == QUOTE) {
16
12
  return JSON.Value.from(deserializeString(srcStart, srcEnd));
17
- } else if (firstChar == BRACE_LEFT)
18
- return JSON.Value.from(deserializeObject(srcStart, srcEnd, 0));
19
- else if (firstChar - 48 <= 9 || firstChar == 45)
20
- return JSON.Value.from(deserializeFloat<f64>(srcStart, srcEnd));
13
+ } else if (firstChar == BRACE_LEFT) return JSON.Value.from(deserializeObject(srcStart, srcEnd, 0));
14
+ else if (firstChar - 48 <= 9 || firstChar == 45) return JSON.Value.from(deserializeFloat<f64>(srcStart, srcEnd));
21
15
  else if (firstChar == BRACKET_LEFT) {
22
16
  return JSON.Value.from(deserializeArray<JSON.Value[]>(srcStart, srcEnd, 0));
23
- } else if (firstChar == 116 || firstChar == 102)
24
- return JSON.Value.from(deserializeBoolean(srcStart, srcEnd));
17
+ } else if (firstChar == 116 || firstChar == 102) return JSON.Value.from(deserializeBoolean(srcStart, srcEnd));
25
18
  else if (firstChar == CHAR_N) {
26
19
  const value = JSON.Value.from<usize>(0);
27
20
  return value;
@@ -1,27 +1,10 @@
1
- import {
2
- BACK_SLASH,
3
- BRACE_LEFT,
4
- BRACE_RIGHT,
5
- BRACKET_LEFT,
6
- BRACKET_RIGHT,
7
- CHAR_F,
8
- CHAR_N,
9
- CHAR_T,
10
- COMMA,
11
- QUOTE,
12
- } from "../../../custom/chars";
1
+ import { BACK_SLASH, BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT, CHAR_F, CHAR_N, CHAR_T, COMMA, QUOTE } from "../../../custom/chars";
13
2
  import { JSON } from "../../../";
14
- import { isSpace } from "util/string";
3
+ import { isSpace, scanStringEnd } from "../../../util";
15
4
  import { ptrToStr } from "../../../util/ptrToStr";
16
5
 
17
- export function deserializeArbitraryArray(
18
- srcStart: usize,
19
- srcEnd: usize,
20
- dst: usize,
21
- ): JSON.Value[] {
22
- const out = changetype<JSON.Value[]>(
23
- dst || changetype<usize>(instantiate<JSON.Value[]>()),
24
- );
6
+ export function deserializeArbitraryArray(srcStart: usize, srcEnd: usize, dst: usize): JSON.Value[] {
7
+ const out = changetype<JSON.Value[]>(dst || changetype<usize>(instantiate<JSON.Value[]>()));
25
8
  let lastIndex: usize = 0;
26
9
  let depth: u32 = 0;
27
10
  // if (load<u16>(srcStart) != BRACKET_LEFT)
@@ -47,21 +30,11 @@ export function deserializeArbitraryArray(
47
30
  }
48
31
  } else if (code == QUOTE) {
49
32
  lastIndex = srcStart;
33
+ srcStart = scanStringEnd(srcStart, srcEnd);
34
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
35
+ // @ts-ignore: exists
36
+ out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
50
37
  srcStart += 2;
51
- while (srcStart < srcEnd) {
52
- const code = load<u16>(srcStart);
53
- if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
54
- // while (isSpace(load<u16>((srcStart += 2)))) {
55
- // /* empty */
56
- // }
57
- // console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
58
- // @ts-ignore: exists
59
- out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
60
- srcStart += 2;
61
- break;
62
- }
63
- srcStart += 2;
64
- }
65
38
  // console.log("next: " + String.fromCharCode(load<u16>(srcStart)));
66
39
  } else if (code - 48 <= 9 || code == 45) {
67
40
  // console.log("trigger int")
@@ -103,7 +76,10 @@ export function deserializeArbitraryArray(
103
76
  srcStart += 2;
104
77
  while (srcStart < srcEnd) {
105
78
  const code = load<u16>(srcStart);
106
- if (code == BRACKET_RIGHT) {
79
+ if (code == QUOTE) {
80
+ srcStart = scanStringEnd(srcStart, srcEnd);
81
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
82
+ } else if (code == BRACKET_RIGHT) {
107
83
  if (--depth == 0) {
108
84
  // @ts-ignore: type
109
85
  out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
@@ -1,14 +1,8 @@
1
1
  import { BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars";
2
2
  import { JSON } from "../../../";
3
3
 
4
- export function deserializeArrayArray<T extends unknown[][]>(
5
- srcStart: usize,
6
- srcEnd: usize,
7
- dst: usize,
8
- ): T {
9
- const out = changetype<nonnull<T>>(
10
- dst || changetype<usize>(instantiate<T>()),
11
- );
4
+ export function deserializeArrayArray<T extends unknown[][]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
12
6
  let lastIndex: usize = 0;
13
7
  let depth: u32 = 0;
14
8
  srcStart += 2;
@@ -1,11 +1,5 @@
1
- export function deserializeBooleanArray<T extends boolean[]>(
2
- srcStart: usize,
3
- srcEnd: usize,
4
- dst: usize,
5
- ): T {
6
- const out = changetype<nonnull<T>>(
7
- dst || changetype<usize>(instantiate<T>()),
8
- );
1
+ export function deserializeBooleanArray<T extends boolean[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
2
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
9
3
  srcStart += 2; // skip [
10
4
  while (srcStart < srcEnd) {
11
5
  const block = load<u64>(srcStart);
@@ -2,14 +2,8 @@ import { isSpace } from "../../../util";
2
2
  import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
3
3
  import { JSON } from "../../..";
4
4
 
5
- export function deserializeBoxArray<T extends JSON.Box<any>[]>(
6
- srcStart: usize,
7
- srcEnd: usize,
8
- dst: usize,
9
- ): T {
10
- const out = changetype<nonnull<T>>(
11
- dst || changetype<usize>(instantiate<T>()),
12
- );
5
+ export function deserializeBoxArray<T extends JSON.Box<any>[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
13
7
  if (isBoolean<valueof<T>>()) {
14
8
  srcStart += 2; // skip [
15
9
  while (srcStart < srcEnd) {
@@ -2,14 +2,8 @@ import { isSpace } from "../../../util";
2
2
  import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
3
3
  import { JSON } from "../../..";
4
4
 
5
- export function deserializeFloatArray<T extends number[]>(
6
- srcStart: usize,
7
- srcEnd: usize,
8
- dst: usize,
9
- ): T {
10
- const out = changetype<nonnull<T>>(
11
- dst || changetype<usize>(instantiate<T>()),
12
- );
5
+ export function deserializeFloatArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
13
7
  let lastIndex: usize = 0;
14
8
  while (srcStart < srcEnd) {
15
9
  const code = load<u16>(srcStart);
@@ -1,14 +1,8 @@
1
1
  import { atoi, isSpace } from "../../../util";
2
2
  import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
3
3
 
4
- export function deserializeIntegerArray<T extends number[]>(
5
- srcStart: usize,
6
- srcEnd: usize,
7
- dst: usize,
8
- ): T {
9
- const out = changetype<nonnull<T>>(
10
- dst || changetype<usize>(instantiate<T>()),
11
- );
4
+ export function deserializeIntegerArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
12
6
  let lastIndex: usize = 0;
13
7
  while (srcStart < srcEnd) {
14
8
  const code = load<u16>(srcStart);
@@ -1,39 +1,19 @@
1
- import {
2
- BRACE_LEFT,
3
- BRACE_RIGHT,
4
- BRACKET_LEFT,
5
- BRACKET_RIGHT,
6
- } from "../../../custom/chars";
1
+ import { BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars";
7
2
  import { JSON } from "../../..";
8
3
  import { isSpace } from "util/string";
9
4
 
10
- export function deserializeMapArray<T extends Map<any, any>[]>(
11
- srcStart: usize,
12
- srcEnd: usize,
13
- dst: usize,
14
- ): T {
15
- const out = changetype<nonnull<T>>(
16
- dst || changetype<usize>(instantiate<T>()),
17
- );
5
+ export function deserializeMapArray<T extends Map<any, any>[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
18
7
  let lastIndex: usize = 0;
19
8
  let depth: u32 = 0;
20
9
 
21
10
  while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
22
11
  while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
23
12
 
24
- if (srcStart - srcEnd == 0)
25
- throw new Error("Input string had zero length or was all whitespace");
13
+ if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
26
14
 
27
- if (load<u16>(srcStart) != BRACKET_LEFT)
28
- throw new Error(
29
- "Expected '[' at start of object at position " +
30
- (srcEnd - srcStart).toString(),
31
- );
32
- if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
33
- throw new Error(
34
- "Expected ']' at end of object at position " +
35
- (srcEnd - srcStart).toString(),
36
- );
15
+ if (load<u16>(srcStart) != BRACKET_LEFT) throw new Error("Expected '[' at start of object at position " + (srcEnd - srcStart).toString());
16
+ if (load<u16>(srcEnd - 2) != BRACKET_RIGHT) throw new Error("Expected ']' at end of object at position " + (srcEnd - srcStart).toString());
37
17
 
38
18
  while (srcStart < srcEnd) {
39
19
  const code = load<u16>(srcStart);
@@ -1,39 +1,19 @@
1
- import {
2
- BRACE_LEFT,
3
- BRACE_RIGHT,
4
- BRACKET_LEFT,
5
- BRACKET_RIGHT,
6
- } from "../../../custom/chars";
1
+ import { BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars";
7
2
  import { JSON } from "../../..";
8
3
  import { isSpace } from "util/string";
9
4
 
10
- export function deserializeObjectArray<T extends unknown[]>(
11
- srcStart: usize,
12
- srcEnd: usize,
13
- dst: usize,
14
- ): T {
15
- const out = changetype<nonnull<T>>(
16
- dst || changetype<usize>(instantiate<T>()),
17
- );
5
+ export function deserializeObjectArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
18
7
  let lastIndex: usize = 0;
19
8
  let depth: u32 = 0;
20
9
 
21
10
  while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
22
11
  while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
23
12
 
24
- if (srcStart - srcEnd == 0)
25
- throw new Error("Input string had zero length or was all whitespace");
13
+ if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
26
14
 
27
- if (load<u16>(srcStart) != BRACKET_LEFT)
28
- throw new Error(
29
- "Expected '[' at start of object at position " +
30
- (srcEnd - srcStart).toString(),
31
- );
32
- if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
33
- throw new Error(
34
- "Expected ']' at end of object at position " +
35
- (srcEnd - srcStart).toString(),
36
- );
15
+ if (load<u16>(srcStart) != BRACKET_LEFT) throw new Error("Expected '[' at start of object at position " + (srcEnd - srcStart).toString());
16
+ if (load<u16>(srcEnd - 2) != BRACKET_RIGHT) throw new Error("Expected ']' at end of object at position " + (srcEnd - srcStart).toString());
37
17
 
38
18
  while (srcStart < srcEnd) {
39
19
  const code = load<u16>(srcStart);
@@ -1,49 +1,27 @@
1
- import { isSpace } from "../../../util";
2
- import {
3
- COMMA,
4
- BRACKET_RIGHT,
5
- QUOTE,
6
- BRACE_LEFT,
7
- BRACE_RIGHT,
8
- BRACKET_LEFT,
9
- BACK_SLASH,
10
- CHAR_T,
11
- CHAR_F,
12
- CHAR_N,
13
- } from "../../../custom/chars";
1
+ import { isSpace, isUnescapedQuote, scanStringEnd } from "../../../util";
2
+ import { COMMA, BRACKET_RIGHT, QUOTE, BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BACK_SLASH, CHAR_T, CHAR_F, CHAR_N } from "../../../custom/chars";
14
3
  import { JSON } from "../../..";
15
4
  import { ptrToStr } from "../../../util/ptrToStr";
16
5
 
17
- export function deserializeRawArray(
18
- srcStart: usize,
19
- srcEnd: usize,
20
- dst: usize,
21
- ): JSON.Raw[] {
6
+ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize): JSON.Raw[] {
22
7
  // console.log("data: " + ptrToStr(srcStart, srcEnd));
23
- const out = changetype<JSON.Raw[]>(
24
- dst || changetype<usize>(instantiate<JSON.Raw[]>()),
25
- );
8
+ const out = changetype<JSON.Raw[]>(dst || changetype<usize>(instantiate<JSON.Raw[]>()));
26
9
  let lastIndex: usize = 0;
27
10
  let depth = 0;
28
11
  srcStart += 2;
29
12
  while (srcStart < srcEnd) {
30
13
  let code = load<u16>(srcStart);
31
- if (code == QUOTE) {
14
+ if (code == BRACKET_RIGHT) {
15
+ break;
16
+ } else if (code == COMMA || isSpace(code)) {
17
+ srcStart += 2;
18
+ continue;
19
+ } else if (code == QUOTE) {
32
20
  lastIndex = srcStart;
21
+ srcStart = scanStringEnd(srcStart, srcEnd);
22
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
23
+ out.push(JSON.Raw.from(ptrToStr(lastIndex, srcStart + 2)));
33
24
  srcStart += 2;
34
- while (srcStart < srcEnd) {
35
- code = load<u16>(srcStart);
36
- if (code == QUOTE || isSpace(code)) {
37
- // console.log("Value (string): " + ptrToStr(lastIndex, srcStart));
38
- out.push(JSON.Raw.from(ptrToStr(lastIndex, srcStart + 2)));
39
- // while (isSpace(load<u16>((srcStart += 2)))) {
40
- // /* empty */
41
- // }
42
- srcStart += 4;
43
- break;
44
- }
45
- srcStart += 2;
46
- }
47
25
  } else if (code - 48 <= 9 || code == 45) {
48
26
  lastIndex = srcStart;
49
27
  srcStart += 2;
@@ -64,14 +42,8 @@ export function deserializeRawArray(
64
42
  while (srcStart < srcEnd) {
65
43
  const code = load<u16>(srcStart);
66
44
  if (code == QUOTE) {
67
- srcStart += 2;
68
- while (
69
- !(
70
- load<u16>(srcStart) == QUOTE &&
71
- load<u16>(srcStart - 2) != BACK_SLASH
72
- )
73
- )
74
- srcStart += 2;
45
+ srcStart = scanStringEnd(srcStart, srcEnd);
46
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
75
47
  } else if (code == BRACE_RIGHT) {
76
48
  if (--depth == 0) {
77
49
  // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
@@ -89,14 +61,8 @@ export function deserializeRawArray(
89
61
  while (srcStart < srcEnd) {
90
62
  const code = load<u16>(srcStart);
91
63
  if (code == QUOTE) {
92
- srcStart += 2;
93
- while (
94
- !(
95
- load<u16>(srcStart) == QUOTE &&
96
- load<u16>(srcStart - 2) != BACK_SLASH
97
- )
98
- )
99
- srcStart += 2;
64
+ srcStart = scanStringEnd(srcStart, srcEnd);
65
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
100
66
  } else if (code == BRACKET_RIGHT) {
101
67
  if (--depth == 0) {
102
68
  // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
@@ -125,17 +91,8 @@ export function deserializeRawArray(
125
91
  out.push(JSON.Raw.from("null"));
126
92
  srcStart += 10;
127
93
  }
128
- } else if (isSpace(code)) {
129
- srcStart += 2;
130
94
  } else {
131
- throw new Error(
132
- "Unexpected character in JSON object '" +
133
- String.fromCharCode(code) +
134
- "' at position " +
135
- (srcEnd - srcStart).toString() +
136
- " " +
137
- ptrToStr(lastIndex, srcStart + 10),
138
- );
95
+ throw new Error("Unexpected character in JSON object '" + String.fromCharCode(code) + "' at position " + (srcEnd - srcStart).toString() + " " + ptrToStr(lastIndex, srcStart + 10));
139
96
  }
140
97
  }
141
98
  return out;
@@ -1,14 +1,9 @@
1
1
  import { JSON } from "../../..";
2
- import { BACK_SLASH, QUOTE } from "../../../custom/chars";
2
+ import { QUOTE } from "../../../custom/chars";
3
+ import { isUnescapedQuote } from "../../../util";
3
4
 
4
- export function deserializeStringArray(
5
- srcStart: usize,
6
- srcEnd: usize,
7
- dst: usize,
8
- ): string[] {
9
- const out = changetype<string[]>(
10
- dst || changetype<usize>(instantiate<string[]>()),
11
- );
5
+ export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usize): string[] {
6
+ const out = changetype<string[]>(dst || changetype<usize>(instantiate<string[]>()));
12
7
  let lastPos: usize = 2;
13
8
  let inString = false;
14
9
  while (srcStart < srcEnd) {
@@ -17,7 +12,7 @@ export function deserializeStringArray(
17
12
  if (!inString) {
18
13
  inString = true;
19
14
  lastPos = srcStart;
20
- } else if (load<u16>(srcStart - 2) != BACK_SLASH) {
15
+ } else if (isUnescapedQuote(srcStart)) {
21
16
  out.push(JSON.__deserialize<string>(lastPos, srcStart + 2));
22
17
  inString = false;
23
18
  }
@@ -1,39 +1,19 @@
1
- import {
2
- BRACE_LEFT,
3
- BRACE_RIGHT,
4
- BRACKET_LEFT,
5
- BRACKET_RIGHT,
6
- } from "../../../custom/chars";
1
+ import { BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars";
7
2
  import { JSON } from "../../..";
8
3
  import { isSpace } from "util/string";
9
4
 
10
- export function deserializeStructArray<T extends unknown[]>(
11
- srcStart: usize,
12
- srcEnd: usize,
13
- dst: usize,
14
- ): T {
15
- const out = changetype<nonnull<T>>(
16
- dst || changetype<usize>(instantiate<T>()),
17
- );
5
+ export function deserializeStructArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
18
7
  let lastIndex: usize = 0;
19
8
  let depth: u32 = 0;
20
9
 
21
10
  while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
22
11
  while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
23
12
 
24
- if (srcStart - srcEnd == 0)
25
- throw new Error("Input string had zero length or was all whitespace");
13
+ if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
26
14
 
27
- if (load<u16>(srcStart) != BRACKET_LEFT)
28
- throw new Error(
29
- "Expected '[' at start of object at position " +
30
- (srcEnd - srcStart).toString(),
31
- );
32
- if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
33
- throw new Error(
34
- "Expected ']' at end of object at position " +
35
- (srcEnd - srcStart).toString(),
36
- );
15
+ if (load<u16>(srcStart) != BRACKET_LEFT) throw new Error("Expected '[' at start of object at position " + (srcEnd - srcStart).toString());
16
+ if (load<u16>(srcEnd - 2) != BRACKET_RIGHT) throw new Error("Expected ']' at end of object at position " + (srcEnd - srcStart).toString());
37
17
 
38
18
  while (srcStart < srcEnd) {
39
19
  const code = load<u16>(srcStart);
@@ -10,13 +10,10 @@ import { deserializeStringArray } from "./array/string";
10
10
  import { deserializeObjectArray } from "./array/object";
11
11
  import { deserializeBoxArray } from "./array/box";
12
12
  import { deserializeRawArray } from "./array/raw";
13
+ export { deserializeArrayField, deserializeArrayField as deserializeArrayField_SWAR } from "../swar/array";
13
14
 
14
15
  // @ts-ignore: Decorator valid here
15
- export function deserializeArray<T extends unknown[]>(
16
- srcStart: usize,
17
- srcEnd: usize,
18
- dst: usize,
19
- ): T {
16
+ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
20
17
  if (isString<valueof<T>>()) {
21
18
  return <T>deserializeStringArray(srcStart, srcEnd, dst);
22
19
  } else if (isBoolean<valueof<T>>()) {