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