json-as 1.3.5 → 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 +17 -1
- 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 +9 -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 +25 -8
- package/assembly/tsconfig.json +1 -21
- 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 +12 -4
- 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,19 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BRACE_LEFT,
|
|
3
|
+
BRACE_RIGHT,
|
|
4
|
+
BRACKET_LEFT,
|
|
5
|
+
BRACKET_RIGHT,
|
|
6
|
+
} from "../../../custom/chars";
|
|
2
7
|
import { JSON } from "../../..";
|
|
3
8
|
import { isSpace } from "util/string";
|
|
4
9
|
|
|
5
|
-
export function deserializeMapArray<T extends Map<any, any>[]>(
|
|
6
|
-
|
|
10
|
+
export function deserializeMapArray<T extends Map<any, any>[]>(
|
|
11
|
+
srcStart: usize,
|
|
12
|
+
srcEnd: usize,
|
|
13
|
+
dst: usize,
|
|
14
|
+
): T {
|
|
15
|
+
const out = changetype<nonnull<T>>(
|
|
16
|
+
dst || changetype<usize>(instantiate<T>()),
|
|
17
|
+
);
|
|
7
18
|
let lastIndex: usize = 0;
|
|
8
19
|
let depth: u32 = 0;
|
|
9
20
|
|
|
10
21
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
11
22
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
|
|
12
23
|
|
|
13
|
-
if (srcStart - srcEnd == 0)
|
|
24
|
+
if (srcStart - srcEnd == 0)
|
|
25
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
14
26
|
|
|
15
|
-
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
16
|
-
|
|
27
|
+
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Expected '[' at start of object at position " +
|
|
30
|
+
(srcEnd - srcStart).toString(),
|
|
31
|
+
);
|
|
32
|
+
if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
|
|
33
|
+
throw new Error(
|
|
34
|
+
"Expected ']' at end of object at position " +
|
|
35
|
+
(srcEnd - srcStart).toString(),
|
|
36
|
+
);
|
|
17
37
|
|
|
18
38
|
while (srcStart < srcEnd) {
|
|
19
39
|
const code = load<u16>(srcStart);
|
|
@@ -1,19 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BRACE_LEFT,
|
|
3
|
+
BRACE_RIGHT,
|
|
4
|
+
BRACKET_LEFT,
|
|
5
|
+
BRACKET_RIGHT,
|
|
6
|
+
} from "../../../custom/chars";
|
|
2
7
|
import { JSON } from "../../..";
|
|
3
8
|
import { isSpace } from "util/string";
|
|
4
9
|
|
|
5
|
-
export function deserializeObjectArray<T extends unknown[]>(
|
|
6
|
-
|
|
10
|
+
export function deserializeObjectArray<T extends unknown[]>(
|
|
11
|
+
srcStart: usize,
|
|
12
|
+
srcEnd: usize,
|
|
13
|
+
dst: usize,
|
|
14
|
+
): T {
|
|
15
|
+
const out = changetype<nonnull<T>>(
|
|
16
|
+
dst || changetype<usize>(instantiate<T>()),
|
|
17
|
+
);
|
|
7
18
|
let lastIndex: usize = 0;
|
|
8
19
|
let depth: u32 = 0;
|
|
9
20
|
|
|
10
21
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
11
22
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
|
|
12
23
|
|
|
13
|
-
if (srcStart - srcEnd == 0)
|
|
24
|
+
if (srcStart - srcEnd == 0)
|
|
25
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
14
26
|
|
|
15
|
-
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
16
|
-
|
|
27
|
+
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Expected '[' at start of object at position " +
|
|
30
|
+
(srcEnd - srcStart).toString(),
|
|
31
|
+
);
|
|
32
|
+
if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
|
|
33
|
+
throw new Error(
|
|
34
|
+
"Expected ']' at end of object at position " +
|
|
35
|
+
(srcEnd - srcStart).toString(),
|
|
36
|
+
);
|
|
17
37
|
|
|
18
38
|
while (srcStart < srcEnd) {
|
|
19
39
|
const code = load<u16>(srcStart);
|
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
import { isSpace, isUnescapedQuote, scanStringEnd } from "../../../util";
|
|
2
|
-
import {
|
|
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";
|
|
3
14
|
import { JSON } from "../../..";
|
|
4
15
|
import { ptrToStr } from "../../../util/ptrToStr";
|
|
5
16
|
|
|
6
|
-
export function deserializeRawArray(
|
|
17
|
+
export function deserializeRawArray(
|
|
18
|
+
srcStart: usize,
|
|
19
|
+
srcEnd: usize,
|
|
20
|
+
dst: usize,
|
|
21
|
+
): JSON.Raw[] {
|
|
7
22
|
// console.log("data: " + ptrToStr(srcStart, srcEnd));
|
|
8
|
-
const out = changetype<JSON.Raw[]>(
|
|
23
|
+
const out = changetype<JSON.Raw[]>(
|
|
24
|
+
dst || changetype<usize>(instantiate<JSON.Raw[]>()),
|
|
25
|
+
);
|
|
9
26
|
let lastIndex: usize = 0;
|
|
10
27
|
let depth = 0;
|
|
11
28
|
srcStart += 2;
|
|
@@ -19,7 +36,8 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
|
|
|
19
36
|
} else if (code == QUOTE) {
|
|
20
37
|
lastIndex = srcStart;
|
|
21
38
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
22
|
-
if (srcStart >= srcEnd)
|
|
39
|
+
if (srcStart >= srcEnd)
|
|
40
|
+
throw new Error("Unterminated string in JSON array");
|
|
23
41
|
out.push(JSON.Raw.from(ptrToStr(lastIndex, srcStart + 2)));
|
|
24
42
|
srcStart += 2;
|
|
25
43
|
} else if (code - 48 <= 9 || code == 45) {
|
|
@@ -43,7 +61,8 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
|
|
|
43
61
|
const code = load<u16>(srcStart);
|
|
44
62
|
if (code == QUOTE) {
|
|
45
63
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
46
|
-
if (srcStart >= srcEnd)
|
|
64
|
+
if (srcStart >= srcEnd)
|
|
65
|
+
throw new Error("Unterminated string in JSON array");
|
|
47
66
|
} else if (code == BRACE_RIGHT) {
|
|
48
67
|
if (--depth == 0) {
|
|
49
68
|
// console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
|
|
@@ -62,7 +81,8 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
|
|
|
62
81
|
const code = load<u16>(srcStart);
|
|
63
82
|
if (code == QUOTE) {
|
|
64
83
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
65
|
-
if (srcStart >= srcEnd)
|
|
84
|
+
if (srcStart >= srcEnd)
|
|
85
|
+
throw new Error("Unterminated string in JSON array");
|
|
66
86
|
} else if (code == BRACKET_RIGHT) {
|
|
67
87
|
if (--depth == 0) {
|
|
68
88
|
// console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
|
|
@@ -92,7 +112,14 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
|
|
|
92
112
|
srcStart += 10;
|
|
93
113
|
}
|
|
94
114
|
} else {
|
|
95
|
-
throw new Error(
|
|
115
|
+
throw new Error(
|
|
116
|
+
"Unexpected character in JSON object '" +
|
|
117
|
+
String.fromCharCode(code) +
|
|
118
|
+
"' at position " +
|
|
119
|
+
(srcEnd - srcStart).toString() +
|
|
120
|
+
" " +
|
|
121
|
+
ptrToStr(lastIndex, srcStart + 10),
|
|
122
|
+
);
|
|
96
123
|
}
|
|
97
124
|
}
|
|
98
125
|
return out;
|
|
@@ -2,8 +2,14 @@ import { JSON } from "../../..";
|
|
|
2
2
|
import { QUOTE } from "../../../custom/chars";
|
|
3
3
|
import { isUnescapedQuote } from "../../../util";
|
|
4
4
|
|
|
5
|
-
export function deserializeStringArray(
|
|
6
|
-
|
|
5
|
+
export function deserializeStringArray(
|
|
6
|
+
srcStart: usize,
|
|
7
|
+
srcEnd: usize,
|
|
8
|
+
dst: usize,
|
|
9
|
+
): string[] {
|
|
10
|
+
const out = changetype<string[]>(
|
|
11
|
+
dst || changetype<usize>(instantiate<string[]>()),
|
|
12
|
+
);
|
|
7
13
|
let lastPos: usize = 2;
|
|
8
14
|
let inString = false;
|
|
9
15
|
while (srcStart < srcEnd) {
|
|
@@ -1,19 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BRACE_LEFT,
|
|
3
|
+
BRACE_RIGHT,
|
|
4
|
+
BRACKET_LEFT,
|
|
5
|
+
BRACKET_RIGHT,
|
|
6
|
+
} from "../../../custom/chars";
|
|
2
7
|
import { JSON } from "../../..";
|
|
3
8
|
import { isSpace } from "util/string";
|
|
4
9
|
|
|
5
|
-
export function deserializeStructArray<T extends unknown[]>(
|
|
6
|
-
|
|
10
|
+
export function deserializeStructArray<T extends unknown[]>(
|
|
11
|
+
srcStart: usize,
|
|
12
|
+
srcEnd: usize,
|
|
13
|
+
dst: usize,
|
|
14
|
+
): T {
|
|
15
|
+
const out = changetype<nonnull<T>>(
|
|
16
|
+
dst || changetype<usize>(instantiate<T>()),
|
|
17
|
+
);
|
|
7
18
|
let lastIndex: usize = 0;
|
|
8
19
|
let depth: u32 = 0;
|
|
9
20
|
|
|
10
21
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
11
22
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
|
|
12
23
|
|
|
13
|
-
if (srcStart - srcEnd == 0)
|
|
24
|
+
if (srcStart - srcEnd == 0)
|
|
25
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
14
26
|
|
|
15
|
-
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
16
|
-
|
|
27
|
+
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Expected '[' at start of object at position " +
|
|
30
|
+
(srcEnd - srcStart).toString(),
|
|
31
|
+
);
|
|
32
|
+
if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
|
|
33
|
+
throw new Error(
|
|
34
|
+
"Expected ']' at end of object at position " +
|
|
35
|
+
(srcEnd - srcStart).toString(),
|
|
36
|
+
);
|
|
17
37
|
|
|
18
38
|
while (srcStart < srcEnd) {
|
|
19
39
|
const code = load<u16>(srcStart);
|
|
@@ -11,10 +11,17 @@ import { deserializeStringArray } from "./array/string";
|
|
|
11
11
|
import { deserializeObjectArray } from "./array/object";
|
|
12
12
|
import { deserializeBoxArray } from "./array/box";
|
|
13
13
|
import { deserializeRawArray } from "./array/raw";
|
|
14
|
-
export {
|
|
14
|
+
export {
|
|
15
|
+
deserializeArrayField,
|
|
16
|
+
deserializeArrayField as deserializeArrayField_SWAR,
|
|
17
|
+
} from "../swar/array";
|
|
15
18
|
|
|
16
19
|
// @ts-ignore: Decorator valid here
|
|
17
|
-
export function deserializeArray<T extends unknown[]>(
|
|
20
|
+
export function deserializeArray<T extends unknown[]>(
|
|
21
|
+
srcStart: usize,
|
|
22
|
+
srcEnd: usize,
|
|
23
|
+
dst: usize,
|
|
24
|
+
): T {
|
|
18
25
|
if (isString<valueof<T>>()) {
|
|
19
26
|
return <T>deserializeStringArray(srcStart, srcEnd, dst);
|
|
20
27
|
} else if (isBoolean<valueof<T>>()) {
|
|
@@ -56,7 +63,10 @@ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: u
|
|
|
56
63
|
} else if (isDefined(type.__DESERIALIZE_CUSTOM)) {
|
|
57
64
|
return deserializeStructArray<T>(srcStart, srcEnd, dst);
|
|
58
65
|
// @ts-ignore: defined by transform
|
|
59
|
-
} else if (
|
|
66
|
+
} else if (
|
|
67
|
+
isDefined(type.__DESERIALIZE_SLOW) ||
|
|
68
|
+
isDefined(type.__DESERIALIZE_FAST)
|
|
69
|
+
) {
|
|
60
70
|
return deserializeStructArray<T>(srcStart, srcEnd, dst);
|
|
61
71
|
}
|
|
62
72
|
throw new Error("Could not parse array of type " + nameof<T>() + "!");
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
// @ts-ignore: inline
|
|
2
|
-
@inline export function deserializeBoolean(
|
|
2
|
+
@inline export function deserializeBoolean(
|
|
3
|
+
srcStart: usize,
|
|
4
|
+
srcEnd: usize,
|
|
5
|
+
): boolean {
|
|
3
6
|
const block = load<u64>(srcStart);
|
|
4
7
|
if (block == 28429475166421108) return true;
|
|
5
|
-
else if (block == 32370086184550502 && load<u16>(srcStart, 8) == 101)
|
|
8
|
+
else if (block == 32370086184550502 && load<u16>(srcStart, 8) == 101)
|
|
9
|
+
return false;
|
|
6
10
|
return false; //throw new Error(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
|
|
7
11
|
}
|
|
@@ -119,7 +119,12 @@ import { ptrToStr } from "../../util/ptrToStr";
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
// @ts-ignore: inline
|
|
122
|
-
@inline export function deserializeFloatField<T extends number>(
|
|
122
|
+
@inline export function deserializeFloatField<T extends number>(
|
|
123
|
+
srcStart: usize,
|
|
124
|
+
srcEnd: usize,
|
|
125
|
+
dstObj: usize,
|
|
126
|
+
dstOffset: usize = 0,
|
|
127
|
+
): usize {
|
|
123
128
|
const fieldPtr = dstObj + dstOffset;
|
|
124
129
|
let negative = false;
|
|
125
130
|
if (load<u16>(srcStart) == 45) {
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { atoi } from "../../util/atoi";
|
|
2
2
|
|
|
3
3
|
// @ts-ignore: inline
|
|
4
|
-
@inline export function deserializeInteger<T>(
|
|
4
|
+
@inline export function deserializeInteger<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 deserializeIntegerField<T extends number>(
|
|
12
|
+
@inline export function deserializeIntegerField<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 negative = false;
|
|
12
20
|
if (load<u16>(srcStart) == 45) {
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { JSON } from "../..";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BACK_SLASH,
|
|
4
|
+
COMMA,
|
|
5
|
+
CHAR_F,
|
|
6
|
+
BRACE_LEFT,
|
|
7
|
+
BRACKET_LEFT,
|
|
8
|
+
CHAR_N,
|
|
9
|
+
QUOTE,
|
|
10
|
+
BRACE_RIGHT,
|
|
11
|
+
BRACKET_RIGHT,
|
|
12
|
+
CHAR_T,
|
|
13
|
+
COLON,
|
|
14
|
+
} from "../../custom/chars";
|
|
3
15
|
import { isSpace, isUnescapedQuote, scanStringEnd } from "../../util";
|
|
4
16
|
import { scanValueEnd } from "../swar/array/shared";
|
|
5
17
|
|
|
@@ -10,8 +22,14 @@ import { scanValueEnd } from "../swar/array/shared";
|
|
|
10
22
|
return JSON.parse<T>(keyText);
|
|
11
23
|
}
|
|
12
24
|
|
|
13
|
-
export function deserializeMap<T extends Map<any, any>>(
|
|
14
|
-
|
|
25
|
+
export function deserializeMap<T extends Map<any, any>>(
|
|
26
|
+
srcStart: usize,
|
|
27
|
+
srcEnd: usize,
|
|
28
|
+
dst: usize,
|
|
29
|
+
): T {
|
|
30
|
+
const out = changetype<nonnull<T>>(
|
|
31
|
+
dst || changetype<usize>(instantiate<T>()),
|
|
32
|
+
);
|
|
15
33
|
|
|
16
34
|
let keyStart: usize = 0;
|
|
17
35
|
let keyEnd: usize = 0;
|
|
@@ -22,9 +40,18 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
22
40
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
23
41
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2; // would like to optimize this later
|
|
24
42
|
|
|
25
|
-
if (srcStart - srcEnd == 0)
|
|
26
|
-
|
|
27
|
-
if (load<u16>(
|
|
43
|
+
if (srcStart - srcEnd == 0)
|
|
44
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
45
|
+
if (load<u16>(srcStart) != BRACE_LEFT)
|
|
46
|
+
throw new Error(
|
|
47
|
+
"Expected '{' at start of object at position " +
|
|
48
|
+
(srcEnd - srcStart).toString(),
|
|
49
|
+
);
|
|
50
|
+
if (load<u16>(srcEnd - 2) != BRACE_RIGHT)
|
|
51
|
+
throw new Error(
|
|
52
|
+
"Expected '}' at end of object at position " +
|
|
53
|
+
(srcEnd - srcStart).toString(),
|
|
54
|
+
);
|
|
28
55
|
|
|
29
56
|
srcStart += 2;
|
|
30
57
|
while (srcStart < srcEnd) {
|
|
@@ -37,7 +64,11 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
37
64
|
// console.log("Key: " + ptrToStr(lastIndex, srcStart));
|
|
38
65
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
|
|
39
66
|
while (isSpace((code = load<u16>((srcStart += 2))))) {}
|
|
40
|
-
if (code !== COLON)
|
|
67
|
+
if (code !== COLON)
|
|
68
|
+
throw new Error(
|
|
69
|
+
"Expected ':' after key at position " +
|
|
70
|
+
(srcEnd - srcStart).toString(),
|
|
71
|
+
);
|
|
41
72
|
isKey = false;
|
|
42
73
|
} else {
|
|
43
74
|
// console.log("Got key start");
|
|
@@ -51,9 +82,13 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
51
82
|
if (code == QUOTE) {
|
|
52
83
|
lastIndex = srcStart;
|
|
53
84
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
54
|
-
if (srcStart >= srcEnd)
|
|
85
|
+
if (srcStart >= srcEnd)
|
|
86
|
+
throw new Error("Unterminated string in JSON object");
|
|
55
87
|
// @ts-ignore: type
|
|
56
|
-
out.set(
|
|
88
|
+
out.set(
|
|
89
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
90
|
+
JSON.__deserialize<valueof<T>>(lastIndex, srcStart + 2),
|
|
91
|
+
);
|
|
57
92
|
srcStart += 2;
|
|
58
93
|
keyStart = 0;
|
|
59
94
|
continue;
|
|
@@ -65,7 +100,10 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
65
100
|
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
|
|
66
101
|
// console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
|
|
67
102
|
// @ts-ignore: type
|
|
68
|
-
out.set(
|
|
103
|
+
out.set(
|
|
104
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
105
|
+
JSON.__deserialize<valueof<T>>(lastIndex, srcStart),
|
|
106
|
+
);
|
|
69
107
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
70
108
|
// /* empty */
|
|
71
109
|
// }
|
|
@@ -84,12 +122,16 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
84
122
|
const code = load<u16>(srcStart);
|
|
85
123
|
if (code == QUOTE) {
|
|
86
124
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
87
|
-
if (srcStart >= srcEnd)
|
|
125
|
+
if (srcStart >= srcEnd)
|
|
126
|
+
throw new Error("Unterminated string in JSON object");
|
|
88
127
|
} else if (code == BRACE_RIGHT) {
|
|
89
128
|
if (--depth == 0) {
|
|
90
129
|
// console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
|
|
91
130
|
// @ts-ignore: type
|
|
92
|
-
out.set(
|
|
131
|
+
out.set(
|
|
132
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
133
|
+
JSON.__deserialize<valueof<T>>(lastIndex, (srcStart += 2)),
|
|
134
|
+
);
|
|
93
135
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
94
136
|
keyStart = 0;
|
|
95
137
|
// while (isSpace(load<u16>(srcStart))) {
|
|
@@ -108,12 +150,16 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
108
150
|
const code = load<u16>(srcStart);
|
|
109
151
|
if (code == QUOTE) {
|
|
110
152
|
srcStart = scanStringEnd(srcStart, srcEnd);
|
|
111
|
-
if (srcStart >= srcEnd)
|
|
153
|
+
if (srcStart >= srcEnd)
|
|
154
|
+
throw new Error("Unterminated string in JSON object");
|
|
112
155
|
} else if (code == BRACKET_RIGHT) {
|
|
113
156
|
if (--depth == 0) {
|
|
114
157
|
// console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
|
|
115
158
|
// @ts-ignore: type
|
|
116
|
-
out.set(
|
|
159
|
+
out.set(
|
|
160
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
161
|
+
JSON.__deserialize<valueof<T>>(lastIndex, (srcStart += 2)),
|
|
162
|
+
);
|
|
117
163
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
118
164
|
keyStart = 0;
|
|
119
165
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
@@ -128,7 +174,10 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
128
174
|
if (load<u64>(srcStart) == 28429475166421108) {
|
|
129
175
|
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8));
|
|
130
176
|
// @ts-ignore: type
|
|
131
|
-
out.set(
|
|
177
|
+
out.set(
|
|
178
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
179
|
+
JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)),
|
|
180
|
+
);
|
|
132
181
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
133
182
|
// /* empty */
|
|
134
183
|
// }
|
|
@@ -140,7 +189,10 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
140
189
|
if (load<u64>(srcStart, 2) == 28429466576093281) {
|
|
141
190
|
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10));
|
|
142
191
|
// @ts-ignore: type
|
|
143
|
-
out.set(
|
|
192
|
+
out.set(
|
|
193
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
194
|
+
JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 10)),
|
|
195
|
+
);
|
|
144
196
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
145
197
|
// /* empty */
|
|
146
198
|
// }
|
|
@@ -152,7 +204,10 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
152
204
|
if (load<u64>(srcStart) == 30399761348886638) {
|
|
153
205
|
// console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8));
|
|
154
206
|
// @ts-ignore: type
|
|
155
|
-
out.set(
|
|
207
|
+
out.set(
|
|
208
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
209
|
+
JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)),
|
|
210
|
+
);
|
|
156
211
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
157
212
|
/* empty */
|
|
158
213
|
// }
|
|
@@ -163,7 +218,12 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
163
218
|
} else if (isSpace(code)) {
|
|
164
219
|
srcStart += 2;
|
|
165
220
|
} else {
|
|
166
|
-
throw new Error(
|
|
221
|
+
throw new Error(
|
|
222
|
+
"Unexpected character in JSON object '" +
|
|
223
|
+
String.fromCharCode(code) +
|
|
224
|
+
"' at position " +
|
|
225
|
+
(srcEnd - srcStart).toString(),
|
|
226
|
+
);
|
|
167
227
|
}
|
|
168
228
|
}
|
|
169
229
|
}
|
|
@@ -171,10 +231,15 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
171
231
|
}
|
|
172
232
|
|
|
173
233
|
|
|
174
|
-
@inline export function deserializeMapInto<T extends Map<any, any>>(
|
|
234
|
+
@inline export function deserializeMapInto<T extends Map<any, any>>(
|
|
235
|
+
srcStart: usize,
|
|
236
|
+
srcEnd: usize,
|
|
237
|
+
out: T,
|
|
238
|
+
): usize {
|
|
175
239
|
changetype<nonnull<T>>(out).clear();
|
|
176
240
|
|
|
177
|
-
if (srcStart >= srcEnd || load<u16>(srcStart) != BRACE_LEFT)
|
|
241
|
+
if (srcStart >= srcEnd || load<u16>(srcStart) != BRACE_LEFT)
|
|
242
|
+
throw new Error("Failed to parse JSON!");
|
|
178
243
|
srcStart += 2;
|
|
179
244
|
if (srcStart >= srcEnd) throw new Error("Failed to parse JSON!");
|
|
180
245
|
if (load<u16>(srcStart) == BRACE_RIGHT) return srcStart + 2;
|
|
@@ -194,7 +259,10 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
194
259
|
if (!valueEnd || valueEnd <= srcStart) break;
|
|
195
260
|
|
|
196
261
|
// @ts-ignore: type
|
|
197
|
-
changetype<nonnull<T>>(out).set(
|
|
262
|
+
changetype<nonnull<T>>(out).set(
|
|
263
|
+
deserializeMapKey<indexof<T>>(keyStart, keyEnd),
|
|
264
|
+
JSON.__deserialize<valueof<T>>(srcStart, valueEnd),
|
|
265
|
+
);
|
|
198
266
|
srcStart = valueEnd;
|
|
199
267
|
|
|
200
268
|
if (srcStart >= srcEnd) break;
|
|
@@ -211,7 +279,12 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
|
|
|
211
279
|
}
|
|
212
280
|
|
|
213
281
|
|
|
214
|
-
@inline export function deserializeMapField<T extends Map<any, any>>(
|
|
282
|
+
@inline export function deserializeMapField<T extends Map<any, any>>(
|
|
283
|
+
srcStart: usize,
|
|
284
|
+
srcEnd: usize,
|
|
285
|
+
dstObj: usize,
|
|
286
|
+
dstOffset: usize = 0,
|
|
287
|
+
): usize {
|
|
215
288
|
let out = load<T>(dstObj, dstOffset);
|
|
216
289
|
if (!changetype<usize>(out)) {
|
|
217
290
|
out = changetype<T>(instantiate<T>());
|