json-as 0.9.29 → 1.0.0-alpha.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/.github/workflows/nodejs.yml +0 -3
- package/.prettierrc.json +3 -2
- package/CHANGELOG +13 -0
- package/LICENSE +1 -1
- package/README.md +22 -7
- package/as-test.config.json +1 -1
- package/asconfig.json +2 -2
- package/assembly/__benches__/misc.bench.ts +17 -32
- 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 +159 -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 +266 -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 +41 -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/bs/index.ts +167 -0
- package/modules/tsconfig.json +8 -0
- package/package.json +42 -48
- package/transform/lib/builder.js +1353 -0
- package/transform/lib/builder.js.map +1 -0
- package/transform/lib/index.js +497 -332
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/index.old.js +404 -0
- package/transform/lib/index.old.js.map +1 -0
- package/transform/lib/linker.js +18 -0
- package/transform/lib/linker.js.map +1 -0
- package/transform/lib/types.js +25 -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 +529 -446
- package/transform/lib/visitor.js.map +1 -0
- package/transform/package.json +1 -34
- package/transform/src/builder.ts +1371 -0
- package/transform/src/index.ts +564 -341
- package/transform/src/linker.ts +21 -0
- package/transform/src/types.ts +27 -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,18 @@
|
|
|
1
|
+
import { BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars";
|
|
2
|
+
import { JSON } from "../../../";
|
|
3
|
+
|
|
4
|
+
export function deserializeArrayArray<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 == BRACKET_LEFT && depth++ == 0) {
|
|
11
|
+
lastIndex = srcStart;
|
|
12
|
+
} else if (code == BRACKET_RIGHT && --depth == 0) {
|
|
13
|
+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
|
|
14
|
+
}
|
|
15
|
+
srcStart += 2;
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
@@ -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,159 @@
|
|
|
1
|
+
import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
|
|
2
|
+
import { isSpace } from "../../util";
|
|
3
|
+
import { ptrToStr } from "../../util/ptrToStr";
|
|
4
|
+
|
|
5
|
+
export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize): T {
|
|
6
|
+
const out = changetype<nonnull<T>>(dst || __new(offsetof<T>(), idof<T>()));
|
|
7
|
+
|
|
8
|
+
let keyStart: usize = 0;
|
|
9
|
+
let keyEnd: usize = 0;
|
|
10
|
+
let isKey = false;
|
|
11
|
+
let depth = 0;
|
|
12
|
+
let lastIndex = 0;
|
|
13
|
+
|
|
14
|
+
// while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
15
|
+
// while (srcEnd > srcStart && isSpace(load<u16>(srcEnd))) srcEnd -= 2;
|
|
16
|
+
srcStart += 2;
|
|
17
|
+
while (srcStart < srcEnd) {
|
|
18
|
+
let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
|
|
19
|
+
if (keyStart == 0) {
|
|
20
|
+
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
21
|
+
if (isKey) {
|
|
22
|
+
keyStart = lastIndex;
|
|
23
|
+
keyEnd = srcStart;
|
|
24
|
+
// console.log("Key: " + ptrToStr(lastIndex, srcStart));
|
|
25
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
|
|
26
|
+
srcStart += 2;
|
|
27
|
+
// while (isSpace((code = load<u16>((srcStart += 2))))) {
|
|
28
|
+
// /* empty */
|
|
29
|
+
// }
|
|
30
|
+
// if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcStart - srcPtr).toString());
|
|
31
|
+
isKey = false;
|
|
32
|
+
} else {
|
|
33
|
+
// console.log("Got key start");
|
|
34
|
+
isKey = true; // i don't like this
|
|
35
|
+
lastIndex = srcStart + 2;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// isKey = !isKey;
|
|
39
|
+
srcStart += 2;
|
|
40
|
+
} else {
|
|
41
|
+
if (code == QUOTE) {
|
|
42
|
+
lastIndex = srcStart;
|
|
43
|
+
srcStart += 2;
|
|
44
|
+
while (srcStart < srcEnd) {
|
|
45
|
+
const code = load<u16>(srcStart);
|
|
46
|
+
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
47
|
+
// console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
|
|
48
|
+
// @ts-ignore: exists
|
|
49
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart + 2, dst);
|
|
50
|
+
// while (isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
51
|
+
srcStart += 4;
|
|
52
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
53
|
+
keyStart = 0;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
srcStart += 2;
|
|
57
|
+
}
|
|
58
|
+
} else if (code - 48 <= 9 || code == 45) {
|
|
59
|
+
lastIndex = srcStart;
|
|
60
|
+
srcStart += 2;
|
|
61
|
+
while (srcStart < srcEnd) {
|
|
62
|
+
const code = load<u16>(srcStart);
|
|
63
|
+
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
|
|
64
|
+
// @ts-ignore: exists
|
|
65
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst);
|
|
66
|
+
// console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
|
|
67
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
68
|
+
// /* empty */
|
|
69
|
+
// }
|
|
70
|
+
srcStart += 2;
|
|
71
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
72
|
+
keyStart = 0;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
srcStart += 2;
|
|
76
|
+
}
|
|
77
|
+
} else if (code == BRACE_LEFT) {
|
|
78
|
+
lastIndex = srcStart;
|
|
79
|
+
depth++;
|
|
80
|
+
srcStart += 2;
|
|
81
|
+
while (srcStart < srcEnd) {
|
|
82
|
+
const code = load<u16>(srcStart);
|
|
83
|
+
if (code == BRACE_RIGHT) {
|
|
84
|
+
if (--depth == 0) {
|
|
85
|
+
// console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
|
|
86
|
+
// @ts-ignore: exists
|
|
87
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst);
|
|
88
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
89
|
+
keyStart = 0;
|
|
90
|
+
// while (isSpace(load<u16>(srcStart))) {
|
|
91
|
+
// /* empty */
|
|
92
|
+
// }
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
} else if (code == BRACE_LEFT) depth++;
|
|
96
|
+
srcStart += 2;
|
|
97
|
+
}
|
|
98
|
+
} else if (code == BRACKET_LEFT) {
|
|
99
|
+
lastIndex = srcStart;
|
|
100
|
+
depth++;
|
|
101
|
+
srcStart += 2;
|
|
102
|
+
while (srcStart < srcEnd) {
|
|
103
|
+
const code = load<u16>(srcStart);
|
|
104
|
+
if (code == BRACKET_RIGHT) {
|
|
105
|
+
if (--depth == 0) {
|
|
106
|
+
// console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
|
|
107
|
+
// @ts-ignore: exists
|
|
108
|
+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst);
|
|
109
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
110
|
+
keyStart = 0;
|
|
111
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
112
|
+
// /* empty */
|
|
113
|
+
// }
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
} else if (code == BRACKET_LEFT) depth++;
|
|
117
|
+
srcStart += 2;
|
|
118
|
+
}
|
|
119
|
+
} else if (code == CHAR_T) {
|
|
120
|
+
if (load<u64>(srcStart) == 28429475166421108) {
|
|
121
|
+
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8));
|
|
122
|
+
// @ts-ignore: exists
|
|
123
|
+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
|
|
124
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
125
|
+
// /* empty */
|
|
126
|
+
// }
|
|
127
|
+
srcStart += 2;
|
|
128
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)) + " " + (srcStart < srcEnd).toString());
|
|
129
|
+
keyStart = 0;
|
|
130
|
+
}
|
|
131
|
+
} else if (code == CHAR_F) {
|
|
132
|
+
if (load<u64>(srcStart, 2) == 28429466576093281) {
|
|
133
|
+
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10));
|
|
134
|
+
// @ts-ignore: exists
|
|
135
|
+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10), dst);
|
|
136
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
137
|
+
// /* empty */
|
|
138
|
+
// }
|
|
139
|
+
srcStart += 2;
|
|
140
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
141
|
+
keyStart = 0;
|
|
142
|
+
}
|
|
143
|
+
} else if (code == CHAR_N) {
|
|
144
|
+
if (load<u64>(srcStart) == 30399761348886638) {
|
|
145
|
+
// console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8));
|
|
146
|
+
// @ts-ignore: exists
|
|
147
|
+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
|
|
148
|
+
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
149
|
+
/* empty */
|
|
150
|
+
// }
|
|
151
|
+
srcStart += 2;
|
|
152
|
+
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
153
|
+
keyStart = 0;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
@@ -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
|
+
}
|