json-as 1.3.9 → 1.5.0
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 +60 -19
- package/README.md +120 -21
- package/assembly/custom/chars.ts +39 -78
- package/assembly/deserialize/index/arbitrary.ts +28 -10
- package/assembly/deserialize/index/float.ts +2 -4
- package/assembly/deserialize/index/integer.ts +2 -4
- package/assembly/deserialize/index/object.ts +6 -1
- package/assembly/deserialize/index/string.ts +2 -7
- package/assembly/deserialize/index/unsigned.ts +2 -4
- package/assembly/deserialize/naive/array/arbitrary.ts +3 -136
- package/assembly/deserialize/naive/array/array.ts +30 -1
- package/assembly/deserialize/naive/array/integer.ts +2 -7
- package/assembly/deserialize/naive/array/map.ts +10 -14
- package/assembly/deserialize/naive/array/object.ts +10 -14
- package/assembly/deserialize/naive/array/struct.ts +19 -1
- package/assembly/deserialize/naive/bool.ts +1 -5
- package/assembly/deserialize/naive/date.ts +1 -2
- package/assembly/deserialize/naive/float.ts +4 -11
- package/assembly/deserialize/naive/integer.ts +2 -4
- package/assembly/deserialize/naive/map.ts +42 -205
- package/assembly/deserialize/naive/object.ts +291 -174
- package/assembly/deserialize/naive/raw.ts +1 -5
- package/assembly/deserialize/naive/set.ts +3 -6
- package/assembly/deserialize/naive/staticarray.ts +2 -4
- package/assembly/deserialize/naive/string.ts +68 -24
- package/assembly/deserialize/naive/typedarray.ts +1 -2
- package/assembly/deserialize/naive/unsigned.ts +2 -4
- package/assembly/deserialize/simd/array/integer.ts +5 -13
- package/assembly/deserialize/simd/float.ts +5 -12
- package/assembly/deserialize/simd/integer.ts +6 -15
- package/assembly/deserialize/simd/string.ts +21 -43
- package/assembly/deserialize/swar/array/arbitrary.ts +1 -2
- package/assembly/deserialize/swar/array/array.ts +2 -4
- package/assembly/deserialize/swar/array/bool.ts +2 -4
- package/assembly/deserialize/swar/array/box.ts +1 -2
- package/assembly/deserialize/swar/array/float.ts +8 -21
- package/assembly/deserialize/swar/array/generic.ts +2 -4
- package/assembly/deserialize/swar/array/integer.ts +13 -27
- package/assembly/deserialize/swar/array/map.ts +1 -2
- package/assembly/deserialize/swar/array/object.ts +2 -4
- package/assembly/deserialize/swar/array/raw.ts +1 -2
- package/assembly/deserialize/swar/array/shared.ts +9 -21
- package/assembly/deserialize/swar/array/string.ts +4 -10
- package/assembly/deserialize/swar/array/struct.ts +3 -9
- package/assembly/deserialize/swar/array.ts +1 -3
- package/assembly/deserialize/swar/float.ts +7 -17
- package/assembly/deserialize/swar/integer.ts +6 -15
- package/assembly/deserialize/swar/string.ts +40 -54
- package/assembly/deserialize/swar/typedarray.ts +4 -4
- package/assembly/index.d.ts +259 -21
- package/assembly/index.ts +1704 -266
- package/assembly/serialize/index/arbitrary.ts +70 -4
- package/assembly/serialize/index/jsonarray.ts +51 -0
- package/assembly/serialize/index/object.ts +39 -14
- package/assembly/serialize/index/string.ts +1 -2
- package/assembly/serialize/index/typedarray.ts +1 -2
- package/assembly/serialize/index.ts +1 -0
- package/assembly/serialize/naive/array.ts +23 -34
- package/assembly/serialize/naive/bool.ts +0 -1
- package/assembly/serialize/naive/float.ts +16 -25
- package/assembly/serialize/naive/integer.ts +1 -5
- package/assembly/serialize/naive/raw.ts +1 -2
- package/assembly/serialize/naive/set.ts +0 -4
- package/assembly/serialize/naive/staticarray.ts +0 -5
- package/assembly/serialize/naive/string.ts +11 -7
- package/assembly/serialize/naive/typedarray.ts +0 -6
- package/assembly/serialize/simd/string.ts +1 -3
- package/assembly/serialize/swar/string.ts +2 -4
- package/assembly/util/atoi-fast.ts +4 -14
- package/assembly/util/atoi.ts +1 -2
- package/assembly/util/bytes.ts +1 -2
- package/assembly/util/idofd.ts +1 -2
- package/assembly/util/isSpace.ts +1 -2
- package/assembly/util/itoa-fast.ts +9 -15
- package/assembly/util/nextPowerOf2.ts +1 -2
- package/assembly/util/parsefloat-fast.ts +4 -7
- package/assembly/util/ptrToStr.ts +1 -2
- package/assembly/util/scanValueEnd.ts +1 -2
- package/assembly/util/scanValueEndSimd.ts +198 -0
- package/assembly/util/scanValueEndSwar.ts +184 -0
- package/assembly/util/scientific.ts +8 -14
- package/assembly/util/simd-int.ts +4 -8
- package/assembly/util/snp.ts +2 -7
- package/assembly/util/stringScan.ts +2 -4
- package/assembly/util/swar-int.ts +8 -16
- package/assembly/util/swar.ts +2 -4
- package/lib/as-bs.ts +57 -42
- package/package.json +27 -10
- package/transform/lib/builder.d.ts +0 -1
- package/transform/lib/builder.js +0 -1
- package/transform/lib/index.d.ts +0 -1
- package/transform/lib/index.js +617 -326
- package/transform/lib/linkers/alias.d.ts +0 -1
- package/transform/lib/linkers/alias.js +0 -1
- package/transform/lib/linkers/custom.d.ts +0 -1
- package/transform/lib/linkers/custom.js +0 -1
- package/transform/lib/linkers/imports.d.ts +0 -1
- package/transform/lib/linkers/imports.js +0 -1
- package/transform/lib/types.d.ts +4 -2
- package/transform/lib/types.js +5 -1
- package/transform/lib/util.d.ts +0 -1
- package/transform/lib/util.js +0 -1
- package/transform/lib/visitor.d.ts +0 -1
- package/transform/lib/visitor.js +0 -1
- package/assembly/util/dragonbox-cache.ts +0 -445
- package/assembly/util/dragonbox.ts +0 -660
- package/transform/lib/builder.d.ts.map +0 -1
- package/transform/lib/builder.js.map +0 -1
- package/transform/lib/index.d.ts.map +0 -1
- package/transform/lib/index.js.map +0 -1
- package/transform/lib/linkers/alias.d.ts.map +0 -1
- package/transform/lib/linkers/alias.js.map +0 -1
- package/transform/lib/linkers/custom.d.ts.map +0 -1
- package/transform/lib/linkers/custom.js.map +0 -1
- package/transform/lib/linkers/imports.d.ts.map +0 -1
- package/transform/lib/linkers/imports.js.map +0 -1
- package/transform/lib/types.d.ts.map +0 -1
- package/transform/lib/types.js.map +0 -1
- package/transform/lib/util.d.ts.map +0 -1
- package/transform/lib/util.js.map +0 -1
- package/transform/lib/visitor.d.ts.map +0 -1
- package/transform/lib/visitor.js.map +0 -1
|
@@ -7,12 +7,9 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
7
7
|
// Store helpers parameterised on the element type `E` directly, so they
|
|
8
8
|
// serve both `Array<E>` and `TypedArray<E>` callers. The integer-array
|
|
9
9
|
// callers below all pass `valueof<T>` and AS folds the resulting tower of
|
|
10
|
-
// `sizeof<E>` comparisons at compile time
|
|
10
|
+
// `sizeof<E>` comparisons at compile time - same codegen as the prior
|
|
11
11
|
// `T extends number[]` version, but reusable from `swar/typedarray.ts`.
|
|
12
|
-
|
|
13
|
-
slot: usize,
|
|
14
|
-
value: i64,
|
|
15
|
-
): void {
|
|
12
|
+
function storeSignedIntegerE<E extends number>(slot: usize, value: i64): void {
|
|
16
13
|
if (sizeof<E>() == sizeof<i8>()) {
|
|
17
14
|
store<i8>(slot, <i8>value);
|
|
18
15
|
} else if (sizeof<E>() == sizeof<i16>()) {
|
|
@@ -26,8 +23,7 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
@inline function storeUnsignedIntegerE<E extends number>(
|
|
26
|
+
function storeUnsignedIntegerE<E extends number>(
|
|
31
27
|
slot: usize,
|
|
32
28
|
value: u64,
|
|
33
29
|
): void {
|
|
@@ -53,7 +49,7 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
53
49
|
// Parsers are also E-parameterised so they're shareable with
|
|
54
50
|
// `swar/typedarray.ts`. The body is byte-identical to the prior version
|
|
55
51
|
// modulo s/valueof<T>/E/.
|
|
56
|
-
|
|
52
|
+
export function parseSignedIntegerScalar<E extends number>(
|
|
57
53
|
srcStart: usize,
|
|
58
54
|
srcEnd: usize,
|
|
59
55
|
slot: usize,
|
|
@@ -83,8 +79,7 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
83
79
|
return srcStart;
|
|
84
80
|
}
|
|
85
81
|
|
|
86
|
-
|
|
87
|
-
@inline export function parseUnsignedIntegerScalar<E extends number>(
|
|
82
|
+
export function parseUnsignedIntegerScalar<E extends number>(
|
|
88
83
|
srcStart: usize,
|
|
89
84
|
srcEnd: usize,
|
|
90
85
|
slot: usize,
|
|
@@ -105,8 +100,7 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
105
100
|
return srcStart;
|
|
106
101
|
}
|
|
107
102
|
|
|
108
|
-
|
|
109
|
-
@inline export function parseSignedIntegerSWAR<E extends number>(
|
|
103
|
+
export function parseSignedIntegerSWAR<E extends number>(
|
|
110
104
|
srcStart: usize,
|
|
111
105
|
srcEnd: usize,
|
|
112
106
|
slot: usize,
|
|
@@ -154,8 +148,7 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
154
148
|
return srcStart;
|
|
155
149
|
}
|
|
156
150
|
|
|
157
|
-
|
|
158
|
-
@inline export function parseUnsignedIntegerSWAR<E extends number>(
|
|
151
|
+
export function parseUnsignedIntegerSWAR<E extends number>(
|
|
159
152
|
srcStart: usize,
|
|
160
153
|
srcEnd: usize,
|
|
161
154
|
slot: usize,
|
|
@@ -214,11 +207,7 @@ import { parse4Digits_PairMul } from "../../../util/swar-int";
|
|
|
214
207
|
return srcStart;
|
|
215
208
|
}
|
|
216
209
|
|
|
217
|
-
|
|
218
|
-
@inline function skipIntegerArrayWhitespace(
|
|
219
|
-
srcStart: usize,
|
|
220
|
-
srcEnd: usize,
|
|
221
|
-
): usize {
|
|
210
|
+
function skipIntegerArrayWhitespace(srcStart: usize, srcEnd: usize): usize {
|
|
222
211
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) {
|
|
223
212
|
srcStart += 2;
|
|
224
213
|
}
|
|
@@ -309,8 +298,7 @@ export function deserializeIntegerArray_SLOW<T extends number[]>(
|
|
|
309
298
|
throw new Error("Failed to parse JSON!");
|
|
310
299
|
}
|
|
311
300
|
|
|
312
|
-
|
|
313
|
-
@inline function deserializeIntegerArrayImpl<T extends number[]>(
|
|
301
|
+
function deserializeIntegerArrayImpl<T extends number[]>(
|
|
314
302
|
srcStart: usize,
|
|
315
303
|
srcEnd: usize,
|
|
316
304
|
dst: usize,
|
|
@@ -644,8 +632,7 @@ function deserializeNarrowIntegerArray_SWAR<T extends number[]>(
|
|
|
644
632
|
return out;
|
|
645
633
|
}
|
|
646
634
|
|
|
647
|
-
|
|
648
|
-
@inline function deserializeIntegerArrayBody<T extends number[]>(
|
|
635
|
+
function deserializeIntegerArrayBody<T extends number[]>(
|
|
649
636
|
srcStart: usize,
|
|
650
637
|
srcEnd: usize,
|
|
651
638
|
out: T,
|
|
@@ -666,7 +653,7 @@ function deserializeNarrowIntegerArray_SWAR<T extends number[]>(
|
|
|
666
653
|
const slot = ensureArrayElementSlot<T>(out, index);
|
|
667
654
|
// Inline the array-optimized SWAR parser directly. The top-level
|
|
668
655
|
// (`deserializeIntegerArrayImpl`) and the typed-array path
|
|
669
|
-
// (`swar/typedarray.ts`) already call these
|
|
656
|
+
// (`swar/typedarray.ts`) already call these - having the field path
|
|
670
657
|
// call them too means the per-element parser is identical across all
|
|
671
658
|
// three call sites (parse4 + scalar fold for both signed and
|
|
672
659
|
// unsigned, narrow-lane special case for i8/u8/i16/u16).
|
|
@@ -674,7 +661,7 @@ function deserializeNarrowIntegerArray_SWAR<T extends number[]>(
|
|
|
674
661
|
// Why not `deserializeUnsignedField_SWAR` (which uses parse8 + scalar)?
|
|
675
662
|
// That tuning targets the struct-single-field path where the digit
|
|
676
663
|
// run is one aligned token. In an array, mixed element widths cause
|
|
677
|
-
// parse8 to fail-and-retry at element boundaries
|
|
664
|
+
// parse8 to fail-and-retry at element boundaries - see u32-64mib's
|
|
678
665
|
// 23% regression when parse8 was tried in the array path.
|
|
679
666
|
srcStart = isSigned<valueof<T>>()
|
|
680
667
|
? parseSignedIntegerSWAR<valueof<T>>(srcStart, srcEnd, slot)
|
|
@@ -702,8 +689,7 @@ function deserializeNarrowIntegerArray_SWAR<T extends number[]>(
|
|
|
702
689
|
throw new Error("Failed to parse JSON!");
|
|
703
690
|
}
|
|
704
691
|
|
|
705
|
-
|
|
706
|
-
@inline export function deserializeIntegerArrayField<T extends number[]>(
|
|
692
|
+
export function deserializeIntegerArrayField<T extends number[]>(
|
|
707
693
|
srcStart: usize,
|
|
708
694
|
srcEnd: usize,
|
|
709
695
|
fieldPtr: usize,
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { deserializeGenericArrayBody } from "./generic";
|
|
2
2
|
import { ensureArrayField } from "./shared";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
@inline export function deserializeMapArrayField<T extends Map<any, any>[]>(
|
|
4
|
+
export function deserializeMapArrayField<T extends Map<any, any>[]>(
|
|
6
5
|
srcStart: usize,
|
|
7
6
|
srcEnd: usize,
|
|
8
7
|
fieldPtr: usize,
|
|
@@ -7,8 +7,7 @@ import {
|
|
|
7
7
|
skipWhitespace,
|
|
8
8
|
} from "./shared";
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
@inline function deserializeObjectArrayBody<T extends unknown[]>(
|
|
10
|
+
function deserializeObjectArrayBody<T extends unknown[]>(
|
|
12
11
|
srcStart: usize,
|
|
13
12
|
srcEnd: usize,
|
|
14
13
|
out: T,
|
|
@@ -59,8 +58,7 @@ import {
|
|
|
59
58
|
throw new Error("Failed to parse JSON!");
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
@inline export function deserializeObjectArrayField<T extends unknown[]>(
|
|
61
|
+
export function deserializeObjectArrayField<T extends unknown[]>(
|
|
64
62
|
srcStart: usize,
|
|
65
63
|
srcEnd: usize,
|
|
66
64
|
fieldPtr: usize,
|
|
@@ -2,8 +2,7 @@ import { JSON } from "../../..";
|
|
|
2
2
|
import { deserializeGenericArrayBody } from "./generic";
|
|
3
3
|
import { ensureArrayField } from "./shared";
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
@inline export function deserializeRawArrayField(
|
|
5
|
+
export function deserializeRawArrayField(
|
|
7
6
|
srcStart: usize,
|
|
8
7
|
srcEnd: usize,
|
|
9
8
|
fieldPtr: usize,
|
|
@@ -10,16 +10,12 @@ import {
|
|
|
10
10
|
import { isSpace } from "../../../util";
|
|
11
11
|
|
|
12
12
|
/** Advance past JSON whitespace (space, tab, LF, CR). */
|
|
13
|
-
|
|
14
|
-
@inline export function skipWhitespace(srcStart: usize, srcEnd: usize): usize {
|
|
13
|
+
export function skipWhitespace(srcStart: usize, srcEnd: usize): usize {
|
|
15
14
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
16
15
|
return srcStart;
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
@inline export function ensureArrayField<T extends Array<any>>(
|
|
21
|
-
fieldPtr: usize,
|
|
22
|
-
): T {
|
|
18
|
+
export function ensureArrayField<T extends Array<any>>(fieldPtr: usize): T {
|
|
23
19
|
let out = load<T>(fieldPtr);
|
|
24
20
|
if (!changetype<usize>(out)) {
|
|
25
21
|
out = changetype<T>(instantiate<T>());
|
|
@@ -28,8 +24,7 @@ import { isSpace } from "../../../util";
|
|
|
28
24
|
return out;
|
|
29
25
|
}
|
|
30
26
|
|
|
31
|
-
|
|
32
|
-
@inline export function ensureArrayFieldAt<T extends Array<any>>(
|
|
27
|
+
export function ensureArrayFieldAt<T extends Array<any>>(
|
|
33
28
|
dstObj: usize,
|
|
34
29
|
dstOffset: usize,
|
|
35
30
|
): T {
|
|
@@ -41,8 +36,7 @@ import { isSpace } from "../../../util";
|
|
|
41
36
|
return out;
|
|
42
37
|
}
|
|
43
38
|
|
|
44
|
-
|
|
45
|
-
@inline function backslashOrQuoteMask(block: u64): u64 {
|
|
39
|
+
function backslashOrQuoteMask(block: u64): u64 {
|
|
46
40
|
const b = block ^ 0x005c_005c_005c_005c;
|
|
47
41
|
const q = block ^ 0x0022_0022_0022_0022;
|
|
48
42
|
return (
|
|
@@ -51,8 +45,7 @@ import { isSpace } from "../../../util";
|
|
|
51
45
|
);
|
|
52
46
|
}
|
|
53
47
|
|
|
54
|
-
|
|
55
|
-
@inline export function ensureArrayElementSlot<T extends Array<any>>(
|
|
48
|
+
export function ensureArrayElementSlot<T extends Array<any>>(
|
|
56
49
|
out: T,
|
|
57
50
|
index: i32,
|
|
58
51
|
): usize {
|
|
@@ -60,7 +53,7 @@ import { isSpace } from "../../../util";
|
|
|
60
53
|
if (out.length < nextLength) {
|
|
61
54
|
// Grow via `push`, not `out.length = nextLength`. AS's `length=`
|
|
62
55
|
// setter calls `ensureCapacity(canGrow=false)` which reallocates to
|
|
63
|
-
// *exactly* the requested size
|
|
56
|
+
// *exactly* the requested size - fine for a one-shot resize, but
|
|
64
57
|
// catastrophic in the per-element loop (every push triggers a full
|
|
65
58
|
// copy of the array, giving O(N²) growth cost). `push` goes through
|
|
66
59
|
// `canGrow=true`, doubling capacity geometrically as needed.
|
|
@@ -77,16 +70,12 @@ import { isSpace } from "../../../util";
|
|
|
77
70
|
return out.dataStart + <usize>index * sizeof<valueof<T>>();
|
|
78
71
|
}
|
|
79
72
|
|
|
80
|
-
|
|
81
|
-
@inline export function scanQuotedValueEnd_SWAR(
|
|
82
|
-
srcStart: usize,
|
|
83
|
-
srcEnd: usize,
|
|
84
|
-
): usize {
|
|
73
|
+
export function scanQuotedValueEnd_SWAR(srcStart: usize, srcEnd: usize): usize {
|
|
85
74
|
srcStart += 2;
|
|
86
75
|
const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
|
|
87
76
|
|
|
88
77
|
while (srcStart <= srcEnd8) {
|
|
89
|
-
let mask =
|
|
78
|
+
let mask = backslashOrQuoteMask(load<u64>(srcStart));
|
|
90
79
|
if (mask === 0) {
|
|
91
80
|
srcStart += 8;
|
|
92
81
|
continue;
|
|
@@ -114,8 +103,7 @@ import { isSpace } from "../../../util";
|
|
|
114
103
|
return 0;
|
|
115
104
|
}
|
|
116
105
|
|
|
117
|
-
|
|
118
|
-
@inline export function scanValueEnd(srcStart: usize, srcEnd: usize): usize {
|
|
106
|
+
export function scanValueEnd<T = usize>(srcStart: usize, srcEnd: usize): usize {
|
|
119
107
|
if (srcStart >= srcEnd) return 0;
|
|
120
108
|
const first = load<u16>(srcStart);
|
|
121
109
|
|
|
@@ -8,17 +8,12 @@ import { isSpace } from "../../../util";
|
|
|
8
8
|
import { ensureArrayElementSlot, ensureArrayField } from "./shared";
|
|
9
9
|
import { deserializeStringField_SWAR } from "../string";
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
@inline function skipStringArrayWhitespace(
|
|
13
|
-
srcStart: usize,
|
|
14
|
-
srcEnd: usize,
|
|
15
|
-
): usize {
|
|
11
|
+
function skipStringArrayWhitespace(srcStart: usize, srcEnd: usize): usize {
|
|
16
12
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
17
13
|
return srcStart;
|
|
18
14
|
}
|
|
19
15
|
|
|
20
|
-
|
|
21
|
-
@inline function deserializeStringArrayBody<T extends string[]>(
|
|
16
|
+
function deserializeStringArrayBody<T extends string[]>(
|
|
22
17
|
srcStart: usize,
|
|
23
18
|
srcEnd: usize,
|
|
24
19
|
out: T,
|
|
@@ -42,7 +37,7 @@ import { deserializeStringField_SWAR } from "../string";
|
|
|
42
37
|
// and skip 8 bytes.
|
|
43
38
|
//
|
|
44
39
|
// We accept null tokens unconditionally rather than gating on
|
|
45
|
-
// `isNullable<valueof<T>>()`
|
|
40
|
+
// `isNullable<valueof<T>>()` - AS's `valueof` of a nullable-array
|
|
46
41
|
// element type doesn't always preserve the nullable marker through
|
|
47
42
|
// the dispatcher's `<T>` cast, so the gate would mis-fire for the
|
|
48
43
|
// very case it's meant to handle. The runtime cost on plain
|
|
@@ -81,8 +76,7 @@ import { deserializeStringField_SWAR } from "../string";
|
|
|
81
76
|
throw new Error("Failed to parse JSON!");
|
|
82
77
|
}
|
|
83
78
|
|
|
84
|
-
|
|
85
|
-
@inline export function deserializeStringArrayField<T extends string[]>(
|
|
79
|
+
export function deserializeStringArrayField<T extends string[]>(
|
|
86
80
|
srcStart: usize,
|
|
87
81
|
srcEnd: usize,
|
|
88
82
|
fieldPtr: usize,
|
|
@@ -2,11 +2,7 @@ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
|
|
|
2
2
|
import { isSpace } from "../../../util";
|
|
3
3
|
import { ensureArrayElementSlot, ensureArrayField } from "./shared";
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
@inline function skipStructArrayWhitespace(
|
|
7
|
-
srcStart: usize,
|
|
8
|
-
srcEnd: usize,
|
|
9
|
-
): usize {
|
|
5
|
+
function skipStructArrayWhitespace(srcStart: usize, srcEnd: usize): usize {
|
|
10
6
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
11
7
|
return srcStart;
|
|
12
8
|
}
|
|
@@ -26,7 +22,7 @@ import { ensureArrayElementSlot, ensureArrayField } from "./shared";
|
|
|
26
22
|
// - Whitespace is skipped at each separator boundary so struct-array
|
|
27
23
|
// fields tolerate the same `[ {...} , {...} ]` shape that top-level
|
|
28
24
|
// `JSON.parse` does.
|
|
29
|
-
|
|
25
|
+
function deserializeStructArrayBody<T extends unknown[]>(
|
|
30
26
|
srcStart: usize,
|
|
31
27
|
srcEnd: usize,
|
|
32
28
|
out: T,
|
|
@@ -100,9 +96,7 @@ import { ensureArrayElementSlot, ensureArrayField } from "./shared";
|
|
|
100
96
|
|
|
101
97
|
throw new Error("Failed to parse JSON!");
|
|
102
98
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
@inline export function deserializeStructArrayField<T extends unknown[]>(
|
|
99
|
+
export function deserializeStructArrayField<T extends unknown[]>(
|
|
106
100
|
srcStart: usize,
|
|
107
101
|
srcEnd: usize,
|
|
108
102
|
fieldPtr: usize,
|
|
@@ -13,9 +13,7 @@ import { deserializeStringArrayField } from "./array/string";
|
|
|
13
13
|
import { deserializeStructArrayField } from "./array/struct";
|
|
14
14
|
|
|
15
15
|
export { deserializeArrayField as deserializeArrayField_SWAR };
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@inline export function deserializeArrayField<T extends unknown[]>(
|
|
16
|
+
export function deserializeArrayField<T extends unknown[]>(
|
|
19
17
|
srcStart: usize,
|
|
20
18
|
srcEnd: usize,
|
|
21
19
|
dstObj: usize,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
//
|
|
13
13
|
// Inspired by Daniel Lemire, "Number parsing at a gigabyte per second" (2021)
|
|
14
14
|
// and the simdjson `fast_float` implementation. The integer-part loop stays
|
|
15
|
-
// scalar
|
|
15
|
+
// scalar - most JSON float payloads have 1-3 digit integer parts, so a parse4
|
|
16
16
|
// stride there pays the wasted-validate cost on every call without saving
|
|
17
17
|
// enough scalar iterations.
|
|
18
18
|
|
|
@@ -34,14 +34,11 @@ const ASCII_DOT: u16 = 46;
|
|
|
34
34
|
const ASCII_ZERO: u16 = 48;
|
|
35
35
|
const ASCII_E_UP: u16 = 69;
|
|
36
36
|
const ASCII_E_LO: u16 = 101;
|
|
37
|
-
|
|
38
|
-
// @ts-ignore: inline
|
|
39
|
-
@inline export function loadPow10(exp: u32): f64 {
|
|
37
|
+
export function loadPow10(exp: u32): f64 {
|
|
40
38
|
return load<f64>(POW10_F64_POS + ((<usize>exp) << 3));
|
|
41
39
|
}
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
@inline function fallback<T>(srcStart: usize, srcEnd: usize): T {
|
|
41
|
+
function fallback<T>(srcStart: usize, srcEnd: usize): T {
|
|
45
42
|
const s = ptrToStr(srcStart, srcEnd);
|
|
46
43
|
// @ts-ignore
|
|
47
44
|
const type: T = 0;
|
|
@@ -50,9 +47,7 @@ const ASCII_E_LO: u16 = 101;
|
|
|
50
47
|
// @ts-ignore
|
|
51
48
|
return <T>(<f32>f32.parse(s));
|
|
52
49
|
}
|
|
53
|
-
|
|
54
|
-
// @ts-ignore: inline
|
|
55
|
-
@inline function fallbackField<T extends number>(
|
|
50
|
+
function fallbackField<T extends number>(
|
|
56
51
|
origStart: usize,
|
|
57
52
|
end: usize,
|
|
58
53
|
fieldPtr: usize,
|
|
@@ -65,11 +60,7 @@ const ASCII_E_LO: u16 = 101;
|
|
|
65
60
|
}
|
|
66
61
|
}
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
@inline export function deserializeFloat_SWAR<T>(
|
|
70
|
-
srcStart: usize,
|
|
71
|
-
srcEnd: usize,
|
|
72
|
-
): T {
|
|
63
|
+
export function deserializeFloat_SWAR<T>(srcStart: usize, srcEnd: usize): T {
|
|
73
64
|
const origStart = srcStart;
|
|
74
65
|
let p = srcStart;
|
|
75
66
|
let negative = false;
|
|
@@ -98,7 +89,7 @@ const ASCII_E_LO: u16 = 101;
|
|
|
98
89
|
if (p < srcEnd && load<u16>(p) == ASCII_DOT) {
|
|
99
90
|
p += 2;
|
|
100
91
|
while (p + 6 < srcEnd) {
|
|
101
|
-
const parsed =
|
|
92
|
+
const parsed = parse4Digits_PairMul(load<u64>(p));
|
|
102
93
|
if (parsed == U32.MAX_VALUE) break;
|
|
103
94
|
mantissa = mantissa * 10_000 + <u64>parsed;
|
|
104
95
|
fracDigits += 4;
|
|
@@ -181,8 +172,7 @@ const ASCII_E_LO: u16 = 101;
|
|
|
181
172
|
return <T>(<f32>result);
|
|
182
173
|
}
|
|
183
174
|
|
|
184
|
-
|
|
185
|
-
@inline export function deserializeFloatField_SWAR<T extends number>(
|
|
175
|
+
export function deserializeFloatField_SWAR<T extends number>(
|
|
186
176
|
srcStart: usize,
|
|
187
177
|
srcEnd: usize,
|
|
188
178
|
dstObj: usize,
|
|
@@ -40,11 +40,7 @@ const ASCII_ZERO: u16 = 48;
|
|
|
40
40
|
* @param value The `u64` accumulator, interpreted as a two's-complement
|
|
41
41
|
* signed integer for narrower types.
|
|
42
42
|
*/
|
|
43
|
-
|
|
44
|
-
@inline function storeSignedToField<T extends number>(
|
|
45
|
-
dstPtr: usize,
|
|
46
|
-
value: u64,
|
|
47
|
-
): void {
|
|
43
|
+
function storeSignedToField<T extends number>(dstPtr: usize, value: u64): void {
|
|
48
44
|
if (sizeof<T>() == 1) {
|
|
49
45
|
store<i8>(dstPtr, <i8>value);
|
|
50
46
|
} else if (sizeof<T>() == 2) {
|
|
@@ -63,8 +59,7 @@ const ASCII_ZERO: u16 = 48;
|
|
|
63
59
|
* @param dstPtr Destination pointer (already includes any field offset).
|
|
64
60
|
* @param value The `u64` accumulator.
|
|
65
61
|
*/
|
|
66
|
-
|
|
67
|
-
@inline function storeUnsignedToField<T extends number>(
|
|
62
|
+
function storeUnsignedToField<T extends number>(
|
|
68
63
|
dstPtr: usize,
|
|
69
64
|
value: u64,
|
|
70
65
|
): void {
|
|
@@ -90,8 +85,7 @@ const ASCII_ZERO: u16 = 48;
|
|
|
90
85
|
* @param srcEnd Pointer just past the last code unit.
|
|
91
86
|
* @returns The parsed value, two's-complement truncated to `T`.
|
|
92
87
|
*/
|
|
93
|
-
|
|
94
|
-
@inline export function deserializeInteger_SWAR<T extends number>(
|
|
88
|
+
export function deserializeInteger_SWAR<T extends number>(
|
|
95
89
|
srcStart: usize,
|
|
96
90
|
srcEnd: usize,
|
|
97
91
|
): T {
|
|
@@ -137,8 +131,7 @@ const ASCII_ZERO: u16 = 48;
|
|
|
137
131
|
* @param dstOffset Byte offset of the field within `dstObj`.
|
|
138
132
|
* @returns The source position immediately after the last digit consumed.
|
|
139
133
|
*/
|
|
140
|
-
|
|
141
|
-
@inline export function deserializeIntegerField_SWAR<T extends number>(
|
|
134
|
+
export function deserializeIntegerField_SWAR<T extends number>(
|
|
142
135
|
srcStart: usize,
|
|
143
136
|
srcEnd: usize,
|
|
144
137
|
dstObj: usize,
|
|
@@ -178,8 +171,7 @@ const ASCII_ZERO: u16 = 48;
|
|
|
178
171
|
* @param srcEnd Pointer just past the last code unit.
|
|
179
172
|
* @returns The parsed value, truncated to `T`.
|
|
180
173
|
*/
|
|
181
|
-
|
|
182
|
-
@inline export function deserializeUnsigned_SWAR<T extends number>(
|
|
174
|
+
export function deserializeUnsigned_SWAR<T extends number>(
|
|
183
175
|
srcStart: usize,
|
|
184
176
|
srcEnd: usize,
|
|
185
177
|
): T {
|
|
@@ -217,8 +209,7 @@ const ASCII_ZERO: u16 = 48;
|
|
|
217
209
|
* @param dstOffset Byte offset of the field within `dstObj`.
|
|
218
210
|
* @returns The source position immediately after the last digit consumed.
|
|
219
211
|
*/
|
|
220
|
-
|
|
221
|
-
@inline export function deserializeUnsignedField_SWAR<T extends number>(
|
|
212
|
+
export function deserializeUnsignedField_SWAR<T extends number>(
|
|
222
213
|
srcStart: usize,
|
|
223
214
|
srcEnd: usize,
|
|
224
215
|
dstObj: usize,
|