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,11 +1,7 @@
1
1
  // @ts-ignore: inline
2
- @inline export function deserializeBoolean(
3
- srcStart: usize,
4
- srcEnd: usize,
5
- ): boolean {
2
+ @inline export function deserializeBoolean(srcStart: usize, srcEnd: usize): boolean {
6
3
  const block = load<u64>(srcStart);
7
4
  if (block == 28429475166421108) return true;
8
- else if (block == 32370086184550502 && load<u16>(srcStart, 8) == 101)
9
- return false;
5
+ else if (block == 32370086184550502 && load<u16>(srcStart, 8) == 101) return false;
10
6
  return false; //throw new Error(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
11
7
  }
@@ -1,18 +1,6 @@
1
1
  import { JSON } from "../..";
2
- import {
3
- BACK_SLASH,
4
- COMMA,
5
- CHAR_F,
6
- BRACE_LEFT,
7
- BRACKET_LEFT,
8
- CHAR_N,
9
- QUOTE,
10
- BRACE_RIGHT,
11
- BRACKET_RIGHT,
12
- CHAR_T,
13
- COLON,
14
- } from "../../custom/chars";
15
- import { isSpace } from "../../util";
2
+ import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
3
+ import { isSpace, isUnescapedQuote, scanStringEnd } from "../../util";
16
4
 
17
5
  // @ts-ignore: Decorator is valid here
18
6
  @inline function normalizeQuotes<T>(start: usize, end: usize): T {
@@ -20,21 +8,10 @@ import { isSpace } from "../../util";
20
8
  return JSON.__deserialize<T>(start, end);
21
9
  }
22
10
 
23
- export function deserializeMap<T extends Map<any, any>>(
24
- srcStart: usize,
25
- srcEnd: usize,
26
- dst: usize,
27
- ): T {
28
- const out = changetype<nonnull<T>>(
29
- dst || changetype<usize>(instantiate<T>()),
30
- );
11
+ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd: usize, dst: usize): T {
12
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
31
13
  // @ts-ignore: type
32
- if (
33
- !isString<indexof<T>>() &&
34
- !isInteger<indexof<T>>() &&
35
- !isFloat<indexof<T>>()
36
- )
37
- throw new Error("Map key must also be a valid JSON key!");
14
+ if (!isString<indexof<T>>() && !isInteger<indexof<T>>() && !isFloat<indexof<T>>()) throw new Error("Map key must also be a valid JSON key!");
38
15
 
39
16
  let keyStart: usize = 0;
40
17
  let keyEnd: usize = 0;
@@ -45,35 +22,22 @@ export function deserializeMap<T extends Map<any, any>>(
45
22
  while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
46
23
  while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2; // would like to optimize this later
47
24
 
48
- if (srcStart - srcEnd == 0)
49
- throw new Error("Input string had zero length or was all whitespace");
50
- if (load<u16>(srcStart) != BRACE_LEFT)
51
- throw new Error(
52
- "Expected '{' at start of object at position " +
53
- (srcEnd - srcStart).toString(),
54
- );
55
- if (load<u16>(srcEnd - 2) != BRACE_RIGHT)
56
- throw new Error(
57
- "Expected '}' at end of object at position " +
58
- (srcEnd - srcStart).toString(),
59
- );
25
+ if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
26
+ if (load<u16>(srcStart) != BRACE_LEFT) throw new Error("Expected '{' at start of object at position " + (srcEnd - srcStart).toString());
27
+ if (load<u16>(srcEnd - 2) != BRACE_RIGHT) throw new Error("Expected '}' at end of object at position " + (srcEnd - srcStart).toString());
60
28
 
61
29
  srcStart += 2;
62
30
  while (srcStart < srcEnd) {
63
31
  let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
64
32
  if (keyStart == 0) {
65
- if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
33
+ if (code == QUOTE && isUnescapedQuote(srcStart)) {
66
34
  if (isKey) {
67
35
  keyStart = lastIndex;
68
36
  keyEnd = srcStart;
69
37
  // console.log("Key: " + ptrToStr(lastIndex, srcStart));
70
38
  // console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
71
39
  while (isSpace((code = load<u16>((srcStart += 2))))) {}
72
- if (code !== COLON)
73
- throw new Error(
74
- "Expected ':' after key at position " +
75
- (srcEnd - srcStart).toString(),
76
- );
40
+ if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcEnd - srcStart).toString());
77
41
  isKey = false;
78
42
  } else {
79
43
  // console.log("Got key start");
@@ -86,24 +50,13 @@ export function deserializeMap<T extends Map<any, any>>(
86
50
  } else {
87
51
  if (code == QUOTE) {
88
52
  lastIndex = srcStart;
53
+ srcStart = scanStringEnd(srcStart, srcEnd);
54
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON object");
55
+ // @ts-ignore: type
56
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(lastIndex, srcStart + 2));
89
57
  srcStart += 2;
90
- while (srcStart < srcEnd) {
91
- const code = load<u16>(srcStart);
92
- if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
93
- // console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
94
- // @ts-ignore: type
95
- out.set(
96
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
97
- JSON.__deserialize<valueof<T>>(lastIndex, srcStart + 2),
98
- );
99
- // while (isSpace(load<u16>(srcStart))) srcStart += 2;
100
- srcStart += 4;
101
- // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
102
- keyStart = 0;
103
- break;
104
- }
105
- srcStart += 2;
106
- }
58
+ keyStart = 0;
59
+ continue;
107
60
  } else if (code - 48 <= 9 || code == 45) {
108
61
  lastIndex = srcStart;
109
62
  srcStart += 2;
@@ -112,10 +65,7 @@ export function deserializeMap<T extends Map<any, any>>(
112
65
  if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
113
66
  // console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
114
67
  // @ts-ignore: type
115
- out.set(
116
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
117
- JSON.__deserialize<valueof<T>>(lastIndex, srcStart),
118
- );
68
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
119
69
  // while (isSpace(load<u16>((srcStart += 2)))) {
120
70
  // /* empty */
121
71
  // }
@@ -133,22 +83,13 @@ export function deserializeMap<T extends Map<any, any>>(
133
83
  while (srcStart < srcEnd) {
134
84
  const code = load<u16>(srcStart);
135
85
  if (code == QUOTE) {
136
- srcStart += 2;
137
- while (
138
- !(
139
- load<u16>(srcStart) == QUOTE &&
140
- load<u16>(srcStart - 2) != BACK_SLASH
141
- )
142
- )
143
- srcStart += 2;
86
+ srcStart = scanStringEnd(srcStart, srcEnd);
87
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON object");
144
88
  } else if (code == BRACE_RIGHT) {
145
89
  if (--depth == 0) {
146
90
  // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
147
91
  // @ts-ignore: type
148
- out.set(
149
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
150
- JSON.__deserialize<valueof<T>>(lastIndex, (srcStart += 2)),
151
- );
92
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(lastIndex, (srcStart += 2)));
152
93
  // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
153
94
  keyStart = 0;
154
95
  // while (isSpace(load<u16>(srcStart))) {
@@ -165,14 +106,14 @@ export function deserializeMap<T extends Map<any, any>>(
165
106
  srcStart += 2;
166
107
  while (srcStart < srcEnd) {
167
108
  const code = load<u16>(srcStart);
168
- if (code == BRACKET_RIGHT) {
109
+ if (code == QUOTE) {
110
+ srcStart = scanStringEnd(srcStart, srcEnd);
111
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON object");
112
+ } else if (code == BRACKET_RIGHT) {
169
113
  if (--depth == 0) {
170
114
  // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
171
115
  // @ts-ignore: type
172
- out.set(
173
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
174
- JSON.__deserialize<valueof<T>>(lastIndex, (srcStart += 2)),
175
- );
116
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(lastIndex, (srcStart += 2)));
176
117
  // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
177
118
  keyStart = 0;
178
119
  // while (isSpace(load<u16>((srcStart += 2)))) {
@@ -187,10 +128,7 @@ export function deserializeMap<T extends Map<any, any>>(
187
128
  if (load<u64>(srcStart) == 28429475166421108) {
188
129
  // console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8));
189
130
  // @ts-ignore: type
190
- out.set(
191
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
192
- JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)),
193
- );
131
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)));
194
132
  // while (isSpace(load<u16>((srcStart += 2)))) {
195
133
  // /* empty */
196
134
  // }
@@ -202,10 +140,7 @@ export function deserializeMap<T extends Map<any, any>>(
202
140
  if (load<u64>(srcStart, 2) == 28429466576093281) {
203
141
  // console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10));
204
142
  // @ts-ignore: type
205
- out.set(
206
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
207
- JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 10)),
208
- );
143
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 10)));
209
144
  // while (isSpace(load<u16>((srcStart += 2)))) {
210
145
  // /* empty */
211
146
  // }
@@ -217,10 +152,7 @@ export function deserializeMap<T extends Map<any, any>>(
217
152
  if (load<u64>(srcStart) == 30399761348886638) {
218
153
  // console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8));
219
154
  // @ts-ignore: type
220
- out.set(
221
- normalizeQuotes<indexof<T>>(keyStart, keyEnd),
222
- JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)),
223
- );
155
+ out.set(normalizeQuotes<indexof<T>>(keyStart, keyEnd), JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)));
224
156
  // while (isSpace(load<u16>((srcStart += 2)))) {
225
157
  /* empty */
226
158
  // }
@@ -231,12 +163,7 @@ export function deserializeMap<T extends Map<any, any>>(
231
163
  } else if (isSpace(code)) {
232
164
  srcStart += 2;
233
165
  } else {
234
- throw new Error(
235
- "Unexpected character in JSON object '" +
236
- String.fromCharCode(code) +
237
- "' at position " +
238
- (srcEnd - srcStart).toString(),
239
- );
166
+ throw new Error("Unexpected character in JSON object '" + String.fromCharCode(code) + "' at position " + (srcEnd - srcStart).toString());
240
167
  }
241
168
  }
242
169
  }
@@ -1,32 +1,16 @@
1
1
  import { JSON } from "../..";
2
2
  import { bs } from "../../../lib/as-bs";
3
- import {
4
- BACK_SLASH,
5
- COMMA,
6
- CHAR_F,
7
- BRACE_LEFT,
8
- BRACKET_LEFT,
9
- CHAR_N,
10
- QUOTE,
11
- BRACE_RIGHT,
12
- BRACKET_RIGHT,
13
- CHAR_T,
14
- COLON,
15
- } from "../../custom/chars";
16
- import { isSpace } from "../../util";
3
+ import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
4
+ import { isSpace, isUnescapedQuote, scanStringEnd } from "../../util";
17
5
  import { ptrToStr } from "../../util/ptrToStr";
18
6
  import { deserializeString_SWAR } from "../swar/string";
19
7
  import { deserializeArbitrary } from "./arbitrary";
20
8
  import { deserializeArray } from "./array";
21
9
  import { deserializeBoolean } from "./bool";
22
- import { deserializeFloat } from "./float";
10
+ import { deserializeFloat } from "../float";
23
11
  import { deserializeString } from "./string";
24
12
 
25
- export function deserializeObject(
26
- srcStart: usize,
27
- srcEnd: usize,
28
- dst: usize,
29
- ): JSON.Obj {
13
+ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): JSON.Obj {
30
14
  const out = changetype<JSON.Obj>(dst || changetype<usize>(new JSON.Obj()));
31
15
 
32
16
  let keyStart: usize = 0;
@@ -38,35 +22,22 @@ export function deserializeObject(
38
22
  while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
39
23
  while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2; // would like to optimize this later
40
24
 
41
- if (srcStart - srcEnd == 0)
42
- throw new Error("Input string had zero length or was all whitespace");
43
- if (load<u16>(srcStart) != BRACE_LEFT)
44
- throw new Error(
45
- "Expected '{' at start of object at position " +
46
- (srcEnd - srcStart).toString(),
47
- );
48
- if (load<u16>(srcEnd - 2) != BRACE_RIGHT)
49
- throw new Error(
50
- "Expected '}' at end of object at position " +
51
- (srcEnd - srcStart).toString(),
52
- );
25
+ if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace");
26
+ if (load<u16>(srcStart) != BRACE_LEFT) throw new Error("Expected '{' at start of object at position " + (srcEnd - srcStart).toString());
27
+ if (load<u16>(srcEnd - 2) != BRACE_RIGHT) throw new Error("Expected '}' at end of object at position " + (srcEnd - srcStart).toString());
53
28
 
54
29
  srcStart += 2;
55
30
  while (srcStart < srcEnd) {
56
31
  let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
57
32
  if (keyStart == 0) {
58
- if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
33
+ if (code == QUOTE && isUnescapedQuote(srcStart)) {
59
34
  if (isKey) {
60
35
  keyStart = lastIndex;
61
36
  keyEnd = srcStart;
62
37
  // console.log("Key: " + ptrToStr(lastIndex, srcStart));
63
38
  // console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
64
39
  while (isSpace((code = load<u16>((srcStart += 2))))) {}
65
- if (code !== COLON)
66
- throw new Error(
67
- "Expected ':' after key at position " +
68
- (srcEnd - srcStart).toString(),
69
- );
40
+ if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcEnd - srcStart).toString());
70
41
  isKey = false;
71
42
  } else {
72
43
  // console.log("Got key start");
@@ -79,23 +50,12 @@ export function deserializeObject(
79
50
  } else {
80
51
  if (code == QUOTE) {
81
52
  lastIndex = srcStart;
53
+ srcStart = scanStringEnd(srcStart, srcEnd);
54
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON object");
55
+ out.set(ptrToStr(keyStart, keyEnd), deserializeString(lastIndex, srcStart + 2));
82
56
  srcStart += 2;
83
- while (srcStart < srcEnd) {
84
- const code = load<u16>(srcStart);
85
- if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
86
- // console.log("Value (string):-" + deserializeString_SWAR(lastIndex, srcStart + 2, 0) + "-");
87
- out.set(
88
- ptrToStr(keyStart, keyEnd),
89
- deserializeString(lastIndex, srcStart + 2),
90
- );
91
- // while (isSpace(load<u16>(srcStart))) srcStart += 2;
92
- srcStart += 4;
93
- // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
94
- keyStart = 0;
95
- break;
96
- }
97
- srcStart += 2;
98
- }
57
+ keyStart = 0;
58
+ continue;
99
59
  } else if (code - 48 <= 9 || code == 45) {
100
60
  lastIndex = srcStart;
101
61
  srcStart += 2;
@@ -103,10 +63,7 @@ export function deserializeObject(
103
63
  const code = load<u16>(srcStart);
104
64
  if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
105
65
  // console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
106
- out.set(
107
- ptrToStr(keyStart, keyEnd),
108
- deserializeFloat<f64>(lastIndex, srcStart),
109
- );
66
+ out.set(ptrToStr(keyStart, keyEnd), deserializeFloat<f64>(lastIndex, srcStart));
110
67
  // while (isSpace(load<u16>((srcStart += 2)))) {
111
68
  // /* empty */
112
69
  // }
@@ -124,21 +81,12 @@ export function deserializeObject(
124
81
  while (srcStart < srcEnd) {
125
82
  const code = load<u16>(srcStart);
126
83
  if (code == QUOTE) {
127
- srcStart += 2;
128
- while (
129
- !(
130
- load<u16>(srcStart) == QUOTE &&
131
- load<u16>(srcStart - 2) != BACK_SLASH
132
- )
133
- )
134
- srcStart += 2;
84
+ srcStart = scanStringEnd(srcStart, srcEnd);
85
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON object");
135
86
  } else if (code == BRACE_RIGHT) {
136
87
  if (--depth == 0) {
137
88
  // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
138
- out.set(
139
- ptrToStr(keyStart, keyEnd),
140
- deserializeObject(lastIndex, (srcStart += 2), 0),
141
- );
89
+ out.set(ptrToStr(keyStart, keyEnd), deserializeObject(lastIndex, (srcStart += 2), 0));
142
90
  // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
143
91
  keyStart = 0;
144
92
  // while (isSpace(load<u16>(srcStart))) {
@@ -155,13 +103,13 @@ export function deserializeObject(
155
103
  srcStart += 2;
156
104
  while (srcStart < srcEnd) {
157
105
  const code = load<u16>(srcStart);
158
- if (code == BRACKET_RIGHT) {
106
+ if (code == QUOTE) {
107
+ srcStart = scanStringEnd(srcStart, srcEnd);
108
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON object");
109
+ } else if (code == BRACKET_RIGHT) {
159
110
  if (--depth == 0) {
160
111
  // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
161
- out.set(
162
- ptrToStr(keyStart, keyEnd),
163
- deserializeArray<JSON.Value[]>(lastIndex, (srcStart += 2), 0),
164
- );
112
+ out.set(ptrToStr(keyStart, keyEnd), deserializeArray<JSON.Value[]>(lastIndex, (srcStart += 2), 0));
165
113
  // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
166
114
  keyStart = 0;
167
115
  // while (isSpace(load<u16>((srcStart += 2)))) {
@@ -211,12 +159,7 @@ export function deserializeObject(
211
159
  } else if (isSpace(code)) {
212
160
  srcStart += 2;
213
161
  } else {
214
- throw new Error(
215
- "Unexpected character in JSON object '" +
216
- String.fromCharCode(code) +
217
- "' at position " +
218
- (srcEnd - srcStart).toString(),
219
- );
162
+ throw new Error("Unexpected character in JSON object '" + String.fromCharCode(code) + "' at position " + (srcEnd - srcStart).toString());
220
163
  }
221
164
  }
222
165
  }
@@ -2,9 +2,6 @@ import { JSON } from "../..";
2
2
  import { ptrToStr } from "../../util/ptrToStr";
3
3
 
4
4
  // @ts-ignore: inline
5
- @inline export function deserializeRaw(
6
- srcStart: usize,
7
- srcEnd: usize,
8
- ): JSON.Raw {
5
+ @inline export function deserializeRaw(srcStart: usize, srcEnd: usize): JSON.Raw {
9
6
  return JSON.Raw.from(ptrToStr(srcStart, srcEnd));
10
7
  }
@@ -1,36 +1,16 @@
1
1
  import { JSON } from "../..";
2
- import {
3
- BACK_SLASH,
4
- BRACKET_LEFT,
5
- BRACKET_RIGHT,
6
- BRACE_LEFT,
7
- BRACE_RIGHT,
8
- CHAR_F,
9
- CHAR_N,
10
- CHAR_T,
11
- COMMA,
12
- QUOTE,
13
- } from "../../custom/chars";
14
- import { isSpace, atoi } from "../../util";
2
+ import { BACK_SLASH, BRACKET_LEFT, BRACKET_RIGHT, BRACE_LEFT, BRACE_RIGHT, CHAR_F, CHAR_N, CHAR_T, COMMA, QUOTE } from "../../custom/chars";
3
+ import { isSpace, atoi, isUnescapedQuote, scanStringEnd } from "../../util";
15
4
 
16
- export function deserializeSet<T extends Set<any>>(
17
- srcStart: usize,
18
- srcEnd: usize,
19
- dst: usize,
20
- ): T {
21
- const out = changetype<nonnull<T>>(
22
- dst || changetype<usize>(instantiate<T>()),
23
- );
5
+ export function deserializeSet<T extends Set<any>>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
24
7
 
25
8
  while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
26
9
  while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
27
10
 
28
- if (srcStart >= srcEnd)
29
- throw new Error("Input string had zero length or was all whitespace");
30
- if (load<u16>(srcStart) != BRACKET_LEFT)
31
- throw new Error("Expected '[' at start of set");
32
- if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
33
- throw new Error("Expected ']' at end of set");
11
+ if (srcStart >= srcEnd) throw new Error("Input string had zero length or was all whitespace");
12
+ if (load<u16>(srcStart) != BRACKET_LEFT) throw new Error("Expected '[' at start of set");
13
+ if (load<u16>(srcEnd - 2) != BRACKET_RIGHT) throw new Error("Expected ']' at end of set");
34
14
 
35
15
  srcStart += 2;
36
16
 
@@ -45,7 +25,7 @@ export function deserializeSet<T extends Set<any>>(
45
25
  srcStart += 2;
46
26
  while (srcStart < srcEnd) {
47
27
  const c = load<u16>(srcStart);
48
- if (c == QUOTE && load<u16>(srcStart - 2) != BACK_SLASH) {
28
+ if (c == QUOTE && isUnescapedQuote(srcStart)) {
49
29
  // @ts-ignore: type
50
30
  out.add(JSON.__deserialize<indexof<T>>(lastIndex, srcStart + 2));
51
31
  srcStart += 2;
@@ -107,14 +87,8 @@ export function deserializeSet<T extends Set<any>>(
107
87
  while (srcStart < srcEnd) {
108
88
  const c = load<u16>(srcStart);
109
89
  if (c == QUOTE) {
110
- srcStart += 2;
111
- while (
112
- !(
113
- load<u16>(srcStart) == QUOTE &&
114
- load<u16>(srcStart - 2) != BACK_SLASH
115
- )
116
- )
117
- srcStart += 2;
90
+ srcStart = scanStringEnd(srcStart, srcEnd);
91
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON set");
118
92
  } else if (c == BRACE_RIGHT) {
119
93
  if (--depth == 0) {
120
94
  srcStart += 2;
@@ -153,7 +127,7 @@ export function deserializeSet<T extends Set<any>>(
153
127
  srcStart += 2;
154
128
  while (srcStart < srcEnd) {
155
129
  const c = load<u16>(srcStart);
156
- if (c == QUOTE && load<u16>(srcStart - 2) != BACK_SLASH) {
130
+ if (c == QUOTE && isUnescapedQuote(srcStart)) {
157
131
  // @ts-ignore: type
158
132
  out.add(JSON.__deserialize<indexof<T>>(lastIndex, srcStart + 2));
159
133
  srcStart += 2;
@@ -19,7 +19,7 @@ export function deserializeStaticArrayArray<T extends StaticArray<any>>(
19
19
  ptr += 2;
20
20
  }
21
21
 
22
- const outSize = (<usize>count) << alignof<valueof<T>>();
22
+ const outSize = count << (alignof<valueof<T>>());
23
23
  const out = changetype<nonnull<T>>(dst || __new(outSize, idof<T>()));
24
24
 
25
25
  // Second pass: populate values
@@ -20,7 +20,7 @@ export function deserializeStaticArrayBoolean<T extends StaticArray<any>>(
20
20
  }
21
21
 
22
22
  // Allocate StaticArray with correct size
23
- const outSize = (<usize>count) << alignof<valueof<T>>();
23
+ const outSize = count << (alignof<valueof<T>>());
24
24
  const out = changetype<nonnull<T>>(dst || __new(outSize, idof<T>()));
25
25
 
26
26
  // Second pass: populate values
@@ -23,7 +23,7 @@ export function deserializeStaticArrayFloat<T extends StaticArray<any>>(
23
23
  ptr += 2;
24
24
  }
25
25
 
26
- const outSize = (<usize>count) << alignof<valueof<T>>();
26
+ const outSize = count << (alignof<valueof<T>>());
27
27
  const out = changetype<nonnull<T>>(dst || __new(outSize, idof<T>()));
28
28
 
29
29
  let index = 0;
@@ -22,7 +22,7 @@ export function deserializeStaticArrayInteger<T extends StaticArray<any>>(
22
22
  ptr += 2;
23
23
  }
24
24
 
25
- const outSize = (<usize>count) << alignof<valueof<T>>();
25
+ const outSize = count << (alignof<valueof<T>>());
26
26
  const out = changetype<nonnull<T>>(dst || __new(outSize, idof<T>()));
27
27
 
28
28
  // Second pass: populate values
@@ -1,11 +1,8 @@
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 deserializeStaticArrayString(
5
- srcStart: usize,
6
- srcEnd: usize,
7
- dst: usize,
8
- ): StaticArray<string> {
5
+ export function deserializeStaticArrayString(srcStart: usize, srcEnd: usize, dst: usize): StaticArray<string> {
9
6
  // First pass: count elements using same logic as Array deserializer
10
7
  let count: i32 = 0;
11
8
  let ptr = srcStart;
@@ -15,7 +12,7 @@ export function deserializeStaticArrayString(
15
12
  if (code == QUOTE) {
16
13
  if (!inString) {
17
14
  inString = true;
18
- } else if (load<u16>(ptr - 2) != BACK_SLASH) {
15
+ } else if (isUnescapedQuote(ptr)) {
19
16
  count++;
20
17
  inString = false;
21
18
  }
@@ -25,9 +22,7 @@ export function deserializeStaticArrayString(
25
22
 
26
23
  // Allocate StaticArray with correct size
27
24
  const outSize = (<usize>count) << alignof<string>();
28
- const out = changetype<StaticArray<string>>(
29
- dst || __new(outSize, idof<StaticArray<string>>()),
30
- );
25
+ const out = changetype<StaticArray<string>>(dst || __new(outSize, idof<StaticArray<string>>()));
31
26
 
32
27
  // Second pass: populate values
33
28
  let index = 0;
@@ -39,10 +34,8 @@ export function deserializeStaticArrayString(
39
34
  if (!inString) {
40
35
  inString = true;
41
36
  lastPos = srcStart;
42
- } else if (load<u16>(srcStart - 2) != BACK_SLASH) {
43
- unchecked(
44
- (out[index++] = JSON.__deserialize<string>(lastPos, srcStart + 2)),
45
- );
37
+ } else if (isUnescapedQuote(srcStart)) {
38
+ unchecked((out[index++] = JSON.__deserialize<string>(lastPos, srcStart + 2)));
46
39
  inString = false;
47
40
  }
48
41
  }
@@ -44,7 +44,7 @@ export function deserializeStaticArrayStruct<T extends StaticArray<any>>(
44
44
  }
45
45
 
46
46
  // Allocate StaticArray with correct size
47
- const outSize = (<usize>count) << alignof<valueof<T>>();
47
+ const outSize = count << (alignof<valueof<T>>());
48
48
  const out = changetype<nonnull<T>>(dst || __new(outSize, idof<T>()));
49
49
 
50
50
  // Second pass: populate values