json-as 0.9.29 → 1.0.0-alpha.2
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/.github/workflows/nodejs.yml +0 -3
- package/.gitmodules +0 -0
- package/.prettierrc.json +3 -2
- package/CHANGELOG +24 -0
- package/LICENSE +1 -1
- package/README.md +23 -7
- package/as-test.config.json +1 -1
- package/asconfig.json +2 -2
- package/assembly/__benches__/misc.bench.ts +0 -34
- package/assembly/__tests__/bool.spec.ts +1 -1
- package/assembly/__tests__/simd/string.spec.ts +32 -0
- package/assembly/custom/memory.ts +25 -0
- package/assembly/custom/util.ts +14 -92
- package/assembly/deserialize/simd/string.ts +103 -0
- package/assembly/deserialize/simple/arbitrary.ts +17 -0
- package/assembly/deserialize/simple/array/arbitrary.ts +113 -0
- package/assembly/deserialize/simple/array/array.ts +18 -0
- package/assembly/deserialize/simple/array/bool.ts +17 -0
- package/assembly/deserialize/simple/array/float.ts +28 -0
- package/assembly/deserialize/simple/array/integer.ts +27 -0
- package/assembly/deserialize/simple/array/map.ts +18 -0
- package/assembly/deserialize/simple/array/object.ts +18 -0
- package/assembly/deserialize/simple/array/string.ts +22 -0
- package/assembly/deserialize/simple/array.ts +48 -0
- package/assembly/deserialize/simple/bool.ts +9 -0
- package/assembly/deserialize/simple/date.ts +11 -0
- package/assembly/deserialize/simple/float.ts +10 -0
- package/assembly/deserialize/simple/integer.ts +5 -0
- package/assembly/deserialize/simple/map.ts +154 -0
- package/assembly/deserialize/simple/object.ts +158 -0
- package/assembly/deserialize/simple/string.ts +48 -0
- package/assembly/globals/tables.ts +417 -0
- package/assembly/index.d.ts +9 -13
- package/assembly/index.ts +261 -146
- package/assembly/serialize/simd/string.ts +176 -0
- package/assembly/serialize/simple/arbitrary.ts +36 -0
- package/assembly/serialize/simple/array.ts +32 -0
- package/assembly/serialize/simple/bool.ts +19 -0
- package/assembly/serialize/simple/date.ts +13 -0
- package/assembly/serialize/simple/float.ts +7 -0
- package/assembly/serialize/simple/integer.ts +7 -0
- package/assembly/serialize/simple/map.ts +43 -0
- package/assembly/serialize/simple/object.ts +7 -0
- package/assembly/serialize/simple/string.ts +48 -0
- package/assembly/test.ts +36 -27
- package/assembly/tsconfig.json +2 -91
- package/assembly/types.ts +0 -0
- package/assembly/util/atoi.ts +35 -0
- package/assembly/util/bytes.ts +12 -0
- package/assembly/util/concat.ts +9 -0
- package/assembly/util/getArrayDepth.ts +17 -0
- package/assembly/util/index.ts +5 -0
- package/assembly/util/isSpace.ts +4 -0
- package/assembly/util/nextPowerOf2.ts +4 -0
- package/assembly/util/ptrToStr.ts +7 -0
- package/assembly/util/snp.ts +69 -0
- package/bench.js +5 -5
- package/modules/as-bs/LICENSE +21 -0
- package/modules/as-bs/README.md +95 -0
- package/modules/as-bs/assembly/index.ts +166 -0
- package/modules/as-bs/assembly/tsconfig.json +97 -0
- package/modules/as-bs/index.ts +1 -0
- package/modules/as-bs/package.json +32 -0
- package/package.json +41 -48
- package/transform/lib/builder.js +1275 -0
- package/transform/lib/builder.js.map +1 -0
- package/transform/lib/index.js +548 -443
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linker.js +16 -0
- package/transform/lib/linker.js.map +1 -0
- package/transform/lib/types.js +26 -0
- package/transform/lib/types.js.map +1 -0
- package/transform/lib/util.js +47 -0
- package/transform/lib/util.js.map +1 -0
- package/transform/lib/visitor.js +510 -430
- package/transform/lib/visitor.js.map +1 -0
- package/transform/package.json +1 -33
- package/transform/src/builder.ts +1371 -0
- package/transform/src/index.ts +574 -340
- package/transform/src/linker.ts +21 -0
- package/transform/src/types.ts +28 -0
- package/transform/src/util.ts +56 -0
- package/transform/src/visitor.ts +531 -0
- package/transform/tsconfig.json +3 -1
- package/assembly/__benches__/as-tral.d.ts +0 -1
- package/assembly/__tests__/date.spec.ts +0 -12
- package/assembly/custom/bs.ts +0 -202
- package/assembly/deserialize/array/array.ts +0 -31
- package/assembly/deserialize/array/bool.ts +0 -19
- package/assembly/deserialize/array/float.ts +0 -24
- package/assembly/deserialize/array/integer.ts +0 -24
- package/assembly/deserialize/array/map.ts +0 -27
- package/assembly/deserialize/array/object.ts +0 -27
- package/assembly/deserialize/array/string.ts +0 -29
- package/assembly/deserialize/array.ts +0 -46
- package/assembly/deserialize/bool.ts +0 -34
- package/assembly/deserialize/date.ts +0 -19
- package/assembly/deserialize/float.ts +0 -21
- package/assembly/deserialize/integer.ts +0 -16
- package/assembly/deserialize/map.ts +0 -139
- package/assembly/deserialize/object.ts +0 -211
- package/assembly/deserialize/string.ts +0 -149
- package/assembly/serialize/array.ts +0 -44
- package/assembly/serialize/bool.ts +0 -10
- package/assembly/serialize/date.ts +0 -4
- package/assembly/serialize/float.ts +0 -4
- package/assembly/serialize/integer.ts +0 -5
- package/assembly/serialize/map.ts +0 -24
- package/assembly/serialize/object.ts +0 -13
- package/assembly/serialize/string.ts +0 -284
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CHAR_E, CHAR_F, CHAR_T } from "../../../custom/chars";
|
|
2
|
+
|
|
3
|
+
export function deserializeBooleanArray<T extends boolean[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
4
|
+
const out = dst ? changetype<T>(dst) : instantiate<T>();
|
|
5
|
+
while (srcStart < srcEnd) {
|
|
6
|
+
const code = load<u16>(srcStart);
|
|
7
|
+
if (code == CHAR_T && load<u16>(srcStart, 8) == CHAR_E) {
|
|
8
|
+
out.push(true);
|
|
9
|
+
srcStart += 10;
|
|
10
|
+
} else if (code == CHAR_F && load<u16>(srcStart, 10) == CHAR_E) {
|
|
11
|
+
out.push(false);
|
|
12
|
+
srcStart += 12;
|
|
13
|
+
}
|
|
14
|
+
srcStart += 2;
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isSpace } from "../../../util";
|
|
2
|
+
import { COMMA, BRACE_RIGHT, BRACKET_RIGHT } from "../../../custom/chars";
|
|
3
|
+
import { JSON } from "../../..";
|
|
4
|
+
|
|
5
|
+
export function deserializeFloatArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
6
|
+
const out = dst ? changetype<T>(dst) : instantiate<T>();
|
|
7
|
+
let lastIndex: usize = 0;
|
|
8
|
+
while (srcStart < srcEnd) {
|
|
9
|
+
const code = load<u16>(srcStart);
|
|
10
|
+
if (code - 48 <= 9 || code == 45) {
|
|
11
|
+
lastIndex = srcStart;
|
|
12
|
+
srcStart += 2;
|
|
13
|
+
while (srcStart < srcEnd) {
|
|
14
|
+
const code = load<u16>(srcStart);
|
|
15
|
+
if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) {
|
|
16
|
+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
17
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
18
|
+
// /* empty */
|
|
19
|
+
// }
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
srcStart += 2;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
srcStart += 2;
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { atoi, isSpace } from "../../../util";
|
|
2
|
+
import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
|
|
3
|
+
|
|
4
|
+
export function deserializeIntegerArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
5
|
+
const out: T = dst ? changetype<T>(dst) : instantiate<T>();
|
|
6
|
+
let lastIndex: usize = 0;
|
|
7
|
+
while (srcStart < srcEnd) {
|
|
8
|
+
const code = load<u16>(srcStart);
|
|
9
|
+
if (code - 48 <= 9 || code == 45) {
|
|
10
|
+
lastIndex = srcStart;
|
|
11
|
+
srcStart += 2;
|
|
12
|
+
while (srcStart < srcEnd) {
|
|
13
|
+
const code = load<u16>(srcStart);
|
|
14
|
+
if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) {
|
|
15
|
+
out.push(atoi<valueof<T>>(lastIndex, srcStart));
|
|
16
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
17
|
+
// /* empty */
|
|
18
|
+
// }
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
srcStart += 2;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
srcStart += 2;
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
|
|
2
|
+
import { JSON } from "../../..";
|
|
3
|
+
|
|
4
|
+
export function deserializeMapArray<T extends Map<any, any>[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
5
|
+
const out = dst ? changetype<T>(dst) : instantiate<T>();
|
|
6
|
+
let lastIndex: usize = 0;
|
|
7
|
+
let depth: u32 = 0;
|
|
8
|
+
while (srcStart < srcEnd) {
|
|
9
|
+
const code = load<u16>(srcStart);
|
|
10
|
+
if (code == BRACE_LEFT && depth++ == 0) {
|
|
11
|
+
lastIndex = srcStart;
|
|
12
|
+
} else if (code == BRACE_RIGHT && --depth == 0) {
|
|
13
|
+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
14
|
+
}
|
|
15
|
+
srcStart += 2;
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
|
|
2
|
+
import { JSON } from "../../..";
|
|
3
|
+
|
|
4
|
+
export function deserializeObjectArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
5
|
+
const out = dst ? changetype<T>(dst) : instantiate<T>();
|
|
6
|
+
let lastIndex: usize = 0;
|
|
7
|
+
let depth: u32 = 0;
|
|
8
|
+
while (srcStart < srcEnd) {
|
|
9
|
+
const code = load<u16>(srcStart);
|
|
10
|
+
if (code == BRACE_LEFT && depth++ == 0) {
|
|
11
|
+
lastIndex = srcStart;
|
|
12
|
+
} else if (code == BRACE_RIGHT && --depth == 0) {
|
|
13
|
+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
14
|
+
}
|
|
15
|
+
srcStart += 2;
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { JSON } from "../../..";
|
|
2
|
+
import { BACK_SLASH, QUOTE } from "../../../custom/chars";
|
|
3
|
+
|
|
4
|
+
export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usize): string[] {
|
|
5
|
+
const out = dst ? changetype<string[]>(dst) : new Array<string>();
|
|
6
|
+
let lastPos = 2;
|
|
7
|
+
let inString = false;
|
|
8
|
+
while (srcStart < srcEnd) {
|
|
9
|
+
const code = load<u16>(srcStart);
|
|
10
|
+
if (code == QUOTE) {
|
|
11
|
+
if (!inString) {
|
|
12
|
+
inString = true;
|
|
13
|
+
lastPos = srcStart;
|
|
14
|
+
} else if (load<u16>(srcStart - 2) != BACK_SLASH) {
|
|
15
|
+
out.push(JSON.__deserialize<string>(lastPos, srcStart));
|
|
16
|
+
inString = false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
srcStart += 2;
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { JSON } from "../..";
|
|
2
|
+
import { deserializeArbitraryArray } from "./array/arbitrary";
|
|
3
|
+
import { deserializeArrayArray } from "./array/array";
|
|
4
|
+
import { deserializeBooleanArray } from "./array/bool";
|
|
5
|
+
import { deserializeFloatArray } from "./array/float";
|
|
6
|
+
import { deserializeIntegerArray } from "./array/integer";
|
|
7
|
+
import { deserializeMapArray } from "./array/map";
|
|
8
|
+
import { deserializeObjectArray } from "./array/object";
|
|
9
|
+
import { deserializeStringArray } from "./array/string";
|
|
10
|
+
|
|
11
|
+
// @ts-ignore: Decorator valid here
|
|
12
|
+
export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
13
|
+
if (isString<valueof<T>>()) {
|
|
14
|
+
return <T>deserializeStringArray(srcStart, srcEnd, dst);
|
|
15
|
+
} else if (isBoolean<valueof<T>>()) {
|
|
16
|
+
// @ts-ignore
|
|
17
|
+
return deserializeBooleanArray<T>(srcStart, srcEnd, dst);
|
|
18
|
+
} else if (isInteger<valueof<T>>()) {
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
return deserializeIntegerArray<T>(srcStart, srcEnd, dst);
|
|
21
|
+
} else if (isFloat<valueof<T>>()) {
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
return deserializeFloatArray<T>(srcStart, srcEnd, dst);
|
|
24
|
+
} else if (isArrayLike<valueof<T>>()) {
|
|
25
|
+
// @ts-ignore: type
|
|
26
|
+
return deserializeArrayArray<T>(srcStart, srcEnd, dst);
|
|
27
|
+
} else if (isManaged<valueof<T>>() || isReference<valueof<T>>()) {
|
|
28
|
+
const type = changetype<nonnull<valueof<T>>>(0);
|
|
29
|
+
if (type instanceof JSON.Value) {
|
|
30
|
+
// @ts-ignore: type
|
|
31
|
+
return deserializeArbitraryArray<T>(srcStart, srcEnd, dst);
|
|
32
|
+
} else if (type instanceof Map) {
|
|
33
|
+
// @ts-ignore: type
|
|
34
|
+
return deserializeMapArray<T>(srcStart, srcEnd, dst);
|
|
35
|
+
// @ts-ignore: defined by transform
|
|
36
|
+
} else if (isDefined(type.__DESERIALIZE)) {
|
|
37
|
+
return deserializeObjectArray<T>(srcStart, srcEnd, dst);
|
|
38
|
+
}
|
|
39
|
+
throw new Error("Could not parse array of type " + nameof<T>() + "!");
|
|
40
|
+
} else {
|
|
41
|
+
throw new Error("Could not parse array of type " + nameof<T>() + "!");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isMap<T>(): boolean {
|
|
46
|
+
let type: T = changetype<T>(0);
|
|
47
|
+
return type instanceof Map;
|
|
48
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CHAR_F, CHAR_T } from "../../custom/chars";
|
|
2
|
+
|
|
3
|
+
export function deserializeBoolean(srcStart: usize, srcEnd: usize): boolean {
|
|
4
|
+
const srcSize = srcEnd - srcStart;
|
|
5
|
+
const firstChar = load<u16>(srcStart);
|
|
6
|
+
if (firstChar == CHAR_T && load<u64>(srcStart) == 28429475166421108) return true;
|
|
7
|
+
else if (firstChar == CHAR_F && load<u64>(srcSize, 2) == 28429466576093281) return false;
|
|
8
|
+
return false; //ERROR(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ptrToStr } from "../../util/ptrToStr";
|
|
2
|
+
|
|
3
|
+
export function deserializeDate(srcStart: usize, srcEnd: usize): Date {
|
|
4
|
+
// Use AssemblyScript's date parser
|
|
5
|
+
const d = Date.fromString(ptrToStr(srcStart, srcEnd));
|
|
6
|
+
|
|
7
|
+
// Return a new object instead of the one that the parser returned.
|
|
8
|
+
// This may seem redundant, but addreses the issue when Date
|
|
9
|
+
// is globally aliased to wasi_Date (or some other superclass).
|
|
10
|
+
return new Date(d.getTime());
|
|
11
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ptrToStr } from "../../util/ptrToStr";
|
|
2
|
+
|
|
3
|
+
export function deserializeFloat<T>(srcStart: usize, srcEnd: usize): T {
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
const type: T = 0;
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd));
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
return f32.parse(ptrToStr(srcStart, srcEnd));
|
|
10
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { JSON } from "../..";
|
|
2
|
+
import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
|
|
3
|
+
import { isSpace } from "../../util";
|
|
4
|
+
|
|
5
|
+
export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
6
|
+
const out = changetype<T>(dst || __new(offsetof<T>(), idof<T>()));
|
|
7
|
+
// @ts-ignore: type
|
|
8
|
+
if (!isString<indexof<T>>() && !isInteger<indexof<T>>() && !isFloat<indexof<T>>()) ERROR("Map key must also be a valid JSON key!");
|
|
9
|
+
|
|
10
|
+
const srcPtr = srcStart;
|
|
11
|
+
let key: string | null = null;
|
|
12
|
+
let isKey = false;
|
|
13
|
+
let depth = 0;
|
|
14
|
+
let lastIndex = 0;
|
|
15
|
+
|
|
16
|
+
// while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
17
|
+
// while (srcEnd > srcStart && isSpace(load<u16>(srcEnd))) srcEnd -= 2;
|
|
18
|
+
|
|
19
|
+
while (srcStart < srcEnd) {
|
|
20
|
+
let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
|
|
21
|
+
if (key == null) {
|
|
22
|
+
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
23
|
+
if (isKey) {
|
|
24
|
+
key = sliceTo(lastIndex, srcStart);
|
|
25
|
+
while (isSpace((code = load<u16>((srcStart += 2))))) {
|
|
26
|
+
/* empty */
|
|
27
|
+
}
|
|
28
|
+
if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcStart - srcPtr).toString());
|
|
29
|
+
isKey = false;
|
|
30
|
+
} else {
|
|
31
|
+
isKey = true;
|
|
32
|
+
lastIndex = srcStart + 2;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// isKey = !isKey;
|
|
36
|
+
srcStart += 2;
|
|
37
|
+
} else {
|
|
38
|
+
// @ts-ignore: type
|
|
39
|
+
if (isString<valueof<T>>() && code == QUOTE) {
|
|
40
|
+
lastIndex = srcStart;
|
|
41
|
+
srcStart += 2;
|
|
42
|
+
while (srcStart < srcEnd) {
|
|
43
|
+
const code = load<u16>(srcStart);
|
|
44
|
+
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
45
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
46
|
+
/* empty */
|
|
47
|
+
}
|
|
48
|
+
// @ts-ignore: type
|
|
49
|
+
out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
50
|
+
key = null;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
srcStart += 2;
|
|
54
|
+
}
|
|
55
|
+
// @ts-ignore: type
|
|
56
|
+
} else if ((!isBoolean<valueof<T>>() && isInteger<valueof<T>>() && code - 48 <= 9) || code == 45) {
|
|
57
|
+
lastIndex = srcStart;
|
|
58
|
+
srcStart += 2;
|
|
59
|
+
while (srcStart < srcEnd) {
|
|
60
|
+
const code = load<u16>(srcStart);
|
|
61
|
+
if (code == COMMA || isSpace(code) || code == BRACE_RIGHT) {
|
|
62
|
+
// @ts-ignore: type
|
|
63
|
+
out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
64
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
65
|
+
/* empty */
|
|
66
|
+
}
|
|
67
|
+
key = null;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
srcStart += 2;
|
|
71
|
+
}
|
|
72
|
+
// @ts-ignore: type
|
|
73
|
+
} else if (isArray<valueof<T>>() && code == BRACKET_LEFT) {
|
|
74
|
+
lastIndex = srcStart;
|
|
75
|
+
depth++;
|
|
76
|
+
srcStart += 2;
|
|
77
|
+
while (srcStart < srcEnd) {
|
|
78
|
+
const code = load<u16>(srcStart);
|
|
79
|
+
if (((code ^ BRACE_RIGHT) | (code ^ BRACKET_RIGHT)) == 32) {
|
|
80
|
+
if (--depth == 0) {
|
|
81
|
+
// @ts-ignore: type
|
|
82
|
+
out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
83
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
84
|
+
/* empty */
|
|
85
|
+
}
|
|
86
|
+
key = null;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
} else if (code == BRACKET_LEFT) depth++;
|
|
90
|
+
srcStart += 2;
|
|
91
|
+
}
|
|
92
|
+
// @ts-ignore: type
|
|
93
|
+
} else if (isDefined(changetype<nonnull<valueof<T>>>(0).__DESERIALIZE) && code == BRACE_LEFT) {
|
|
94
|
+
lastIndex = srcStart;
|
|
95
|
+
depth++;
|
|
96
|
+
srcStart += 2;
|
|
97
|
+
while (srcStart < srcEnd) {
|
|
98
|
+
const code = load<u16>(srcStart);
|
|
99
|
+
if (code == BRACE_RIGHT) {
|
|
100
|
+
if (--depth == 0) {
|
|
101
|
+
// @ts-ignore: type
|
|
102
|
+
out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
103
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
104
|
+
/* empty */
|
|
105
|
+
}
|
|
106
|
+
key = null;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
} else if (code == BRACE_LEFT) depth++;
|
|
110
|
+
srcStart += 2;
|
|
111
|
+
}
|
|
112
|
+
// @ts-ignore: type
|
|
113
|
+
} else if (isBoolean<valueof<T>>() && code == CHAR_T) {
|
|
114
|
+
if (load<u64>(srcStart) == 28429475166421108) {
|
|
115
|
+
// @ts-ignore: type
|
|
116
|
+
out.set(key, JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)));
|
|
117
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
118
|
+
/* empty */
|
|
119
|
+
}
|
|
120
|
+
key = null;
|
|
121
|
+
}
|
|
122
|
+
// @ts-ignore: type
|
|
123
|
+
} else if (isBoolean<valueof<T>>() && code == CHAR_F) {
|
|
124
|
+
if (load<u64>(srcStart, 2) == 28429466576093281) {
|
|
125
|
+
// @ts-ignore: type
|
|
126
|
+
out.set(key, JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 10)));
|
|
127
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
128
|
+
/* empty */
|
|
129
|
+
}
|
|
130
|
+
key = null;
|
|
131
|
+
}
|
|
132
|
+
} else if ((isNullable<T>() || nameof<T>() == "usize") && code == CHAR_N) {
|
|
133
|
+
if (load<u64>(srcStart) == 30399761348886638) {
|
|
134
|
+
// @ts-ignore: type
|
|
135
|
+
out.set(key, JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)));
|
|
136
|
+
while (isSpace(load<u16>((srcStart += 2)))) {
|
|
137
|
+
/* empty */
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
// @ts-ignore: type
|
|
142
|
+
throw new Error("Unexpected character " + String.fromCharCode(code) + " or type " + nameof<valueof<T>>() + " does not match found type!");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function sliceTo(srcStart: usize, srcEnd: usize): string {
|
|
150
|
+
const dstSize = srcEnd - srcStart;
|
|
151
|
+
const dst = __new(dstSize, idof<string>());
|
|
152
|
+
memory.copy(dst, srcStart, dstSize);
|
|
153
|
+
return changetype<string>(dst);
|
|
154
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T } from "../../custom/chars";
|
|
2
|
+
import { isSpace } from "../../util";
|
|
3
|
+
|
|
4
|
+
export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
5
|
+
const out = changetype<nonnull<T>>(dst || __new(offsetof<T>(), idof<T>()));
|
|
6
|
+
|
|
7
|
+
let keyStart: usize = 0;
|
|
8
|
+
let keyEnd: usize = 0;
|
|
9
|
+
let isKey = false;
|
|
10
|
+
let depth = 0;
|
|
11
|
+
let lastIndex: usize = 0;
|
|
12
|
+
|
|
13
|
+
// while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
14
|
+
// while (srcEnd > srcStart && isSpace(load<u16>(srcEnd))) srcEnd -= 2;
|
|
15
|
+
srcStart += 2;
|
|
16
|
+
while (srcStart < srcEnd) {
|
|
17
|
+
let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
|
|
18
|
+
if (keyStart == 0) {
|
|
19
|
+
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
20
|
+
if (isKey) {
|
|
21
|
+
keyStart = lastIndex;
|
|
22
|
+
keyEnd = srcStart;
|
|
23
|
+
// console.log("Key: " + ptrToStr(lastIndex, srcStart));
|
|
24
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
|
|
25
|
+
srcStart += 2;
|
|
26
|
+
// while (isSpace((code = load<u16>((srcStart += 2))))) {
|
|
27
|
+
// /* empty */
|
|
28
|
+
// }
|
|
29
|
+
// if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcStart - srcPtr).toString());
|
|
30
|
+
isKey = false;
|
|
31
|
+
} else {
|
|
32
|
+
// console.log("Got key start");
|
|
33
|
+
isKey = true; // i don't like this
|
|
34
|
+
lastIndex = srcStart + 2;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// isKey = !isKey;
|
|
38
|
+
srcStart += 2;
|
|
39
|
+
} else {
|
|
40
|
+
if (code == QUOTE) {
|
|
41
|
+
lastIndex = srcStart;
|
|
42
|
+
srcStart += 2;
|
|
43
|
+
while (srcStart < srcEnd) {
|
|
44
|
+
const code = load<u16>(srcStart);
|
|
45
|
+
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
46
|
+
// console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
|
|
47
|
+
// @ts-ignore: exists
|
|
48
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart + 2, dst);
|
|
49
|
+
// while (isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
50
|
+
srcStart += 4;
|
|
51
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
52
|
+
keyStart = 0;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
srcStart += 2;
|
|
56
|
+
}
|
|
57
|
+
} else if (code - 48 <= 9 || code == 45) {
|
|
58
|
+
lastIndex = srcStart;
|
|
59
|
+
srcStart += 2;
|
|
60
|
+
while (srcStart < srcEnd) {
|
|
61
|
+
const code = load<u16>(srcStart);
|
|
62
|
+
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
|
|
63
|
+
// @ts-ignore: exists
|
|
64
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst);
|
|
65
|
+
// console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
|
|
66
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
67
|
+
// /* empty */
|
|
68
|
+
// }
|
|
69
|
+
srcStart += 2;
|
|
70
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
71
|
+
keyStart = 0;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
srcStart += 2;
|
|
75
|
+
}
|
|
76
|
+
} else if (code == BRACE_LEFT) {
|
|
77
|
+
lastIndex = srcStart;
|
|
78
|
+
depth++;
|
|
79
|
+
srcStart += 2;
|
|
80
|
+
while (srcStart < srcEnd) {
|
|
81
|
+
const code = load<u16>(srcStart);
|
|
82
|
+
if (code == BRACE_RIGHT) {
|
|
83
|
+
if (--depth == 0) {
|
|
84
|
+
// console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
|
|
85
|
+
// @ts-ignore: exists
|
|
86
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst);
|
|
87
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
88
|
+
keyStart = 0;
|
|
89
|
+
// while (isSpace(load<u16>(srcStart))) {
|
|
90
|
+
// /* empty */
|
|
91
|
+
// }
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
} else if (code == BRACE_LEFT) depth++;
|
|
95
|
+
srcStart += 2;
|
|
96
|
+
}
|
|
97
|
+
} else if (code == BRACKET_LEFT) {
|
|
98
|
+
lastIndex = srcStart;
|
|
99
|
+
depth++;
|
|
100
|
+
srcStart += 2;
|
|
101
|
+
while (srcStart < srcEnd) {
|
|
102
|
+
const code = load<u16>(srcStart);
|
|
103
|
+
if (code == BRACKET_RIGHT) {
|
|
104
|
+
if (--depth == 0) {
|
|
105
|
+
// console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
|
|
106
|
+
// @ts-ignore: exists
|
|
107
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst);
|
|
108
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
109
|
+
keyStart = 0;
|
|
110
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
111
|
+
// /* empty */
|
|
112
|
+
// }
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
} else if (code == BRACKET_LEFT) depth++;
|
|
116
|
+
srcStart += 2;
|
|
117
|
+
}
|
|
118
|
+
} else if (code == CHAR_T) {
|
|
119
|
+
if (load<u64>(srcStart) == 28429475166421108) {
|
|
120
|
+
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8));
|
|
121
|
+
// @ts-ignore: exists
|
|
122
|
+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
|
|
123
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
124
|
+
// /* empty */
|
|
125
|
+
// }
|
|
126
|
+
srcStart += 2;
|
|
127
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)) + " " + (srcStart < srcEnd).toString());
|
|
128
|
+
keyStart = 0;
|
|
129
|
+
}
|
|
130
|
+
} else if (code == CHAR_F) {
|
|
131
|
+
if (load<u64>(srcStart, 2) == 28429466576093281) {
|
|
132
|
+
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10));
|
|
133
|
+
// @ts-ignore: exists
|
|
134
|
+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10), dst);
|
|
135
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
136
|
+
// /* empty */
|
|
137
|
+
// }
|
|
138
|
+
srcStart += 2;
|
|
139
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
140
|
+
keyStart = 0;
|
|
141
|
+
}
|
|
142
|
+
} else if (code == CHAR_N) {
|
|
143
|
+
if (load<u64>(srcStart) == 30399761348886638) {
|
|
144
|
+
// console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8));
|
|
145
|
+
// @ts-ignore: exists
|
|
146
|
+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
|
|
147
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
148
|
+
/* empty */
|
|
149
|
+
// }
|
|
150
|
+
srcStart += 2;
|
|
151
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
152
|
+
keyStart = 0;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { BACK_SLASH } from "../../custom/chars";
|
|
2
|
+
import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables";
|
|
3
|
+
|
|
4
|
+
export function deserializeString(srcStart: usize, srcEnd: usize, dst: usize): string {
|
|
5
|
+
srcStart += 2;
|
|
6
|
+
srcEnd -= 2;
|
|
7
|
+
if (dst == 0) dst = __new(srcEnd - srcStart, idof<string>());
|
|
8
|
+
let dstPtr = dst;
|
|
9
|
+
let lastPtr = srcStart;
|
|
10
|
+
while (srcStart < srcEnd) {
|
|
11
|
+
let code = load<u16>(srcStart);
|
|
12
|
+
if (code == BACK_SLASH) {
|
|
13
|
+
code = load<u16>(DESERIALIZE_ESCAPE_TABLE + load<u8>(srcStart, 2));
|
|
14
|
+
if (code == 117 && load<u32>(srcStart, 4) == 3145776) {
|
|
15
|
+
const block = load<u32>(srcStart, 8);
|
|
16
|
+
const codeA = block & 0xffff;
|
|
17
|
+
const codeB = (block >> 16) & 0xffff;
|
|
18
|
+
const escapedA = load<u8>(ESCAPE_HEX_TABLE + codeA);
|
|
19
|
+
const escapedB = load<u8>(ESCAPE_HEX_TABLE + codeB);
|
|
20
|
+
const escaped = (escapedA << 4) + escapedB;
|
|
21
|
+
const remBytes = srcStart - lastPtr;
|
|
22
|
+
memory.copy(dstPtr, lastPtr, remBytes);
|
|
23
|
+
dstPtr += remBytes;
|
|
24
|
+
store<u16>(dst, escaped);
|
|
25
|
+
dstPtr += 2;
|
|
26
|
+
srcStart += 12;
|
|
27
|
+
lastPtr = srcStart;
|
|
28
|
+
} else {
|
|
29
|
+
const remBytes = srcStart - lastPtr;
|
|
30
|
+
memory.copy(dstPtr, lastPtr, remBytes);
|
|
31
|
+
dstPtr += remBytes;
|
|
32
|
+
store<u16>(dstPtr, code);
|
|
33
|
+
dstPtr += 2;
|
|
34
|
+
srcStart += 4;
|
|
35
|
+
lastPtr = srcStart;
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
srcStart += 2;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const remBytes = srcEnd - lastPtr;
|
|
43
|
+
memory.copy(dstPtr, lastPtr, remBytes);
|
|
44
|
+
dstPtr += remBytes;
|
|
45
|
+
|
|
46
|
+
if (lastPtr != srcStart) dst = __renew(dst, dstPtr - dst);
|
|
47
|
+
return changetype<string>(dst);
|
|
48
|
+
}
|