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.
- package/CHANGELOG.md +417 -0
- package/README.md +135 -36
- package/assembly/custom/util.ts +24 -70
- package/assembly/deserialize/float.ts +181 -0
- package/assembly/deserialize/helpers/uint.ts +12 -0
- package/assembly/deserialize/index/arbitrary.ts +25 -0
- package/assembly/deserialize/index/array.ts +61 -0
- package/assembly/deserialize/index/bool.ts +1 -0
- package/assembly/deserialize/index/date.ts +1 -0
- package/assembly/deserialize/index/float.ts +1 -0
- package/assembly/deserialize/index/integer.ts +1 -0
- package/assembly/deserialize/index/map.ts +1 -0
- package/assembly/deserialize/index/object.ts +1 -0
- package/assembly/deserialize/index/raw.ts +1 -0
- package/assembly/deserialize/index/set.ts +1 -0
- package/assembly/deserialize/index/staticarray.ts +1 -0
- package/assembly/deserialize/index/string.ts +15 -0
- package/assembly/deserialize/index/struct.ts +1 -0
- package/assembly/deserialize/index/typedarray.ts +15 -0
- package/assembly/deserialize/index/unsigned.ts +1 -0
- package/assembly/deserialize/index.ts +14 -0
- package/assembly/deserialize/integer.ts +42 -0
- package/assembly/deserialize/simd/array/integer.ts +307 -0
- package/assembly/deserialize/simd/string.ts +130 -11
- package/assembly/deserialize/simple/arbitrary.ts +5 -12
- package/assembly/deserialize/simple/array/arbitrary.ts +12 -36
- package/assembly/deserialize/simple/array/array.ts +2 -8
- package/assembly/deserialize/simple/array/bool.ts +2 -8
- package/assembly/deserialize/simple/array/box.ts +2 -8
- package/assembly/deserialize/simple/array/float.ts +2 -8
- package/assembly/deserialize/simple/array/integer.ts +2 -8
- package/assembly/deserialize/simple/array/map.ts +6 -26
- package/assembly/deserialize/simple/array/object.ts +6 -26
- package/assembly/deserialize/simple/array/raw.ts +18 -61
- package/assembly/deserialize/simple/array/string.ts +5 -10
- package/assembly/deserialize/simple/array/struct.ts +6 -26
- package/assembly/deserialize/simple/array.ts +2 -5
- package/assembly/deserialize/simple/bool.ts +2 -6
- package/assembly/deserialize/simple/map.ts +29 -102
- package/assembly/deserialize/simple/object.ts +24 -81
- package/assembly/deserialize/simple/raw.ts +1 -4
- package/assembly/deserialize/simple/set.ts +11 -37
- package/assembly/deserialize/simple/staticarray/array.ts +1 -1
- package/assembly/deserialize/simple/staticarray/bool.ts +1 -1
- package/assembly/deserialize/simple/staticarray/float.ts +1 -1
- package/assembly/deserialize/simple/staticarray/integer.ts +1 -1
- package/assembly/deserialize/simple/staticarray/string.ts +7 -14
- package/assembly/deserialize/simple/staticarray/struct.ts +1 -1
- package/assembly/deserialize/simple/staticarray.ts +57 -21
- package/assembly/deserialize/simple/string.ts +90 -10
- package/assembly/deserialize/simple/struct.ts +25 -121
- package/assembly/deserialize/simple/typedarray.ts +94 -0
- package/assembly/deserialize/swar/array/arbitrary.ts +8 -0
- package/assembly/deserialize/swar/array/array.ts +39 -0
- package/assembly/deserialize/swar/array/bool.ts +47 -0
- package/assembly/deserialize/swar/array/box.ts +8 -0
- package/assembly/deserialize/swar/array/float.ts +39 -0
- package/assembly/deserialize/swar/array/integer.ts +461 -0
- package/assembly/deserialize/swar/array/map.ts +7 -0
- package/assembly/deserialize/swar/array/object.ts +44 -0
- package/assembly/deserialize/swar/array/raw.ts +8 -0
- package/assembly/deserialize/swar/array/shared.ts +96 -0
- package/assembly/deserialize/swar/array/string.ts +39 -0
- package/assembly/deserialize/swar/array/struct.ts +44 -0
- package/assembly/deserialize/swar/array.ts +49 -0
- package/assembly/deserialize/swar/string.ts +648 -15
- package/assembly/deserialize/unsigned.ts +75 -0
- package/assembly/index.d.ts +1 -3
- package/assembly/index.ts +316 -374
- package/assembly/serialize/index/arbitrary.ts +75 -0
- package/assembly/serialize/index/array.ts +1 -0
- package/assembly/serialize/index/bool.ts +1 -0
- package/assembly/serialize/index/date.ts +1 -0
- package/assembly/serialize/index/float.ts +1 -0
- package/assembly/serialize/index/integer.ts +1 -0
- package/assembly/serialize/index/map.ts +1 -0
- package/assembly/serialize/index/object.ts +46 -0
- package/assembly/serialize/index/raw.ts +1 -0
- package/assembly/serialize/index/set.ts +1 -0
- package/assembly/serialize/index/staticarray.ts +1 -0
- package/assembly/serialize/index/string.ts +15 -0
- package/assembly/serialize/index/struct.ts +1 -0
- package/assembly/serialize/index/typedarray.ts +66 -0
- package/assembly/serialize/index.ts +13 -0
- package/assembly/serialize/simd/string.ts +4 -13
- package/assembly/serialize/simple/arbitrary.ts +6 -0
- package/assembly/serialize/simple/raw.ts +1 -5
- package/assembly/serialize/simple/string.ts +3 -11
- package/assembly/serialize/simple/typedarray.ts +63 -0
- package/assembly/serialize/swar/string.ts +6 -21
- package/assembly/util/concat.ts +1 -5
- package/assembly/util/index.ts +1 -0
- package/assembly/util/masks.ts +12 -18
- package/assembly/util/memory.ts +0 -0
- package/assembly/util/snp.ts +1 -4
- package/assembly/util/stringScan.ts +24 -0
- package/assembly/util/swar.ts +50 -6
- package/lib/as-bs.ts +137 -127
- package/package.json +26 -5
- package/transform/lib/builder.d.ts.map +1 -1
- package/transform/lib/builder.js +5 -13
- package/transform/lib/builder.js.map +1 -1
- package/transform/lib/index.d.ts +1 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +672 -757
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/alias.d.ts.map +1 -1
- package/transform/lib/linkers/alias.js.map +1 -1
- package/transform/lib/linkers/custom.d.ts.map +1 -1
- package/transform/lib/linkers/custom.js +8 -9
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/linkers/imports.d.ts.map +1 -1
- package/transform/lib/linkers/imports.js.map +1 -1
- package/transform/lib/types.d.ts +6 -0
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +83 -21
- package/transform/lib/types.js.map +1 -1
- package/transform/lib/util.d.ts.map +1 -1
- package/transform/lib/util.js +1 -1
- package/transform/lib/util.js.map +1 -1
- package/transform/lib/visitor.d.ts.map +1 -1
- package/transform/lib/visitor.js +1 -2
- package/transform/lib/visitor.js.map +1 -1
- package/.prettierrc +0 -3
- package/ARCHITECTURE.md +0 -320
- package/CONTRIBUTING.md +0 -238
- package/TODO +0 -1
- package/assembly/deserialize/simple/float.ts +0 -11
- package/assembly/deserialize/simple/integer.ts +0 -9
- package/assembly/test.ts +0 -30
- package/eslint.config.js +0 -60
- package/lib/tsconfig.json +0 -8
- package/tools/assemblyscript-eslint-local.js +0 -29
- package/tools/assemblyscript-eslint.js +0 -29
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
if (load<u16>(
|
|
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 &&
|
|
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
|
-
|
|
91
|
-
|
|
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
|
|
137
|
-
|
|
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 ==
|
|
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
|
-
|
|
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 "
|
|
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
|
-
|
|
43
|
-
if (load<u16>(
|
|
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 &&
|
|
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
|
-
|
|
84
|
-
|
|
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
|
|
128
|
-
|
|
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 ==
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
if (load<u16>(
|
|
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 &&
|
|
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
|
|
111
|
-
|
|
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 &&
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 {
|
|
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 (
|
|
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 (
|
|
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 =
|
|
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
|