json-as 1.3.1 → 1.3.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/CHANGELOG.md +9 -26
- package/README.md +41 -18
- package/assembly/deserialize/index/arbitrary.ts +1 -1
- package/assembly/deserialize/index/array.ts +6 -1
- package/assembly/deserialize/index/float.ts +1 -1
- package/assembly/deserialize/index/integer.ts +1 -1
- package/assembly/deserialize/index/unsigned.ts +1 -1
- package/assembly/deserialize/simd/string.ts +17 -13
- package/assembly/deserialize/simple/arbitrary.ts +1 -1
- package/assembly/deserialize/simple/array/generic.ts +42 -0
- package/assembly/deserialize/simple/array.ts +8 -1
- package/assembly/deserialize/{float.ts → simple/float.ts} +22 -2
- package/assembly/deserialize/{integer.ts → simple/integer.ts} +3 -2
- package/assembly/deserialize/simple/map.ts +60 -12
- package/assembly/deserialize/simple/object.ts +1 -1
- package/assembly/deserialize/simple/set.ts +119 -134
- package/assembly/deserialize/simple/staticarray.ts +12 -1
- package/assembly/deserialize/simple/string.ts +15 -10
- package/assembly/deserialize/simple/struct.ts +7 -157
- package/assembly/deserialize/simple/typedarray.ts +1 -1
- package/assembly/deserialize/{unsigned.ts → simple/unsigned.ts} +3 -2
- package/assembly/deserialize/swar/array/array.ts +42 -7
- package/assembly/deserialize/swar/array/bool.ts +5 -2
- package/assembly/deserialize/swar/array/float.ts +7 -3
- package/assembly/deserialize/swar/array/generic.ts +40 -0
- package/assembly/deserialize/swar/array/integer.ts +7 -4
- package/assembly/deserialize/swar/array/object.ts +20 -4
- package/assembly/deserialize/swar/array/shared.ts +18 -4
- package/assembly/deserialize/swar/array/string.ts +5 -2
- package/assembly/deserialize/swar/array/struct.ts +20 -4
- package/assembly/deserialize/swar/array.ts +56 -2
- package/assembly/deserialize/swar/string.ts +249 -371
- package/assembly/index.ts +74 -17
- package/assembly/serialize/index/arbitrary.ts +3 -3
- package/assembly/serialize/index/float.ts +1 -1
- package/assembly/serialize/index/object.ts +1 -5
- package/assembly/serialize/simd/string.ts +4 -5
- package/assembly/serialize/simple/arbitrary.ts +3 -3
- package/assembly/serialize/simple/array.ts +17 -6
- package/assembly/serialize/simple/float.ts +18 -4
- package/assembly/serialize/simple/map.ts +10 -27
- package/assembly/serialize/simple/object.ts +1 -5
- package/assembly/serialize/simple/set.ts +3 -4
- package/assembly/serialize/simple/staticarray.ts +4 -3
- package/assembly/serialize/simple/typedarray.ts +9 -7
- package/assembly/serialize/swar/string.ts +0 -1
- package/assembly/tsconfig.json +3 -2
- package/assembly/util/dragonbox-cache.ts +1322 -0
- package/assembly/util/dragonbox.ts +596 -0
- package/lib/as-bs.ts +10 -7
- package/package.json +17 -10
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +408 -191
- package/transform/lib/index.js.map +1 -1
package/assembly/index.ts
CHANGED
|
@@ -17,15 +17,26 @@ import { serializeSet } from "./serialize/index/set";
|
|
|
17
17
|
import { deserializeSet } from "./deserialize/index/set";
|
|
18
18
|
import { serializeStaticArray } from "./serialize/index/staticarray";
|
|
19
19
|
import { deserializeStaticArray } from "./deserialize/index/staticarray";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
import {
|
|
21
|
+
BRACE_LEFT,
|
|
22
|
+
BRACE_RIGHT,
|
|
23
|
+
BRACKET_LEFT,
|
|
24
|
+
BRACKET_RIGHT,
|
|
25
|
+
COMMA,
|
|
26
|
+
NULL_WORD,
|
|
27
|
+
QUOTE,
|
|
28
|
+
NULL_WORD_U64,
|
|
29
|
+
TRUE_WORD_U64,
|
|
30
|
+
FALSE_WORD_U64,
|
|
31
|
+
} from "./custom/chars";
|
|
32
|
+
import { itoa_buffered } from "util/number";
|
|
23
33
|
import { serializeBool } from "./serialize/index/bool";
|
|
24
34
|
import { serializeInteger } from "./serialize/index/integer";
|
|
25
|
-
import { serializeFloat } from "./serialize/index/float";
|
|
35
|
+
import { serializeFloat, serializeFloat32, serializeFloat64 } from "./serialize/index/float";
|
|
36
|
+
import { dragonbox_f32_buffered, dragonbox_f64_buffered } from "./util/dragonbox";
|
|
26
37
|
import { serializeStruct } from "./serialize/index/struct";
|
|
27
38
|
import { ptrToStr } from "./util/ptrToStr";
|
|
28
|
-
import { atoi, bytes } from "./util";
|
|
39
|
+
import { atoi, bytes, scanStringEnd } from "./util";
|
|
29
40
|
import { deserializeArbitrary } from "./deserialize/index/arbitrary";
|
|
30
41
|
import { serializeObject } from "./serialize/index/object";
|
|
31
42
|
import { deserializeObject } from "./deserialize/index/object";
|
|
@@ -101,13 +112,9 @@ export namespace JSON {
|
|
|
101
112
|
}
|
|
102
113
|
return data.toString();
|
|
103
114
|
} else if (isFloat<T>(data)) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const bytes = dtoa_buffered(changetype<usize>(out), data) << 1;
|
|
108
|
-
return (out = changetype<string>(__renew(changetype<usize>(out), bytes)));
|
|
109
|
-
}
|
|
110
|
-
return data.toString();
|
|
115
|
+
out = out ? changetype<string>(__renew(changetype<usize>(out), 64)) : changetype<string>(__new(64, idof<string>()));
|
|
116
|
+
const bytes = (sizeof<T>() == 4 ? dragonbox_f32_buffered(changetype<usize>(out), <f32>data) : dragonbox_f64_buffered(changetype<usize>(out), <f64>data)) << 1;
|
|
117
|
+
return changetype<string>(__renew(changetype<usize>(out), bytes));
|
|
111
118
|
} else if (isNullable<T>() && changetype<usize>(data) == <usize>0) {
|
|
112
119
|
if (out) {
|
|
113
120
|
out = changetype<string>(__renew(changetype<usize>(out), 8));
|
|
@@ -234,12 +241,16 @@ export namespace JSON {
|
|
|
234
241
|
// @ts-expect-error
|
|
235
242
|
return out.__DESERIALIZE_CUSTOM(data);
|
|
236
243
|
// @ts-expect-error: Defined by transform
|
|
237
|
-
} else if (isDefined(type.
|
|
244
|
+
} else if (isDefined(type.__DESERIALIZE_SLOW) || isDefined(type.__DESERIALIZE_FAST)) {
|
|
238
245
|
const out = changetype<nonnull<T>>(__new(offsetof<nonnull<T>>(), idof<nonnull<T>>()));
|
|
239
246
|
// @ts-expect-error: Defined by transform
|
|
240
247
|
if (isDefined(type.__INITIALIZE)) out.__INITIALIZE();
|
|
241
248
|
// @ts-expect-error: Defined by transform
|
|
242
|
-
|
|
249
|
+
if (isDefined(type.__DESERIALIZE_FAST)) {
|
|
250
|
+
// @ts-expect-error: Defined by transform
|
|
251
|
+
out.__DESERIALIZE_FAST(dataPtr, dataPtr + dataSize, out);
|
|
252
|
+
// @ts-expect-error: Defined by transform
|
|
253
|
+
} else out.__DESERIALIZE_SLOW(dataPtr, dataPtr + dataSize, out);
|
|
243
254
|
return out;
|
|
244
255
|
}
|
|
245
256
|
if (type instanceof StaticArray) {
|
|
@@ -842,7 +853,9 @@ export namespace JSON {
|
|
|
842
853
|
serializeInteger<T>(data);
|
|
843
854
|
} else if (isFloat<T>(data)) {
|
|
844
855
|
// @ts-expect-error
|
|
845
|
-
|
|
856
|
+
if (sizeof<T>() == 4) serializeFloat32(<f32>data);
|
|
857
|
+
// @ts-expect-error
|
|
858
|
+
else serializeFloat64(<f64>data);
|
|
846
859
|
} else if (isNullable<T>() && changetype<usize>(data) == <usize>0) {
|
|
847
860
|
bs.proposeSize(8);
|
|
848
861
|
store<u64>(bs.offset, NULL_WORD_U64);
|
|
@@ -940,12 +953,14 @@ export namespace JSON {
|
|
|
940
953
|
// @ts-expect-error: Defined by transform
|
|
941
954
|
return out.__DESERIALIZE_CUSTOM(ptrToStr(srcStart, srcEnd));
|
|
942
955
|
// @ts-expect-error: Defined by transform
|
|
943
|
-
} else if (isDefined(type.
|
|
956
|
+
} else if (isDefined(type.__DESERIALIZE_SLOW) || isDefined(type.__DESERIALIZE_FAST)) {
|
|
944
957
|
const out = changetype<nonnull<T>>(dst || __new(offsetof<nonnull<T>>(), idof<nonnull<T>>()));
|
|
945
958
|
// @ts-expect-error: Defined by transform
|
|
946
959
|
if (isDefined(type.__INITIALIZE)) out.__INITIALIZE();
|
|
947
960
|
// @ts-expect-error: Defined by transform
|
|
948
|
-
out.
|
|
961
|
+
if (isDefined(type.__DESERIALIZE_FAST)) out.__DESERIALIZE_FAST(srcStart, srcEnd, out);
|
|
962
|
+
// @ts-expect-error: Defined by transform
|
|
963
|
+
else out.__DESERIALIZE_SLOW(srcStart, srcEnd, out);
|
|
949
964
|
return out;
|
|
950
965
|
}
|
|
951
966
|
if (type instanceof StaticArray) {
|
|
@@ -1010,6 +1025,48 @@ export namespace JSON {
|
|
|
1010
1025
|
return code == 0x20 || code - 9 <= 4;
|
|
1011
1026
|
}
|
|
1012
1027
|
// @ts-expect-error: decorator
|
|
1028
|
+
@inline export function scanValueEnd(srcStart: usize, srcEnd: usize): usize {
|
|
1029
|
+
if (srcStart >= srcEnd) return 0;
|
|
1030
|
+
let ptr = srcStart;
|
|
1031
|
+
while (ptr < srcEnd && isSpace(load<u16>(ptr))) ptr += 2;
|
|
1032
|
+
if (ptr >= srcEnd) return 0;
|
|
1033
|
+
const first = load<u16>(ptr);
|
|
1034
|
+
|
|
1035
|
+
if (first == QUOTE) {
|
|
1036
|
+
const endQuote = scanStringEnd(ptr, srcEnd);
|
|
1037
|
+
return endQuote >= srcEnd ? 0 : endQuote + 2;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
if (first == BRACE_LEFT || first == BRACKET_LEFT) {
|
|
1041
|
+
let depth: i32 = 1;
|
|
1042
|
+
ptr += 2;
|
|
1043
|
+
while (ptr < srcEnd) {
|
|
1044
|
+
const code = load<u16>(ptr);
|
|
1045
|
+
if (code == QUOTE) {
|
|
1046
|
+
const endQuote = scanStringEnd(ptr, srcEnd);
|
|
1047
|
+
if (endQuote >= srcEnd) return 0;
|
|
1048
|
+
ptr = endQuote + 2;
|
|
1049
|
+
continue;
|
|
1050
|
+
}
|
|
1051
|
+
if (code == BRACE_LEFT || code == BRACKET_LEFT) {
|
|
1052
|
+
depth++;
|
|
1053
|
+
} else if (code == BRACE_RIGHT || code == BRACKET_RIGHT) {
|
|
1054
|
+
if (--depth == 0) return ptr + 2;
|
|
1055
|
+
}
|
|
1056
|
+
ptr += 2;
|
|
1057
|
+
}
|
|
1058
|
+
return 0;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
while (ptr < srcEnd) {
|
|
1062
|
+
const code = load<u16>(ptr);
|
|
1063
|
+
if (code == COMMA || code == BRACKET_RIGHT || code == BRACE_RIGHT || isSpace(code)) return ptr;
|
|
1064
|
+
ptr += 2;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
return ptr;
|
|
1068
|
+
}
|
|
1069
|
+
// @ts-expect-error: decorator
|
|
1013
1070
|
@inline export function ptrToStr(start: usize, end: usize): string {
|
|
1014
1071
|
const size = end - start;
|
|
1015
1072
|
const out = __new(size, idof<string>());
|
|
@@ -2,7 +2,7 @@ import { JSON } from "../..";
|
|
|
2
2
|
import { bs } from "../../../lib/as-bs";
|
|
3
3
|
import { serializeArray } from "./array";
|
|
4
4
|
import { serializeBool } from "./bool";
|
|
5
|
-
import {
|
|
5
|
+
import { serializeFloat32, serializeFloat64 } from "./float";
|
|
6
6
|
import { serializeInteger } from "./integer";
|
|
7
7
|
import { serializeMap } from "./map";
|
|
8
8
|
import { serializeObject } from "./object";
|
|
@@ -41,10 +41,10 @@ export function serializeArbitrary(src: JSON.Value): void {
|
|
|
41
41
|
serializeInteger<i64>(src.get<i64>());
|
|
42
42
|
break;
|
|
43
43
|
case JSON.Types.F32:
|
|
44
|
-
|
|
44
|
+
serializeFloat32(src.get<f32>());
|
|
45
45
|
break;
|
|
46
46
|
case JSON.Types.F64:
|
|
47
|
-
|
|
47
|
+
serializeFloat64(src.get<f64>());
|
|
48
48
|
break;
|
|
49
49
|
case JSON.Types.String:
|
|
50
50
|
serializeString(src.get<string>());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { serializeFloat } from "../simple/float";
|
|
1
|
+
export { serializeFloat, serializeFloat32, serializeFloat64 } from "../simple/float";
|
|
@@ -18,29 +18,25 @@ export function serializeObject(src: JSON.Obj): void {
|
|
|
18
18
|
const keys = src.keys();
|
|
19
19
|
const values = src.values();
|
|
20
20
|
|
|
21
|
-
bs.
|
|
21
|
+
bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
|
|
22
22
|
store<u16>(bs.offset, BRACE_LEFT);
|
|
23
23
|
bs.offset += 2;
|
|
24
24
|
|
|
25
25
|
for (let i = 0; i < srcEnd; i++) {
|
|
26
26
|
serializeString(unchecked(keys[i]));
|
|
27
|
-
bs.growSize(2);
|
|
28
27
|
store<u16>(bs.offset, COLON);
|
|
29
28
|
bs.offset += 2;
|
|
30
29
|
|
|
31
30
|
serializeArbitrary(unchecked(values[i]));
|
|
32
|
-
bs.growSize(2);
|
|
33
31
|
store<u16>(bs.offset, COMMA);
|
|
34
32
|
bs.offset += 2;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
35
|
serializeString(unchecked(keys[srcEnd]));
|
|
38
|
-
bs.growSize(2);
|
|
39
36
|
store<u16>(bs.offset, COLON);
|
|
40
37
|
bs.offset += 2;
|
|
41
38
|
serializeArbitrary(unchecked(values[srcEnd]));
|
|
42
39
|
|
|
43
|
-
bs.growSize(2);
|
|
44
40
|
store<u16>(bs.offset, BRACE_RIGHT);
|
|
45
41
|
bs.offset += 2;
|
|
46
42
|
}
|
|
@@ -55,16 +55,15 @@ export function serializeString_SIMD(src: string): void {
|
|
|
55
55
|
// console.log("lt20 : " + mask_to_string_v128(lt20) + " -> " + mask_to_string_v128(SPLAT_0020));
|
|
56
56
|
// console.log("gteD8 : " + mask_to_string_v128(gteD8) + " -> " + mask_to_string_v128(SPLAT_FFD8));
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
// console.log("sieve : " + mask_to_string_v128(sieve));
|
|
58
|
+
let mask = i8x16.bitmask(v128.or(eq22, v128.or(eq5C, v128.or(lt20, gteD8))));
|
|
60
59
|
|
|
61
|
-
if (
|
|
60
|
+
if (mask == 0) {
|
|
62
61
|
bs.offset += 16;
|
|
63
62
|
srcStart += 16;
|
|
64
63
|
continue;
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
|
|
66
|
+
bs.growSize(popcnt(mask) * 10 + 12);
|
|
68
67
|
|
|
69
68
|
do {
|
|
70
69
|
const laneIdx = ctz(mask);
|
|
@@ -110,7 +109,7 @@ export function serializeString_SIMD(src: string): void {
|
|
|
110
109
|
const next = load<u16>(srcIdx, 1);
|
|
111
110
|
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
112
111
|
// paired surrogate
|
|
113
|
-
mask &=
|
|
112
|
+
mask &= ~(0b11 << (laneIdx + 1));
|
|
114
113
|
continue;
|
|
115
114
|
}
|
|
116
115
|
}
|
|
@@ -2,7 +2,7 @@ import { JSON } from "../..";
|
|
|
2
2
|
import { bs } from "../../../lib/as-bs";
|
|
3
3
|
import { serializeArray } from "./array";
|
|
4
4
|
import { serializeBool } from "./bool";
|
|
5
|
-
import {
|
|
5
|
+
import { serializeFloat32, serializeFloat64 } from "./float";
|
|
6
6
|
import { serializeInteger } from "./integer";
|
|
7
7
|
import { serializeMap } from "./map";
|
|
8
8
|
import { serializeObject } from "./object";
|
|
@@ -41,10 +41,10 @@ export function serializeArbitrary(src: JSON.Value): void {
|
|
|
41
41
|
serializeInteger<i64>(src.get<i64>());
|
|
42
42
|
break;
|
|
43
43
|
case JSON.Types.F32:
|
|
44
|
-
|
|
44
|
+
serializeFloat32(src.get<f32>());
|
|
45
45
|
break;
|
|
46
46
|
case JSON.Types.F64:
|
|
47
|
-
|
|
47
|
+
serializeFloat64(src.get<f64>());
|
|
48
48
|
break;
|
|
49
49
|
case JSON.Types.String:
|
|
50
50
|
serializeString(src.get<string>());
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import { bs } from "../../../lib/as-bs";
|
|
2
2
|
import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
|
|
3
3
|
import { JSON } from "../..";
|
|
4
|
+
import { serializeFloat32, serializeFloat64 } from "./float";
|
|
5
|
+
|
|
6
|
+
@inline
|
|
7
|
+
function serializeArrayElement<T>(value: T): void {
|
|
8
|
+
if (isFloat<T>()) {
|
|
9
|
+
if (sizeof<T>() == 4) serializeFloat32(<f32>value);
|
|
10
|
+
else serializeFloat64(<f64>value);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
JSON.__serialize<T>(value);
|
|
14
|
+
}
|
|
4
15
|
|
|
5
16
|
export function serializeArray<T extends any[]>(src: T): void {
|
|
6
|
-
|
|
7
|
-
const end =
|
|
17
|
+
const len = src.length;
|
|
18
|
+
const end = len - 1;
|
|
8
19
|
let i = 0;
|
|
9
20
|
if (end == -1) {
|
|
21
|
+
bs.proposeSize(4);
|
|
10
22
|
store<u32>(bs.offset, 6094939);
|
|
11
23
|
bs.offset += 4;
|
|
12
24
|
return;
|
|
13
25
|
}
|
|
26
|
+
bs.proposeSize(4 + <u32>(len - 1) * 2);
|
|
14
27
|
// {} = 4
|
|
15
28
|
// xi, = n << 1
|
|
16
29
|
|
|
@@ -19,15 +32,13 @@ export function serializeArray<T extends any[]>(src: T): void {
|
|
|
19
32
|
|
|
20
33
|
while (i < end) {
|
|
21
34
|
const block = unchecked(src[i++]);
|
|
22
|
-
|
|
23
|
-
bs.growSize(2);
|
|
35
|
+
serializeArrayElement<valueof<T>>(block);
|
|
24
36
|
store<u16>(bs.offset, COMMA);
|
|
25
37
|
bs.offset += 2;
|
|
26
38
|
}
|
|
27
39
|
|
|
28
40
|
const lastBlock = unchecked(src[end]);
|
|
29
|
-
|
|
30
|
-
// bs.growSize(2);
|
|
41
|
+
serializeArrayElement<valueof<T>>(lastBlock);
|
|
31
42
|
store<u16>(bs.offset, BRACKET_RIGHT);
|
|
32
43
|
bs.offset += 2;
|
|
33
44
|
}
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import { bs } from "../../../lib/as-bs";
|
|
2
|
-
import {
|
|
2
|
+
import { dragonbox_f32_buffered, dragonbox_f64_buffered } from "../../util/dragonbox";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
@inline
|
|
5
|
+
export function serializeFloat32(data: f32): void {
|
|
6
6
|
bs.ensureSize(64);
|
|
7
|
-
const size =
|
|
7
|
+
const size = dragonbox_f32_buffered(bs.offset, data) << 1;
|
|
8
8
|
bs.stackSize += size;
|
|
9
9
|
bs.offset += size;
|
|
10
10
|
}
|
|
11
|
+
|
|
12
|
+
@inline
|
|
13
|
+
export function serializeFloat64(data: f64): void {
|
|
14
|
+
bs.ensureSize(64);
|
|
15
|
+
const size = dragonbox_f64_buffered(bs.offset, data) << 1;
|
|
16
|
+
bs.stackSize += size;
|
|
17
|
+
bs.offset += size;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// @ts-ignore: inline
|
|
21
|
+
@inline export function serializeFloat<T extends number>(data: T): void {
|
|
22
|
+
if (sizeof<T>() == 4) serializeFloat32(<f32>data);
|
|
23
|
+
else serializeFloat64(<f64>data);
|
|
24
|
+
}
|
|
@@ -15,52 +15,35 @@ export function serializeMap<T extends Map<any, any>>(src: T): void {
|
|
|
15
15
|
|
|
16
16
|
let keys = src.keys();
|
|
17
17
|
let values = src.values();
|
|
18
|
+
const keyIsString = isString<indexof<T>>();
|
|
18
19
|
|
|
19
|
-
bs.proposeSize(4);
|
|
20
|
+
bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
|
|
20
21
|
|
|
21
22
|
store<u16>(bs.offset, BRACE_LEFT);
|
|
22
23
|
bs.offset += 2;
|
|
23
24
|
|
|
24
25
|
for (let i = 0; i < srcEnd; i++) {
|
|
25
|
-
|
|
26
|
-
if (!isString<indexof<T>>()) {
|
|
27
|
-
bs.growSize(6);
|
|
28
|
-
store<u16>(bs.offset, 34);
|
|
29
|
-
bs.offset += 2;
|
|
26
|
+
if (keyIsString) {
|
|
30
27
|
JSON.__serialize(unchecked(keys[i]));
|
|
31
|
-
store<u16>(bs.offset, 34);
|
|
32
|
-
store<u16>(bs.offset, COLON, 2);
|
|
33
|
-
bs.offset += 4;
|
|
34
28
|
} else {
|
|
35
|
-
JSON.__serialize(unchecked(keys[i]));
|
|
36
|
-
bs.growSize(2);
|
|
37
|
-
store<u16>(bs.offset, COLON);
|
|
38
|
-
bs.offset += 2;
|
|
29
|
+
JSON.__serialize<string>(JSON.internal.stringify<indexof<T>>(unchecked(keys[i])));
|
|
39
30
|
}
|
|
31
|
+
store<u16>(bs.offset, COLON);
|
|
32
|
+
bs.offset += 2;
|
|
40
33
|
JSON.__serialize(unchecked(values[i]));
|
|
41
|
-
bs.growSize(2);
|
|
42
34
|
store<u16>(bs.offset, COMMA);
|
|
43
35
|
bs.offset += 2;
|
|
44
36
|
}
|
|
45
37
|
|
|
46
|
-
|
|
47
|
-
if (!isString<indexof<T>>()) {
|
|
48
|
-
bs.growSize(6);
|
|
49
|
-
store<u16>(bs.offset, 34);
|
|
50
|
-
bs.offset += 2;
|
|
38
|
+
if (keyIsString) {
|
|
51
39
|
JSON.__serialize(unchecked(keys[srcEnd]));
|
|
52
|
-
store<u16>(bs.offset, 34);
|
|
53
|
-
store<u16>(bs.offset, COLON, 2);
|
|
54
|
-
bs.offset += 4;
|
|
55
40
|
} else {
|
|
56
|
-
JSON.__serialize(unchecked(keys[srcEnd]));
|
|
57
|
-
bs.growSize(2);
|
|
58
|
-
store<u16>(bs.offset, COLON);
|
|
59
|
-
bs.offset += 2;
|
|
41
|
+
JSON.__serialize<string>(JSON.internal.stringify<indexof<T>>(unchecked(keys[srcEnd])));
|
|
60
42
|
}
|
|
43
|
+
store<u16>(bs.offset, COLON);
|
|
44
|
+
bs.offset += 2;
|
|
61
45
|
|
|
62
46
|
JSON.__serialize(unchecked(values[srcEnd]));
|
|
63
|
-
// bs.growSize(2);
|
|
64
47
|
store<u16>(bs.offset, BRACE_RIGHT);
|
|
65
48
|
bs.offset += 2;
|
|
66
49
|
}
|
|
@@ -18,29 +18,25 @@ export function serializeObject(src: JSON.Obj): void {
|
|
|
18
18
|
const keys = src.keys();
|
|
19
19
|
const values = src.values();
|
|
20
20
|
|
|
21
|
-
bs.
|
|
21
|
+
bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
|
|
22
22
|
store<u16>(bs.offset, BRACE_LEFT);
|
|
23
23
|
bs.offset += 2;
|
|
24
24
|
|
|
25
25
|
for (let i = 0; i < srcEnd; i++) {
|
|
26
26
|
serializeString_SWAR(unchecked(keys[i]));
|
|
27
|
-
bs.growSize(2);
|
|
28
27
|
store<u16>(bs.offset, COLON);
|
|
29
28
|
bs.offset += 2;
|
|
30
29
|
|
|
31
30
|
serializeArbitrary(unchecked(values[i]));
|
|
32
|
-
bs.growSize(2);
|
|
33
31
|
store<u16>(bs.offset, COMMA);
|
|
34
32
|
bs.offset += 2;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
35
|
serializeString_SWAR(unchecked(keys[srcEnd]));
|
|
38
|
-
bs.growSize(2);
|
|
39
36
|
store<u16>(bs.offset, COLON);
|
|
40
37
|
bs.offset += 2;
|
|
41
38
|
serializeArbitrary(unchecked(values[srcEnd]));
|
|
42
39
|
|
|
43
|
-
bs.growSize(2);
|
|
44
40
|
store<u16>(bs.offset, BRACE_RIGHT);
|
|
45
41
|
bs.offset += 2;
|
|
46
42
|
}
|
|
@@ -3,25 +3,24 @@ import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
|
|
|
3
3
|
import { JSON } from "../..";
|
|
4
4
|
|
|
5
5
|
export function serializeSet<T extends Set<any>>(src: T): void {
|
|
6
|
-
bs.proposeSize(4);
|
|
7
6
|
const srcSize = src.size;
|
|
8
7
|
if (srcSize == 0) {
|
|
8
|
+
bs.proposeSize(4);
|
|
9
9
|
store<u32>(bs.offset, 6094939); // []
|
|
10
10
|
bs.offset += 4;
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
|
+
bs.proposeSize(4 + <u32>(srcSize - 1) * 2);
|
|
13
14
|
|
|
14
15
|
const values = src.values();
|
|
15
|
-
const end = srcSize - 1;
|
|
16
|
-
|
|
17
16
|
store<u16>(bs.offset, BRACKET_LEFT);
|
|
18
17
|
bs.offset += 2;
|
|
19
18
|
|
|
19
|
+
const end = srcSize - 1;
|
|
20
20
|
for (let i = 0; i < end; i++) {
|
|
21
21
|
const block = unchecked(values[i]);
|
|
22
22
|
// @ts-ignore: type
|
|
23
23
|
JSON.__serialize<indexof<T>>(block);
|
|
24
|
-
bs.growSize(2);
|
|
25
24
|
store<u16>(bs.offset, COMMA);
|
|
26
25
|
bs.offset += 2;
|
|
27
26
|
}
|
|
@@ -3,14 +3,16 @@ import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
|
|
|
3
3
|
import { JSON } from "../..";
|
|
4
4
|
|
|
5
5
|
export function serializeStaticArray<T extends StaticArray<any>>(src: T): void {
|
|
6
|
-
|
|
7
|
-
const end =
|
|
6
|
+
const len = src.length;
|
|
7
|
+
const end = len - 1;
|
|
8
8
|
let i = 0;
|
|
9
9
|
if (end == -1) {
|
|
10
|
+
bs.proposeSize(4);
|
|
10
11
|
store<u32>(bs.offset, 6094939); // []
|
|
11
12
|
bs.offset += 4;
|
|
12
13
|
return;
|
|
13
14
|
}
|
|
15
|
+
bs.proposeSize(4 + <u32>(len - 1) * 2);
|
|
14
16
|
|
|
15
17
|
store<u16>(bs.offset, BRACKET_LEFT);
|
|
16
18
|
bs.offset += 2;
|
|
@@ -18,7 +20,6 @@ export function serializeStaticArray<T extends StaticArray<any>>(src: T): void {
|
|
|
18
20
|
while (i < end) {
|
|
19
21
|
const block = unchecked(src[i++]);
|
|
20
22
|
JSON.__serialize<valueof<T>>(block);
|
|
21
|
-
bs.growSize(2);
|
|
22
23
|
store<u16>(bs.offset, COMMA);
|
|
23
24
|
bs.offset += 2;
|
|
24
25
|
}
|
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
import { bs } from "../../../lib/as-bs";
|
|
2
2
|
import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../custom/chars";
|
|
3
|
-
import {
|
|
3
|
+
import { serializeFloat32, serializeFloat64 } from "./float";
|
|
4
4
|
import { serializeInteger } from "./integer";
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
@inline
|
|
8
8
|
function serializeTypedArrayElement<T extends ArrayLike<number>>(src: T, index: i32): void {
|
|
9
9
|
if (isFloat<valueof<T>>()) {
|
|
10
|
-
|
|
10
|
+
if (sizeof<valueof<T>>() == 4) serializeFloat32(<f32>unchecked(src[index]));
|
|
11
|
+
else serializeFloat64(<f64>unchecked(src[index]));
|
|
11
12
|
} else {
|
|
12
13
|
serializeInteger<valueof<T>>(unchecked(src[index]));
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export function serializeTypedArray<T extends ArrayLike<number>>(src: T): void {
|
|
17
|
-
|
|
18
|
-
const end =
|
|
18
|
+
const len = src.length;
|
|
19
|
+
const end = len - 1;
|
|
19
20
|
if (end == -1) {
|
|
21
|
+
bs.proposeSize(4);
|
|
20
22
|
store<u32>(bs.offset, 6094939);
|
|
21
23
|
bs.offset += 4;
|
|
22
24
|
return;
|
|
23
25
|
}
|
|
26
|
+
bs.proposeSize(4 + <u32>(len - 1) * 2);
|
|
24
27
|
|
|
25
28
|
store<u16>(bs.offset, BRACKET_LEFT);
|
|
26
29
|
bs.offset += 2;
|
|
27
30
|
|
|
28
31
|
for (let i = 0; i < end; i++) {
|
|
29
32
|
serializeTypedArrayElement(src, i);
|
|
30
|
-
bs.growSize(2);
|
|
31
33
|
store<u16>(bs.offset, COMMA);
|
|
32
34
|
bs.offset += 2;
|
|
33
35
|
}
|
|
@@ -40,19 +42,19 @@ export function serializeTypedArray<T extends ArrayLike<number>>(src: T): void {
|
|
|
40
42
|
export function serializeArrayBufferUnsafe(srcStart: usize, byteLength: i32): void {
|
|
41
43
|
const end = byteLength - 1;
|
|
42
44
|
|
|
43
|
-
bs.proposeSize(4);
|
|
44
45
|
if (end == -1) {
|
|
46
|
+
bs.proposeSize(4);
|
|
45
47
|
store<u32>(bs.offset, 6094939);
|
|
46
48
|
bs.offset += 4;
|
|
47
49
|
return;
|
|
48
50
|
}
|
|
51
|
+
bs.proposeSize(4 + <u32>(end) * 2);
|
|
49
52
|
|
|
50
53
|
store<u16>(bs.offset, BRACKET_LEFT);
|
|
51
54
|
bs.offset += 2;
|
|
52
55
|
|
|
53
56
|
for (let i = 0; i < end; i++) {
|
|
54
57
|
serializeInteger<u8>(load<u8>(srcStart + <usize>i));
|
|
55
|
-
bs.growSize(2);
|
|
56
58
|
store<u16>(bs.offset, COMMA);
|
|
57
59
|
bs.offset += 2;
|
|
58
60
|
}
|
|
@@ -5,7 +5,6 @@ import { u16_to_hex4_swar } from "../../util/swar";
|
|
|
5
5
|
import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
|
|
6
6
|
|
|
7
7
|
// @ts-expect-error: @lazy is a valid decorator
|
|
8
|
-
// @ts-nocheck
|
|
9
8
|
@lazy const U00_MARKER = 13511005048209500;
|
|
10
9
|
// @ts-expect-error: @lazy is a valid decorator
|
|
11
10
|
@lazy const U_MARKER = 7667804;
|
package/assembly/tsconfig.json
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"extends": "assemblyscript/std/assembly.json",
|
|
3
3
|
"include": ["./**/*.ts"],
|
|
4
4
|
"compilerOptions": {
|
|
5
|
+
"allowImportingTsExtensions": true,
|
|
5
6
|
"experimentalDecorators": true,
|
|
6
7
|
"emitDecoratorMetadata": true,
|
|
7
8
|
|
|
@@ -18,6 +19,6 @@
|
|
|
18
19
|
"noUnusedParameters": false,
|
|
19
20
|
"noImplicitReturns": true,
|
|
20
21
|
"noFallthroughCasesInSwitch": true,
|
|
21
|
-
"noUncheckedIndexedAccess": false
|
|
22
|
-
}
|
|
22
|
+
"noUncheckedIndexedAccess": false,
|
|
23
|
+
},
|
|
23
24
|
}
|