json-as 1.3.6 → 1.3.7
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 +13 -0
- package/assembly/deserialize/helpers/uint.ts +4 -1
- package/assembly/deserialize/index/arbitrary.ts +5 -1
- package/assembly/deserialize/index/array.ts +13 -3
- package/assembly/deserialize/index/integer.ts +68 -1
- package/assembly/deserialize/index/string.ts +4 -1
- package/assembly/deserialize/index/typedarray.ts +13 -3
- package/assembly/deserialize/index/unsigned.ts +78 -1
- package/assembly/deserialize/simd/array/integer.ts +327 -50
- package/assembly/deserialize/simd/integer.ts +233 -0
- package/assembly/deserialize/simd/string.ts +45 -11
- package/assembly/deserialize/simple/arbitrary.ts +11 -4
- package/assembly/deserialize/simple/array/arbitrary.ts +24 -5
- package/assembly/deserialize/simple/array/array.ts +8 -2
- package/assembly/deserialize/simple/array/bool.ts +38 -7
- package/assembly/deserialize/simple/array/box.ts +8 -2
- package/assembly/deserialize/simple/array/float.ts +36 -9
- package/assembly/deserialize/simple/array/generic.ts +12 -4
- package/assembly/deserialize/simple/array/integer.ts +8 -2
- package/assembly/deserialize/simple/array/map.ts +26 -6
- package/assembly/deserialize/simple/array/object.ts +26 -6
- package/assembly/deserialize/simple/array/raw.ts +34 -7
- package/assembly/deserialize/simple/array/string.ts +8 -2
- package/assembly/deserialize/simple/array/struct.ts +26 -6
- package/assembly/deserialize/simple/array.ts +13 -3
- package/assembly/deserialize/simple/bool.ts +6 -2
- package/assembly/deserialize/simple/float.ts +6 -1
- package/assembly/deserialize/simple/integer.ts +10 -2
- package/assembly/deserialize/simple/map.ts +95 -22
- package/assembly/deserialize/simple/object.ts +63 -14
- package/assembly/deserialize/simple/raw.ts +4 -1
- package/assembly/deserialize/simple/set.ts +59 -14
- package/assembly/deserialize/simple/staticarray/string.ts +11 -3
- package/assembly/deserialize/simple/staticarray.ts +64 -14
- package/assembly/deserialize/simple/string.ts +5 -92
- package/assembly/deserialize/simple/struct.ts +5 -1
- package/assembly/deserialize/simple/typedarray.ts +16 -3
- package/assembly/deserialize/simple/unsigned.ts +10 -15
- package/assembly/deserialize/swar/array/arbitrary.ts +5 -1
- package/assembly/deserialize/swar/array/array.ts +30 -6
- package/assembly/deserialize/swar/array/bool.ts +22 -4
- package/assembly/deserialize/swar/array/box.ts +5 -1
- package/assembly/deserialize/swar/array/float.ts +15 -3
- package/assembly/deserialize/swar/array/generic.ts +24 -7
- package/assembly/deserialize/swar/array/integer.ts +328 -84
- package/assembly/deserialize/swar/array/map.ts +5 -1
- package/assembly/deserialize/swar/array/object.ts +27 -7
- package/assembly/deserialize/swar/array/raw.ts +5 -1
- package/assembly/deserialize/swar/array/shared.ts +36 -11
- package/assembly/deserialize/swar/array/string.ts +20 -4
- package/assembly/deserialize/swar/array/struct.ts +27 -7
- package/assembly/deserialize/swar/array.ts +19 -4
- package/assembly/deserialize/swar/integer.ts +246 -0
- package/assembly/deserialize/swar/string.ts +98 -194
- package/assembly/index.d.ts +3 -1
- package/assembly/index.ts +312 -81
- package/assembly/serialize/index/float.ts +5 -1
- package/assembly/serialize/index/typedarray.ts +25 -7
- package/assembly/serialize/simd/string.ts +6 -2
- package/assembly/serialize/simple/array.ts +179 -1
- package/assembly/serialize/simple/float.ts +4 -1
- package/assembly/serialize/simple/integer.ts +8 -9
- package/assembly/serialize/simple/map.ts +6 -2
- package/assembly/serialize/simple/raw.ts +5 -1
- package/assembly/serialize/simple/set.ts +6 -1
- package/assembly/serialize/simple/staticarray.ts +6 -1
- package/assembly/serialize/simple/string.ts +0 -1
- package/assembly/serialize/simple/typedarray.ts +10 -3
- package/assembly/serialize/swar/string.ts +18 -5
- package/assembly/util/atoi-fast.ts +81 -0
- package/assembly/util/concat.ts +5 -1
- package/assembly/util/dragonbox-cache.ts +443 -2
- package/assembly/util/dragonbox.ts +43 -14
- package/assembly/util/itoa-fast.ts +230 -0
- package/assembly/util/masks.ts +18 -1
- package/assembly/util/parsefloat-fast.ts +167 -0
- package/assembly/util/simd-int.ts +191 -0
- package/assembly/util/snp.ts +4 -1
- package/assembly/util/swar-int.ts +248 -0
- package/assembly/util/swar.ts +13 -3
- package/lib/as-bs.ts +13 -5
- package/package.json +5 -2
- package/transform/lib/builder.d.ts.map +1 -1
- package/transform/lib/builder.js +13 -5
- 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 +1030 -241
- 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 +3 -2
- 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.map +1 -1
- package/transform/lib/types.js +54 -16
- 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 +2 -1
- package/transform/lib/visitor.js.map +1 -1
- package/assembly/custom/util.ts +0 -310
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { JSON } from "../..";
|
|
2
2
|
import { bs } from "../../../lib/as-bs";
|
|
3
|
-
import {
|
|
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";
|
|
4
16
|
import { isSpace, isUnescapedQuote, scanStringEnd } from "../../util";
|
|
5
17
|
import { ptrToStr } from "../../util/ptrToStr";
|
|
6
18
|
import { deserializeString_SWAR } from "../swar/string";
|
|
@@ -10,7 +22,11 @@ import { deserializeBoolean } from "./bool";
|
|
|
10
22
|
import { deserializeFloat } from "./float";
|
|
11
23
|
import { deserializeString } from "./string";
|
|
12
24
|
|
|
13
|
-
export function deserializeObject(
|
|
25
|
+
export function deserializeObject(
|
|
26
|
+
srcStart: usize,
|
|
27
|
+
srcEnd: usize,
|
|
28
|
+
dst: usize,
|
|
29
|
+
): JSON.Obj {
|
|
14
30
|
const out = changetype<JSON.Obj>(dst || changetype<usize>(new JSON.Obj()));
|
|
15
31
|
|
|
16
32
|
let keyStart: usize = 0;
|
|
@@ -22,9 +38,18 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
22
38
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
23
39
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2; // would like to optimize this later
|
|
24
40
|
|
|
25
|
-
if (srcStart - srcEnd == 0)
|
|
26
|
-
|
|
27
|
-
if (load<u16>(
|
|
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
|
+
);
|
|
28
53
|
|
|
29
54
|
srcStart += 2;
|
|
30
55
|
while (srcStart < srcEnd) {
|
|
@@ -37,7 +62,11 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
37
62
|
// console.log("Key: " + ptrToStr(lastIndex, srcStart));
|
|
38
63
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
|
|
39
64
|
while (isSpace((code = load<u16>((srcStart += 2))))) {}
|
|
40
|
-
if (code !== COLON)
|
|
65
|
+
if (code !== COLON)
|
|
66
|
+
throw new Error(
|
|
67
|
+
"Expected ':' after key at position " +
|
|
68
|
+
(srcEnd - srcStart).toString(),
|
|
69
|
+
);
|
|
41
70
|
isKey = false;
|
|
42
71
|
} else {
|
|
43
72
|
// console.log("Got key start");
|
|
@@ -51,8 +80,12 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
51
80
|
if (code == QUOTE) {
|
|
52
81
|
lastIndex = srcStart;
|
|
53
82
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
54
|
-
if (srcStart >= srcEnd)
|
|
55
|
-
|
|
83
|
+
if (srcStart >= srcEnd)
|
|
84
|
+
throw new Error("Unterminated string in JSON object");
|
|
85
|
+
out.set(
|
|
86
|
+
ptrToStr(keyStart, keyEnd),
|
|
87
|
+
deserializeString(lastIndex, srcStart + 2),
|
|
88
|
+
);
|
|
56
89
|
srcStart += 2;
|
|
57
90
|
keyStart = 0;
|
|
58
91
|
continue;
|
|
@@ -63,7 +96,10 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
63
96
|
const code = load<u16>(srcStart);
|
|
64
97
|
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
|
|
65
98
|
// console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
|
|
66
|
-
out.set(
|
|
99
|
+
out.set(
|
|
100
|
+
ptrToStr(keyStart, keyEnd),
|
|
101
|
+
deserializeFloat<f64>(lastIndex, srcStart),
|
|
102
|
+
);
|
|
67
103
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
68
104
|
// /* empty */
|
|
69
105
|
// }
|
|
@@ -82,11 +118,15 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
82
118
|
const code = load<u16>(srcStart);
|
|
83
119
|
if (code == QUOTE) {
|
|
84
120
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
85
|
-
if (srcStart >= srcEnd)
|
|
121
|
+
if (srcStart >= srcEnd)
|
|
122
|
+
throw new Error("Unterminated string in JSON object");
|
|
86
123
|
} else if (code == BRACE_RIGHT) {
|
|
87
124
|
if (--depth == 0) {
|
|
88
125
|
// console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
|
|
89
|
-
out.set(
|
|
126
|
+
out.set(
|
|
127
|
+
ptrToStr(keyStart, keyEnd),
|
|
128
|
+
deserializeObject(lastIndex, (srcStart += 2), 0),
|
|
129
|
+
);
|
|
90
130
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
91
131
|
keyStart = 0;
|
|
92
132
|
// while (isSpace(load<u16>(srcStart))) {
|
|
@@ -105,11 +145,15 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
105
145
|
const code = load<u16>(srcStart);
|
|
106
146
|
if (code == QUOTE) {
|
|
107
147
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
108
|
-
if (srcStart >= srcEnd)
|
|
148
|
+
if (srcStart >= srcEnd)
|
|
149
|
+
throw new Error("Unterminated string in JSON object");
|
|
109
150
|
} else if (code == BRACKET_RIGHT) {
|
|
110
151
|
if (--depth == 0) {
|
|
111
152
|
// console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
|
|
112
|
-
out.set(
|
|
153
|
+
out.set(
|
|
154
|
+
ptrToStr(keyStart, keyEnd),
|
|
155
|
+
deserializeArray<JSON.Value[]>(lastIndex, (srcStart += 2), 0),
|
|
156
|
+
);
|
|
113
157
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
114
158
|
keyStart = 0;
|
|
115
159
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
@@ -159,7 +203,12 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): J
|
|
|
159
203
|
} else if (isSpace(code)) {
|
|
160
204
|
srcStart += 2;
|
|
161
205
|
} else {
|
|
162
|
-
throw new Error(
|
|
206
|
+
throw new Error(
|
|
207
|
+
"Unexpected character in JSON object '" +
|
|
208
|
+
String.fromCharCode(code) +
|
|
209
|
+
"' at position " +
|
|
210
|
+
(srcEnd - srcStart).toString(),
|
|
211
|
+
);
|
|
163
212
|
}
|
|
164
213
|
}
|
|
165
214
|
}
|
|
@@ -2,6 +2,9 @@ import { JSON } from "../..";
|
|
|
2
2
|
import { ptrToStr } from "../../util/ptrToStr";
|
|
3
3
|
|
|
4
4
|
// @ts-ignore: inline
|
|
5
|
-
@inline export function deserializeRaw(
|
|
5
|
+
@inline export function deserializeRaw(
|
|
6
|
+
srcStart: usize,
|
|
7
|
+
srcEnd: usize,
|
|
8
|
+
): JSON.Raw {
|
|
6
9
|
return JSON.Raw.from(ptrToStr(srcStart, srcEnd));
|
|
7
10
|
}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { JSON } from "../..";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BRACKET_LEFT,
|
|
4
|
+
BRACKET_RIGHT,
|
|
5
|
+
BRACE_LEFT,
|
|
6
|
+
BRACE_RIGHT,
|
|
7
|
+
CHAR_F,
|
|
8
|
+
CHAR_T,
|
|
9
|
+
COMMA,
|
|
10
|
+
QUOTE,
|
|
11
|
+
} from "../../custom/chars";
|
|
3
12
|
import { isSpace, atoi, scanStringEnd } from "../../util";
|
|
4
13
|
|
|
5
14
|
// @ts-expect-error: Decorator valid here
|
|
@@ -41,16 +50,24 @@ import { isSpace, atoi, scanStringEnd } from "../../util";
|
|
|
41
50
|
return 0;
|
|
42
51
|
}
|
|
43
52
|
|
|
44
|
-
function deserializeSetDirect<T extends Set<any>>(
|
|
45
|
-
|
|
53
|
+
function deserializeSetDirect<T extends Set<any>>(
|
|
54
|
+
srcStart: usize,
|
|
55
|
+
srcEnd: usize,
|
|
56
|
+
out: nonnull<T>,
|
|
57
|
+
allowWhitespace: bool = false,
|
|
58
|
+
): usize {
|
|
59
|
+
if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT)
|
|
60
|
+
throw new Error("Expected '[' at start of set");
|
|
46
61
|
|
|
47
62
|
srcStart += 2;
|
|
48
|
-
if (allowWhitespace)
|
|
63
|
+
if (allowWhitespace)
|
|
64
|
+
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
49
65
|
if (srcStart >= srcEnd) throw new Error("Unterminated set");
|
|
50
66
|
if (load<u16>(srcStart) == BRACKET_RIGHT) return srcStart + 2;
|
|
51
67
|
|
|
52
68
|
while (srcStart < srcEnd) {
|
|
53
|
-
if (allowWhitespace)
|
|
69
|
+
if (allowWhitespace)
|
|
70
|
+
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
54
71
|
const code = load<u16>(srcStart);
|
|
55
72
|
|
|
56
73
|
// @ts-ignore: type
|
|
@@ -80,7 +97,12 @@ function deserializeSetDirect<T extends Set<any>>(srcStart: usize, srcEnd: usize
|
|
|
80
97
|
let ptr = srcStart + 2;
|
|
81
98
|
while (ptr < srcEnd) {
|
|
82
99
|
const next = load<u16>(ptr);
|
|
83
|
-
if (
|
|
100
|
+
if (
|
|
101
|
+
next == COMMA ||
|
|
102
|
+
next == BRACKET_RIGHT ||
|
|
103
|
+
(allowWhitespace && isSpace(next))
|
|
104
|
+
)
|
|
105
|
+
break;
|
|
84
106
|
ptr += 2;
|
|
85
107
|
}
|
|
86
108
|
// @ts-ignore: type
|
|
@@ -92,7 +114,12 @@ function deserializeSetDirect<T extends Set<any>>(srcStart: usize, srcEnd: usize
|
|
|
92
114
|
let ptr = srcStart + 2;
|
|
93
115
|
while (ptr < srcEnd) {
|
|
94
116
|
const next = load<u16>(ptr);
|
|
95
|
-
if (
|
|
117
|
+
if (
|
|
118
|
+
next == COMMA ||
|
|
119
|
+
next == BRACKET_RIGHT ||
|
|
120
|
+
(allowWhitespace && isSpace(next))
|
|
121
|
+
)
|
|
122
|
+
break;
|
|
96
123
|
ptr += 2;
|
|
97
124
|
}
|
|
98
125
|
// @ts-ignore: type
|
|
@@ -109,12 +136,14 @@ function deserializeSetDirect<T extends Set<any>>(srcStart: usize, srcEnd: usize
|
|
|
109
136
|
break;
|
|
110
137
|
}
|
|
111
138
|
|
|
112
|
-
if (allowWhitespace)
|
|
139
|
+
if (allowWhitespace)
|
|
140
|
+
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
113
141
|
if (srcStart >= srcEnd) break;
|
|
114
142
|
const next = load<u16>(srcStart);
|
|
115
143
|
if (next == COMMA) {
|
|
116
144
|
srcStart += 2;
|
|
117
|
-
if (allowWhitespace)
|
|
145
|
+
if (allowWhitespace)
|
|
146
|
+
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
118
147
|
continue;
|
|
119
148
|
}
|
|
120
149
|
if (next == BRACKET_RIGHT) return srcStart + 2;
|
|
@@ -124,27 +153,43 @@ function deserializeSetDirect<T extends Set<any>>(srcStart: usize, srcEnd: usize
|
|
|
124
153
|
throw new Error("Failed to parse JSON!");
|
|
125
154
|
}
|
|
126
155
|
|
|
127
|
-
export function deserializeSet<T extends Set<any>>(
|
|
128
|
-
|
|
156
|
+
export function deserializeSet<T extends Set<any>>(
|
|
157
|
+
srcStart: usize,
|
|
158
|
+
srcEnd: usize,
|
|
159
|
+
dst: usize,
|
|
160
|
+
): T {
|
|
161
|
+
const out = changetype<nonnull<T>>(
|
|
162
|
+
dst || changetype<usize>(instantiate<T>()),
|
|
163
|
+
);
|
|
129
164
|
out.clear();
|
|
130
165
|
|
|
131
166
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
132
167
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
|
|
133
168
|
|
|
134
|
-
if (srcStart >= srcEnd)
|
|
169
|
+
if (srcStart >= srcEnd)
|
|
170
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
135
171
|
const end = deserializeSetDirect<T>(srcStart, srcEnd, out, true);
|
|
136
172
|
if (end != srcEnd) throw new Error("Expected ']' at end of set");
|
|
137
173
|
return out;
|
|
138
174
|
}
|
|
139
175
|
|
|
140
176
|
// @ts-expect-error: Decorator valid here
|
|
141
|
-
@inline export function deserializeSetInto<T extends Set<any>>(
|
|
177
|
+
@inline export function deserializeSetInto<T extends Set<any>>(
|
|
178
|
+
srcStart: usize,
|
|
179
|
+
srcEnd: usize,
|
|
180
|
+
out: T,
|
|
181
|
+
): usize {
|
|
142
182
|
changetype<nonnull<T>>(out).clear();
|
|
143
183
|
return deserializeSetDirect<T>(srcStart, srcEnd, changetype<nonnull<T>>(out));
|
|
144
184
|
}
|
|
145
185
|
|
|
146
186
|
// @ts-expect-error: Decorator valid here
|
|
147
|
-
@inline export function deserializeSetField<T extends Set<any>>(
|
|
187
|
+
@inline export function deserializeSetField<T extends Set<any>>(
|
|
188
|
+
srcStart: usize,
|
|
189
|
+
srcEnd: usize,
|
|
190
|
+
dstObj: usize,
|
|
191
|
+
dstOffset: usize = 0,
|
|
192
|
+
): usize {
|
|
148
193
|
let out = load<T>(dstObj, dstOffset);
|
|
149
194
|
if (!changetype<usize>(out)) {
|
|
150
195
|
out = changetype<T>(instantiate<T>());
|
|
@@ -2,7 +2,11 @@ import { JSON } from "../../..";
|
|
|
2
2
|
import { QUOTE } from "../../../custom/chars";
|
|
3
3
|
import { isUnescapedQuote } from "../../../util";
|
|
4
4
|
|
|
5
|
-
export function deserializeStaticArrayString(
|
|
5
|
+
export function deserializeStaticArrayString(
|
|
6
|
+
srcStart: usize,
|
|
7
|
+
srcEnd: usize,
|
|
8
|
+
dst: usize,
|
|
9
|
+
): StaticArray<string> {
|
|
6
10
|
// First pass: count elements using same logic as Array deserializer
|
|
7
11
|
let count: i32 = 0;
|
|
8
12
|
let ptr = srcStart;
|
|
@@ -22,7 +26,9 @@ export function deserializeStaticArrayString(srcStart: usize, srcEnd: usize, dst
|
|
|
22
26
|
|
|
23
27
|
// Allocate StaticArray with correct size
|
|
24
28
|
const outSize = (<usize>count) << alignof<string>();
|
|
25
|
-
const out = changetype<StaticArray<string>>(
|
|
29
|
+
const out = changetype<StaticArray<string>>(
|
|
30
|
+
dst || __new(outSize, idof<StaticArray<string>>()),
|
|
31
|
+
);
|
|
26
32
|
|
|
27
33
|
// Second pass: populate values
|
|
28
34
|
let index = 0;
|
|
@@ -35,7 +41,9 @@ export function deserializeStaticArrayString(srcStart: usize, srcEnd: usize, dst
|
|
|
35
41
|
inString = true;
|
|
36
42
|
lastPos = srcStart;
|
|
37
43
|
} else if (isUnescapedQuote(srcStart)) {
|
|
38
|
-
unchecked(
|
|
44
|
+
unchecked(
|
|
45
|
+
(out[index++] = JSON.__deserialize<string>(lastPos, srcStart + 2)),
|
|
46
|
+
);
|
|
39
47
|
inString = false;
|
|
40
48
|
}
|
|
41
49
|
}
|
|
@@ -18,7 +18,10 @@ import { deserializeStaticArrayString } from "./staticarray/string";
|
|
|
18
18
|
import { scanValueEnd } from "../swar/array/shared";
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
@inline function materializeStaticArray<T extends StaticArray<any>>(
|
|
21
|
+
@inline function materializeStaticArray<T extends StaticArray<any>>(
|
|
22
|
+
src: valueof<T>[],
|
|
23
|
+
dst: usize,
|
|
24
|
+
): T {
|
|
22
25
|
const byteLength = <usize>src.length * sizeof<valueof<T>>();
|
|
23
26
|
let out = dst;
|
|
24
27
|
|
|
@@ -35,7 +38,11 @@ import { scanValueEnd } from "../swar/array/shared";
|
|
|
35
38
|
return typed;
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
export function deserializeStaticArray<T extends StaticArray<any>>(
|
|
41
|
+
export function deserializeStaticArray<T extends StaticArray<any>>(
|
|
42
|
+
srcStart: usize,
|
|
43
|
+
srcEnd: usize,
|
|
44
|
+
dst: usize,
|
|
45
|
+
): T {
|
|
39
46
|
if (isString<valueof<T>>()) {
|
|
40
47
|
return changetype<T>(deserializeStaticArrayString(srcStart, srcEnd, dst));
|
|
41
48
|
} else if (isBoolean<valueof<T>>()) {
|
|
@@ -45,27 +52,61 @@ export function deserializeStaticArray<T extends StaticArray<any>>(srcStart: usi
|
|
|
45
52
|
} else if (isFloat<valueof<T>>()) {
|
|
46
53
|
return deserializeStaticArrayFloat<T>(srcStart, srcEnd, dst);
|
|
47
54
|
} else if (isArray<valueof<T>>()) {
|
|
48
|
-
return materializeStaticArray<T>(
|
|
55
|
+
return materializeStaticArray<T>(
|
|
56
|
+
deserializeArrayArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
57
|
+
dst,
|
|
58
|
+
);
|
|
49
59
|
} else if (isManaged<valueof<T>>() || isReference<valueof<T>>()) {
|
|
50
60
|
const type = changetype<nonnull<valueof<T>>>(0);
|
|
51
61
|
if (type instanceof StaticArray) {
|
|
52
|
-
return materializeStaticArray<T>(
|
|
62
|
+
return materializeStaticArray<T>(
|
|
63
|
+
deserializeArrayArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
64
|
+
dst,
|
|
65
|
+
);
|
|
53
66
|
} else if (type instanceof JSON.Value) {
|
|
54
|
-
return materializeStaticArray<T>(
|
|
67
|
+
return materializeStaticArray<T>(
|
|
68
|
+
changetype<valueof<T>[]>(
|
|
69
|
+
deserializeArbitraryArray(srcStart, srcEnd, 0),
|
|
70
|
+
),
|
|
71
|
+
dst,
|
|
72
|
+
);
|
|
55
73
|
} else if (type instanceof JSON.Box) {
|
|
56
|
-
return materializeStaticArray<T>(
|
|
74
|
+
return materializeStaticArray<T>(
|
|
75
|
+
changetype<valueof<T>[]>(
|
|
76
|
+
deserializeBoxArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
77
|
+
),
|
|
78
|
+
dst,
|
|
79
|
+
);
|
|
57
80
|
} else if (type instanceof JSON.Obj) {
|
|
58
|
-
return materializeStaticArray<T>(
|
|
81
|
+
return materializeStaticArray<T>(
|
|
82
|
+
deserializeObjectArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
83
|
+
dst,
|
|
84
|
+
);
|
|
59
85
|
} else if (type instanceof JSON.Raw) {
|
|
60
|
-
return materializeStaticArray<T>(
|
|
86
|
+
return materializeStaticArray<T>(
|
|
87
|
+
changetype<valueof<T>[]>(deserializeRawArray(srcStart, srcEnd, 0)),
|
|
88
|
+
dst,
|
|
89
|
+
);
|
|
61
90
|
} else if (type instanceof Map) {
|
|
62
|
-
return materializeStaticArray<T>(
|
|
91
|
+
return materializeStaticArray<T>(
|
|
92
|
+
deserializeMapArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
93
|
+
dst,
|
|
94
|
+
);
|
|
63
95
|
// @ts-ignore: supplied by transform
|
|
64
96
|
} else if (isDefined(type.__DESERIALIZE_CUSTOM)) {
|
|
65
|
-
return materializeStaticArray<T>(
|
|
97
|
+
return materializeStaticArray<T>(
|
|
98
|
+
deserializeStructArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
99
|
+
dst,
|
|
100
|
+
);
|
|
66
101
|
// @ts-ignore: supplied by transform
|
|
67
|
-
} else if (
|
|
68
|
-
|
|
102
|
+
} else if (
|
|
103
|
+
isDefined(type.__DESERIALIZE_SLOW) ||
|
|
104
|
+
isDefined(type.__DESERIALIZE_FAST)
|
|
105
|
+
) {
|
|
106
|
+
return materializeStaticArray<T>(
|
|
107
|
+
deserializeStructArray<valueof<T>[]>(srcStart, srcEnd, 0),
|
|
108
|
+
dst,
|
|
109
|
+
);
|
|
69
110
|
}
|
|
70
111
|
}
|
|
71
112
|
|
|
@@ -73,12 +114,21 @@ export function deserializeStaticArray<T extends StaticArray<any>>(srcStart: usi
|
|
|
73
114
|
}
|
|
74
115
|
|
|
75
116
|
|
|
76
|
-
@inline export function deserializeStaticArrayField<T extends StaticArray<any>>(
|
|
117
|
+
@inline export function deserializeStaticArrayField<T extends StaticArray<any>>(
|
|
118
|
+
srcStart: usize,
|
|
119
|
+
srcEnd: usize,
|
|
120
|
+
dstObj: usize,
|
|
121
|
+
dstOffset: usize = 0,
|
|
122
|
+
): usize {
|
|
77
123
|
const valueEnd = scanValueEnd(srcStart, srcEnd);
|
|
78
124
|
if (!valueEnd) throw new Error("Failed to parse JSON!");
|
|
79
125
|
|
|
80
126
|
const fieldPtr = dstObj + dstOffset;
|
|
81
|
-
const out = deserializeStaticArray<T>(
|
|
127
|
+
const out = deserializeStaticArray<T>(
|
|
128
|
+
srcStart,
|
|
129
|
+
valueEnd,
|
|
130
|
+
load<usize>(fieldPtr),
|
|
131
|
+
);
|
|
82
132
|
store<T>(fieldPtr, out);
|
|
83
133
|
return valueEnd;
|
|
84
134
|
}
|
|
@@ -1,35 +1,12 @@
|
|
|
1
|
-
import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
|
|
2
|
-
import { __heap_base } from "memory";
|
|
3
1
|
import { bs } from "../../../lib/as-bs";
|
|
4
|
-
import {
|
|
5
|
-
import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables";
|
|
2
|
+
import { DESERIALIZE_ESCAPE_TABLE } from "../../globals/tables";
|
|
6
3
|
import { hex4_to_u16_swar } from "../../util/swar";
|
|
7
4
|
|
|
8
5
|
// @ts-ignore: inline
|
|
9
|
-
@inline function
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const current = load<usize>(dstFieldPtr);
|
|
16
|
-
let stringPtr: usize;
|
|
17
|
-
if (current >= __heap_base) {
|
|
18
|
-
if (changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
|
|
19
|
-
stringPtr = current;
|
|
20
|
-
} else {
|
|
21
|
-
stringPtr = __renew(current, byteLength);
|
|
22
|
-
store<usize>(dstFieldPtr, stringPtr);
|
|
23
|
-
}
|
|
24
|
-
} else {
|
|
25
|
-
stringPtr = __new(byteLength, idof<string>());
|
|
26
|
-
store<usize>(dstFieldPtr, stringPtr);
|
|
27
|
-
}
|
|
28
|
-
memory.copy(stringPtr, srcStart, byteLength);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// @ts-ignore: inline
|
|
32
|
-
@inline export function deserializeString(srcStart: usize, srcEnd: usize): string {
|
|
6
|
+
@inline export function deserializeString(
|
|
7
|
+
srcStart: usize,
|
|
8
|
+
srcEnd: usize,
|
|
9
|
+
): string {
|
|
33
10
|
// Strip quotes
|
|
34
11
|
srcStart += 2;
|
|
35
12
|
srcEnd -= 2;
|
|
@@ -66,67 +43,3 @@ import { hex4_to_u16_swar } from "../../util/swar";
|
|
|
66
43
|
}
|
|
67
44
|
return bs.sliceOut<string>(outStart);
|
|
68
45
|
}
|
|
69
|
-
|
|
70
|
-
// @ts-ignore: inline
|
|
71
|
-
@inline export function deserializeStringField<T extends string | null>(srcStart: usize, srcEnd: usize, dstObj: usize, dstOffset: usize = 0): usize {
|
|
72
|
-
const dstFieldPtr = dstObj + dstOffset;
|
|
73
|
-
if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
|
|
74
|
-
|
|
75
|
-
const payloadStart = srcStart + 2;
|
|
76
|
-
srcStart = payloadStart;
|
|
77
|
-
|
|
78
|
-
while (srcStart < srcEnd) {
|
|
79
|
-
const char = load<u16>(srcStart);
|
|
80
|
-
if (char == QUOTE) {
|
|
81
|
-
writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
|
|
82
|
-
return srcStart + 2;
|
|
83
|
-
}
|
|
84
|
-
if (char != BACK_SLASH) {
|
|
85
|
-
srcStart += 2;
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
bs.offset = bs.buffer;
|
|
90
|
-
bs.ensureSize(u32(srcEnd - payloadStart));
|
|
91
|
-
const prefixLen = <u32>(srcStart - payloadStart);
|
|
92
|
-
if (prefixLen != 0) {
|
|
93
|
-
memory.copy(bs.buffer, payloadStart, prefixLen);
|
|
94
|
-
bs.offset += prefixLen;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
while (srcStart < srcEnd) {
|
|
98
|
-
const block = load<u16>(srcStart);
|
|
99
|
-
if (block == QUOTE) {
|
|
100
|
-
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
101
|
-
bs.offset = bs.buffer;
|
|
102
|
-
return srcStart + 2;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (block != BACK_SLASH) {
|
|
106
|
-
store<u16>(bs.offset, block);
|
|
107
|
-
srcStart += 2;
|
|
108
|
-
bs.offset += 2;
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
srcStart += 2;
|
|
113
|
-
const code = load<u16>(srcStart);
|
|
114
|
-
if (code !== 0x75) {
|
|
115
|
-
const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
|
|
116
|
-
store<u16>(bs.offset, escape);
|
|
117
|
-
srcStart += 2;
|
|
118
|
-
} else {
|
|
119
|
-
const escaped = hex4_to_u16_swar(load<u64>(srcStart, 2));
|
|
120
|
-
store<u16>(bs.offset, escaped);
|
|
121
|
-
srcStart += 10;
|
|
122
|
-
}
|
|
123
|
-
bs.offset += 2;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
bs.offset = bs.buffer;
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
abort("Unterminated string literal");
|
|
131
|
-
return srcStart;
|
|
132
|
-
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export function deserializeStruct<T>(
|
|
1
|
+
export function deserializeStruct<T>(
|
|
2
|
+
srcStart: usize,
|
|
3
|
+
srcEnd: usize,
|
|
4
|
+
dst: usize,
|
|
5
|
+
): T {
|
|
2
6
|
const out = changetype<nonnull<T>>(dst || __new(offsetof<T>(), idof<T>()));
|
|
3
7
|
|
|
4
8
|
// @ts-ignore: supplied by transform
|
|
@@ -25,7 +25,11 @@ import { atoi, isSpace } from "../../util";
|
|
|
25
25
|
return count;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export function deserializeTypedArray<T extends ArrayLike<number>>(
|
|
28
|
+
export function deserializeTypedArray<T extends ArrayLike<number>>(
|
|
29
|
+
srcStart: usize,
|
|
30
|
+
srcEnd: usize,
|
|
31
|
+
dst: usize = 0,
|
|
32
|
+
): T {
|
|
29
33
|
const count = countTypedArrayElements(srcStart, srcEnd);
|
|
30
34
|
let out = changetype<T>(dst || changetype<usize>(instantiate<T>(count)));
|
|
31
35
|
|
|
@@ -44,7 +48,12 @@ export function deserializeTypedArray<T extends ArrayLike<number>>(srcStart: usi
|
|
|
44
48
|
const code = load<u16>(srcStart);
|
|
45
49
|
if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) {
|
|
46
50
|
if (isFloat<valueof<T>>()) {
|
|
47
|
-
unchecked(
|
|
51
|
+
unchecked(
|
|
52
|
+
(out[index++] = deserializeFloat<valueof<T>>(
|
|
53
|
+
lastIndex,
|
|
54
|
+
srcStart,
|
|
55
|
+
)),
|
|
56
|
+
);
|
|
48
57
|
} else {
|
|
49
58
|
unchecked((out[index++] = atoi<valueof<T>>(lastIndex, srcStart)));
|
|
50
59
|
}
|
|
@@ -60,7 +69,11 @@ export function deserializeTypedArray<T extends ArrayLike<number>>(srcStart: usi
|
|
|
60
69
|
return out;
|
|
61
70
|
}
|
|
62
71
|
|
|
63
|
-
export function deserializeArrayBuffer(
|
|
72
|
+
export function deserializeArrayBuffer(
|
|
73
|
+
srcStart: usize,
|
|
74
|
+
srcEnd: usize,
|
|
75
|
+
dst: usize = 0,
|
|
76
|
+
): ArrayBuffer {
|
|
64
77
|
const count = countTypedArrayElements(srcStart, srcEnd);
|
|
65
78
|
let out = dst ? changetype<ArrayBuffer>(dst) : new ArrayBuffer(count);
|
|
66
79
|
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { atoi } from "../../util/atoi";
|
|
2
2
|
|
|
3
3
|
// @ts-ignore: inline
|
|
4
|
-
@inline export function deserializeUnsigned<T>(
|
|
4
|
+
@inline export function deserializeUnsigned<T>(
|
|
5
|
+
srcStart: usize,
|
|
6
|
+
srcEnd: usize,
|
|
7
|
+
): T {
|
|
5
8
|
return atoi<T>(srcStart, srcEnd);
|
|
6
9
|
}
|
|
7
10
|
|
|
8
11
|
// @ts-ignore: inline
|
|
9
|
-
@inline export function deserializeUnsignedField<T extends number>(
|
|
12
|
+
@inline export function deserializeUnsignedField<T extends number>(
|
|
13
|
+
srcStart: usize,
|
|
14
|
+
srcEnd: usize,
|
|
15
|
+
dstObj: usize,
|
|
16
|
+
dstOffset: usize = 0,
|
|
17
|
+
): usize {
|
|
10
18
|
const fieldPtr = dstObj + dstOffset;
|
|
11
19
|
let digit = <u32>load<u16>(srcStart) - 48;
|
|
12
20
|
if (digit > 9) unreachable();
|
|
@@ -61,16 +69,3 @@ import { atoi } from "../../util/atoi";
|
|
|
61
69
|
return srcStart;
|
|
62
70
|
}
|
|
63
71
|
}
|
|
64
|
-
|
|
65
|
-
export function deserializeUnsignedScan<T extends number>(src: usize, dst: usize): usize {
|
|
66
|
-
let digit = <T>load<u16>(src) - 48;
|
|
67
|
-
if (digit > 9) abort("Found invalid digit");
|
|
68
|
-
let val = digit;
|
|
69
|
-
src += 2;
|
|
70
|
-
while ((digit = <u32>load<u16>(src) - 48) < 10) {
|
|
71
|
-
val = val * 10 + digit;
|
|
72
|
-
src += 2;
|
|
73
|
-
}
|
|
74
|
-
store<T>(dst, val);
|
|
75
|
-
return src;
|
|
76
|
-
}
|
|
@@ -2,7 +2,11 @@ import { JSON } from "../../..";
|
|
|
2
2
|
import { ensureArrayField } from "./shared";
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
@inline export function deserializeArbitraryArrayField(
|
|
5
|
+
@inline export function deserializeArbitraryArrayField(
|
|
6
|
+
srcStart: usize,
|
|
7
|
+
srcEnd: usize,
|
|
8
|
+
fieldPtr: usize,
|
|
9
|
+
): usize {
|
|
6
10
|
ensureArrayField<JSON.Value[]>(fieldPtr);
|
|
7
11
|
throw new Error("Failed to parse JSON!");
|
|
8
12
|
}
|