json-as 1.3.7 → 1.3.9
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 +36 -0
- package/README.md +1 -1
- package/assembly/deserialize/index/arbitrary.ts +2 -2
- package/assembly/deserialize/index/array.ts +29 -14
- package/assembly/deserialize/index/bool.ts +1 -1
- package/assembly/deserialize/index/date.ts +1 -1
- package/assembly/deserialize/index/float.ts +40 -1
- package/assembly/deserialize/index/integer.ts +3 -3
- package/assembly/deserialize/index/map.ts +1 -1
- package/assembly/deserialize/index/object.ts +1 -1
- package/assembly/deserialize/index/raw.ts +1 -1
- package/assembly/deserialize/index/set.ts +1 -1
- package/assembly/deserialize/index/staticarray.ts +4 -1
- package/assembly/deserialize/index/string.ts +28 -3
- package/assembly/deserialize/index/struct.ts +1 -1
- package/assembly/deserialize/index/typedarray.ts +25 -15
- package/assembly/deserialize/index/unsigned.ts +3 -3
- package/assembly/deserialize/index.ts +1 -0
- package/assembly/deserialize/naive/array/bool.ts +68 -0
- package/assembly/deserialize/naive/array/float.ts +63 -0
- package/assembly/deserialize/{simple → naive}/array/generic.ts +1 -2
- package/assembly/deserialize/naive/array/integer.ts +86 -0
- package/assembly/deserialize/{simple → naive}/array/map.ts +0 -1
- package/assembly/deserialize/{simple → naive}/array/object.ts +0 -1
- package/assembly/deserialize/naive/array/string.ts +69 -0
- package/assembly/deserialize/{simple → naive}/array/struct.ts +0 -1
- package/assembly/deserialize/{simple → naive}/array.ts +6 -11
- package/assembly/deserialize/naive/float.ts +135 -0
- package/assembly/deserialize/{simple → naive}/integer.ts +2 -2
- package/assembly/deserialize/{simple → naive}/map.ts +12 -6
- package/assembly/deserialize/{simple → naive}/object.ts +4 -7
- package/assembly/deserialize/{simple → naive}/set.ts +12 -27
- package/assembly/deserialize/{simple → naive}/staticarray/array.ts +1 -1
- package/assembly/deserialize/{simple → naive}/staticarray/bool.ts +1 -1
- package/assembly/deserialize/{simple → naive}/staticarray/float.ts +1 -1
- package/assembly/deserialize/{simple → naive}/staticarray/integer.ts +1 -1
- package/assembly/deserialize/{simple → naive}/staticarray/struct.ts +1 -2
- package/assembly/deserialize/{simple → naive}/staticarray.ts +4 -4
- package/assembly/deserialize/naive/string.ts +199 -0
- package/assembly/deserialize/{simple → naive}/typedarray.ts +4 -4
- package/assembly/deserialize/{simple → naive}/unsigned.ts +2 -2
- package/assembly/deserialize/simd/array/integer.ts +19 -19
- package/assembly/deserialize/simd/float.ts +303 -0
- package/assembly/deserialize/simd/string.ts +233 -108
- package/assembly/deserialize/swar/array/arbitrary.ts +6 -2
- package/assembly/deserialize/swar/array/array.ts +14 -7
- package/assembly/deserialize/swar/array/bool.ts +8 -3
- package/assembly/deserialize/swar/array/box.ts +6 -2
- package/assembly/deserialize/swar/array/float.ts +282 -6
- package/assembly/deserialize/swar/array/generic.ts +6 -2
- package/assembly/deserialize/swar/array/integer.ts +81 -74
- package/assembly/deserialize/swar/array/map.ts +6 -2
- package/assembly/deserialize/swar/array/object.ts +24 -32
- package/assembly/deserialize/swar/array/raw.ts +6 -2
- package/assembly/deserialize/swar/array/shared.ts +32 -8
- package/assembly/deserialize/swar/array/string.ts +127 -10
- package/assembly/deserialize/swar/array/struct.ts +45 -11
- package/assembly/deserialize/swar/array.ts +2 -56
- package/assembly/deserialize/swar/float.ts +304 -0
- package/assembly/deserialize/swar/string.ts +119 -104
- package/assembly/deserialize/swar/typedarray.ts +224 -0
- package/assembly/index.ts +203 -293
- package/assembly/serialize/index/array.ts +1 -1
- package/assembly/serialize/index/bool.ts +1 -1
- package/assembly/serialize/index/date.ts +1 -1
- package/assembly/serialize/index/float.ts +1 -1
- package/assembly/serialize/index/integer.ts +1 -1
- package/assembly/serialize/index/map.ts +1 -1
- package/assembly/serialize/index/raw.ts +1 -1
- package/assembly/serialize/index/set.ts +1 -1
- package/assembly/serialize/index/staticarray.ts +1 -1
- package/assembly/serialize/index/string.ts +1 -1
- package/assembly/serialize/index/struct.ts +1 -1
- package/assembly/serialize/index/typedarray.ts +2 -11
- package/assembly/serialize/index.ts +1 -0
- package/assembly/serialize/{simple → naive}/array.ts +87 -0
- package/assembly/serialize/{simple → naive}/string.ts +1 -1
- package/assembly/serialize/swar/string.ts +0 -139
- package/assembly/util/dragonbox.ts +10 -3
- package/assembly/util/itoa-fast.ts +29 -18
- package/assembly/util/scanValueEnd.ts +78 -0
- package/assembly/util/scientific.ts +132 -0
- package/lib/as-bs.ts +14 -1
- package/package.json +14 -13
- package/transform/lib/index.d.ts +4 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +155 -238
- package/transform/lib/index.js.map +1 -1
- package/assembly/deserialize/simple/arbitrary.ts +0 -30
- package/assembly/deserialize/simple/array/bool.ts +0 -48
- package/assembly/deserialize/simple/array/float.ts +0 -55
- package/assembly/deserialize/simple/array/integer.ts +0 -33
- package/assembly/deserialize/simple/array/string.ts +0 -29
- package/assembly/deserialize/simple/float.ts +0 -206
- package/assembly/deserialize/simple/string.ts +0 -45
- package/assembly/serialize/simple/arbitrary.ts +0 -79
- package/assembly/serialize/simple/object.ts +0 -42
- /package/assembly/deserialize/{simple → naive}/array/arbitrary.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/array/array.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/array/box.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/array/raw.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/bool.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/date.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/raw.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/staticarray/string.ts +0 -0
- /package/assembly/deserialize/{simple → naive}/struct.ts +0 -0
- /package/assembly/serialize/{simple → naive}/bool.ts +0 -0
- /package/assembly/serialize/{simple → naive}/date.ts +0 -0
- /package/assembly/serialize/{simple → naive}/float.ts +0 -0
- /package/assembly/serialize/{simple → naive}/integer.ts +0 -0
- /package/assembly/serialize/{simple → naive}/map.ts +0 -0
- /package/assembly/serialize/{simple → naive}/raw.ts +0 -0
- /package/assembly/serialize/{simple → naive}/set.ts +0 -0
- /package/assembly/serialize/{simple → naive}/staticarray.ts +0 -0
- /package/assembly/serialize/{simple → naive}/struct.ts +0 -0
- /package/assembly/serialize/{simple → naive}/typedarray.ts +0 -0
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { isSpace } from "../../../util";
|
|
2
|
-
import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
|
|
3
|
-
import { JSON } from "../../..";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Float-array deserializer (`f64[]` / `f32[]`).
|
|
7
|
-
*
|
|
8
|
-
* Worst-case sizing: every element is at least `D,` = 2 UTF-16 chars = 4
|
|
9
|
-
* bytes (a single-digit value followed by `,` or `]`). The `srcLen >> 2`
|
|
10
|
-
* upper bound holds even for valid JSON containing negative or fractional
|
|
11
|
-
* widths, because each element advance still consumes >= 4 bytes.
|
|
12
|
-
*
|
|
13
|
-
* f64/f32 are unmanaged so AS skips zero-fill on `length=`. The parse loop
|
|
14
|
-
* writes through a direct `writePtr` pointer, eliminating `Array.push`'s
|
|
15
|
-
* per-element capacity check + length write. Final `out.length` is trimmed
|
|
16
|
-
* to the actual element count.
|
|
17
|
-
*/
|
|
18
|
-
export function deserializeFloatArray<T extends number[]>(
|
|
19
|
-
srcStart: usize,
|
|
20
|
-
srcEnd: usize,
|
|
21
|
-
dst: usize,
|
|
22
|
-
): T {
|
|
23
|
-
const out = changetype<nonnull<T>>(
|
|
24
|
-
dst || changetype<usize>(instantiate<T>()),
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
const elementSize = sizeof<valueof<T>>();
|
|
28
|
-
const maxElements = i32((<usize>(srcEnd - srcStart)) >> 2);
|
|
29
|
-
if (maxElements > 0) out.length = maxElements;
|
|
30
|
-
const dataStart = out.dataStart;
|
|
31
|
-
let writePtr = dataStart;
|
|
32
|
-
|
|
33
|
-
let lastIndex: usize = 0;
|
|
34
|
-
while (srcStart < srcEnd) {
|
|
35
|
-
const code = load<u16>(srcStart);
|
|
36
|
-
if (<u32>code - 48 <= 9 || code == 45) {
|
|
37
|
-
lastIndex = srcStart;
|
|
38
|
-
srcStart += 2;
|
|
39
|
-
while (srcStart < srcEnd) {
|
|
40
|
-
const c = load<u16>(srcStart);
|
|
41
|
-
if (c == COMMA || c == BRACKET_RIGHT || isSpace(c)) {
|
|
42
|
-
const value = JSON.__deserialize<valueof<T>>(lastIndex, srcStart);
|
|
43
|
-
store<valueof<T>>(writePtr, value);
|
|
44
|
-
writePtr += elementSize;
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
srcStart += 2;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
srcStart += 2;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
out.length = i32(<usize>(writePtr - dataStart) / elementSize);
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { atoi, isSpace } from "../../../util";
|
|
2
|
-
import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
|
|
3
|
-
|
|
4
|
-
export function deserializeIntegerArray<T extends number[]>(
|
|
5
|
-
srcStart: usize,
|
|
6
|
-
srcEnd: usize,
|
|
7
|
-
dst: usize,
|
|
8
|
-
): T {
|
|
9
|
-
const out = changetype<nonnull<T>>(
|
|
10
|
-
dst || changetype<usize>(instantiate<T>()),
|
|
11
|
-
);
|
|
12
|
-
let lastIndex: usize = 0;
|
|
13
|
-
while (srcStart < srcEnd) {
|
|
14
|
-
const code = load<u16>(srcStart);
|
|
15
|
-
if (code - 48 <= 9 || code == 45) {
|
|
16
|
-
lastIndex = srcStart;
|
|
17
|
-
srcStart += 2;
|
|
18
|
-
while (srcStart < srcEnd) {
|
|
19
|
-
const code = load<u16>(srcStart);
|
|
20
|
-
if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) {
|
|
21
|
-
out.push(atoi<valueof<T>>(lastIndex, srcStart));
|
|
22
|
-
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
23
|
-
// /* empty */
|
|
24
|
-
// }
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
srcStart += 2;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
srcStart += 2;
|
|
31
|
-
}
|
|
32
|
-
return out;
|
|
33
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { JSON } from "../../..";
|
|
2
|
-
import { QUOTE } from "../../../custom/chars";
|
|
3
|
-
import { isUnescapedQuote } from "../../../util";
|
|
4
|
-
|
|
5
|
-
export function deserializeStringArray(
|
|
6
|
-
srcStart: usize,
|
|
7
|
-
srcEnd: usize,
|
|
8
|
-
dst: usize,
|
|
9
|
-
): string[] {
|
|
10
|
-
const out = changetype<string[]>(
|
|
11
|
-
dst || changetype<usize>(instantiate<string[]>()),
|
|
12
|
-
);
|
|
13
|
-
let lastPos: usize = 2;
|
|
14
|
-
let inString = false;
|
|
15
|
-
while (srcStart < srcEnd) {
|
|
16
|
-
const code = load<u16>(srcStart);
|
|
17
|
-
if (code == QUOTE) {
|
|
18
|
-
if (!inString) {
|
|
19
|
-
inString = true;
|
|
20
|
-
lastPos = srcStart;
|
|
21
|
-
} else if (isUnescapedQuote(srcStart)) {
|
|
22
|
-
out.push(JSON.__deserialize<string>(lastPos, srcStart + 2));
|
|
23
|
-
inString = false;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
srcStart += 2;
|
|
27
|
-
}
|
|
28
|
-
return out;
|
|
29
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { ptrToStr } from "../../util/ptrToStr";
|
|
2
|
-
|
|
3
|
-
// @ts-ignore: inline
|
|
4
|
-
@inline function pow10Fast(exponent: u32): f64 {
|
|
5
|
-
if (exponent == 0) return 1.0;
|
|
6
|
-
if (exponent == 1) return 10.0;
|
|
7
|
-
if (exponent == 2) return 100.0;
|
|
8
|
-
if (exponent == 3) return 1e3;
|
|
9
|
-
if (exponent == 4) return 1e4;
|
|
10
|
-
if (exponent == 5) return 1e5;
|
|
11
|
-
if (exponent == 6) return 1e6;
|
|
12
|
-
if (exponent == 7) return 1e7;
|
|
13
|
-
if (exponent == 8) return 1e8;
|
|
14
|
-
if (exponent == 9) return 1e9;
|
|
15
|
-
if (exponent == 10) return 1e10;
|
|
16
|
-
if (exponent == 11) return 1e11;
|
|
17
|
-
if (exponent == 12) return 1e12;
|
|
18
|
-
if (exponent == 13) return 1e13;
|
|
19
|
-
if (exponent == 14) return 1e14;
|
|
20
|
-
if (exponent == 15) return 1e15;
|
|
21
|
-
if (exponent == 16) return 1e16;
|
|
22
|
-
if (exponent == 17) return 1e17;
|
|
23
|
-
if (exponent == 18) return 1e18;
|
|
24
|
-
let result = 1.0;
|
|
25
|
-
if (exponent & 1) result *= 1e1;
|
|
26
|
-
if (exponent & 2) result *= 1e2;
|
|
27
|
-
if (exponent & 4) result *= 1e4;
|
|
28
|
-
if (exponent & 8) result *= 1e8;
|
|
29
|
-
if (exponent & 16) result *= 1e16;
|
|
30
|
-
if (exponent & 32) result *= 1e32;
|
|
31
|
-
if (exponent & 64) result *= 1e64;
|
|
32
|
-
if (exponent & 128) result *= 1e128;
|
|
33
|
-
if (exponent & 256) result *= 1e256;
|
|
34
|
-
return result;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// @ts-ignore: inline
|
|
38
|
-
@inline export function deserializeFloat<T>(srcStart: usize, srcEnd: usize): T {
|
|
39
|
-
let negative = false;
|
|
40
|
-
if (load<u16>(srcStart) == 45) {
|
|
41
|
-
negative = true;
|
|
42
|
-
srcStart += 2;
|
|
43
|
-
if (srcStart >= srcEnd) unreachable();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let value: f64 = 0.0;
|
|
47
|
-
let seenDigit = false;
|
|
48
|
-
|
|
49
|
-
while (srcStart < srcEnd) {
|
|
50
|
-
const digit = <u32>load<u16>(srcStart) - 48;
|
|
51
|
-
if (digit > 9) break;
|
|
52
|
-
value = value * 10.0 + <f64>digit;
|
|
53
|
-
seenDigit = true;
|
|
54
|
-
srcStart += 2;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (srcStart < srcEnd && load<u16>(srcStart) == 46) {
|
|
58
|
-
srcStart += 2;
|
|
59
|
-
let fraction: u64 = 0;
|
|
60
|
-
let digits: u32 = 0;
|
|
61
|
-
while (srcStart < srcEnd) {
|
|
62
|
-
const digit = <u32>load<u16>(srcStart) - 48;
|
|
63
|
-
if (digit > 9) break;
|
|
64
|
-
fraction = fraction * 10 + digit;
|
|
65
|
-
digits += 1;
|
|
66
|
-
seenDigit = true;
|
|
67
|
-
srcStart += 2;
|
|
68
|
-
}
|
|
69
|
-
if (digits != 0) value += <f64>fraction / pow10Fast(digits);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (!seenDigit) {
|
|
73
|
-
// @ts-ignore
|
|
74
|
-
const type: T = 0;
|
|
75
|
-
// @ts-ignore
|
|
76
|
-
if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd));
|
|
77
|
-
// @ts-ignore
|
|
78
|
-
return f32.parse(ptrToStr(srcStart, srcEnd));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (srcStart < srcEnd) {
|
|
82
|
-
const code = load<u16>(srcStart);
|
|
83
|
-
if (code == 101 || code == 69) {
|
|
84
|
-
srcStart += 2;
|
|
85
|
-
if (srcStart >= srcEnd) unreachable();
|
|
86
|
-
|
|
87
|
-
let exponentNegative = false;
|
|
88
|
-
let exponentCode = load<u16>(srcStart);
|
|
89
|
-
if (exponentCode == 45 || exponentCode == 43) {
|
|
90
|
-
exponentNegative = exponentCode == 45;
|
|
91
|
-
srcStart += 2;
|
|
92
|
-
if (srcStart >= srcEnd) unreachable();
|
|
93
|
-
exponentCode = load<u16>(srcStart);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
let exponent = <u32>exponentCode - 48;
|
|
97
|
-
if (exponent > 9) unreachable();
|
|
98
|
-
srcStart += 2;
|
|
99
|
-
while (srcStart < srcEnd) {
|
|
100
|
-
const digit = <u32>load<u16>(srcStart) - 48;
|
|
101
|
-
if (digit > 9) break;
|
|
102
|
-
exponent = exponent * 10 + digit;
|
|
103
|
-
srcStart += 2;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const power = pow10Fast(exponent);
|
|
107
|
-
value = exponentNegative ? value / power : value * power;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (negative) value = -value;
|
|
112
|
-
|
|
113
|
-
// @ts-ignore
|
|
114
|
-
const type: T = 0;
|
|
115
|
-
// @ts-ignore
|
|
116
|
-
if (type instanceof f64) return <T>value;
|
|
117
|
-
// @ts-ignore
|
|
118
|
-
return <T>(<f32>value);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// @ts-ignore: inline
|
|
122
|
-
@inline export function deserializeFloatField<T extends number>(
|
|
123
|
-
srcStart: usize,
|
|
124
|
-
srcEnd: usize,
|
|
125
|
-
dstObj: usize,
|
|
126
|
-
dstOffset: usize = 0,
|
|
127
|
-
): usize {
|
|
128
|
-
const fieldPtr = dstObj + dstOffset;
|
|
129
|
-
let negative = false;
|
|
130
|
-
if (load<u16>(srcStart) == 45) {
|
|
131
|
-
negative = true;
|
|
132
|
-
srcStart += 2;
|
|
133
|
-
if (srcStart >= srcEnd) unreachable();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
let value: f64 = 0.0;
|
|
137
|
-
let seenDigit = false;
|
|
138
|
-
|
|
139
|
-
while (srcStart < srcEnd) {
|
|
140
|
-
const code = load<u16>(srcStart);
|
|
141
|
-
const digit = <u32>code - 48;
|
|
142
|
-
if (digit > 9) break;
|
|
143
|
-
value = value * 10.0 + <f64>digit;
|
|
144
|
-
seenDigit = true;
|
|
145
|
-
srcStart += 2;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (srcStart < srcEnd && load<u16>(srcStart) == 46) {
|
|
149
|
-
srcStart += 2;
|
|
150
|
-
let fraction: u64 = 0;
|
|
151
|
-
let digits: u32 = 0;
|
|
152
|
-
while (srcStart < srcEnd) {
|
|
153
|
-
const code = load<u16>(srcStart);
|
|
154
|
-
const digit = <u32>code - 48;
|
|
155
|
-
if (digit > 9) break;
|
|
156
|
-
fraction = fraction * 10 + digit;
|
|
157
|
-
digits += 1;
|
|
158
|
-
seenDigit = true;
|
|
159
|
-
srcStart += 2;
|
|
160
|
-
}
|
|
161
|
-
if (digits != 0) value += <f64>fraction / pow10Fast(digits);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (!seenDigit) unreachable();
|
|
165
|
-
|
|
166
|
-
if (srcStart < srcEnd) {
|
|
167
|
-
const code = load<u16>(srcStart);
|
|
168
|
-
if (code == 101 || code == 69) {
|
|
169
|
-
srcStart += 2;
|
|
170
|
-
if (srcStart >= srcEnd) unreachable();
|
|
171
|
-
|
|
172
|
-
let exponentNegative = false;
|
|
173
|
-
let exponentCode = load<u16>(srcStart);
|
|
174
|
-
if (exponentCode == 45 || exponentCode == 43) {
|
|
175
|
-
exponentNegative = exponentCode == 45;
|
|
176
|
-
srcStart += 2;
|
|
177
|
-
if (srcStart >= srcEnd) unreachable();
|
|
178
|
-
exponentCode = load<u16>(srcStart);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
let exponent = <u32>exponentCode - 48;
|
|
182
|
-
if (exponent > 9) unreachable();
|
|
183
|
-
srcStart += 2;
|
|
184
|
-
while (srcStart < srcEnd) {
|
|
185
|
-
const code = load<u16>(srcStart);
|
|
186
|
-
const digit = <u32>code - 48;
|
|
187
|
-
if (digit > 9) break;
|
|
188
|
-
exponent = exponent * 10 + digit;
|
|
189
|
-
srcStart += 2;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const power = pow10Fast(exponent);
|
|
193
|
-
value = exponentNegative ? value / power : value * power;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (negative) value = -value;
|
|
198
|
-
|
|
199
|
-
if (sizeof<T>() == sizeof<f32>()) {
|
|
200
|
-
store<f32>(fieldPtr, <f32>value);
|
|
201
|
-
} else {
|
|
202
|
-
store<f64>(fieldPtr, value);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return srcStart;
|
|
206
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { bs } from "../../../lib/as-bs";
|
|
2
|
-
import { DESERIALIZE_ESCAPE_TABLE } from "../../globals/tables";
|
|
3
|
-
import { hex4_to_u16_swar } from "../../util/swar";
|
|
4
|
-
|
|
5
|
-
// @ts-ignore: inline
|
|
6
|
-
@inline export function deserializeString(
|
|
7
|
-
srcStart: usize,
|
|
8
|
-
srcEnd: usize,
|
|
9
|
-
): string {
|
|
10
|
-
// Strip quotes
|
|
11
|
-
srcStart += 2;
|
|
12
|
-
srcEnd -= 2;
|
|
13
|
-
const outStart = bs.offset - bs.buffer;
|
|
14
|
-
bs.ensureSize(u32(srcEnd - srcStart));
|
|
15
|
-
|
|
16
|
-
while (srcStart < srcEnd) {
|
|
17
|
-
const block = load<u16>(srcStart);
|
|
18
|
-
store<u16>(bs.offset, block);
|
|
19
|
-
srcStart += 2;
|
|
20
|
-
|
|
21
|
-
// Early exit
|
|
22
|
-
if (block !== 0x5c) {
|
|
23
|
-
bs.offset += 2;
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const code = load<u16>(srcStart);
|
|
28
|
-
if (code !== 0x75) {
|
|
29
|
-
// Short escapes (\n \t \" \\)
|
|
30
|
-
const block = load<u16>(srcStart);
|
|
31
|
-
const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
|
|
32
|
-
store<u16>(bs.offset, escape);
|
|
33
|
-
srcStart += 2;
|
|
34
|
-
} else {
|
|
35
|
-
// Unicode escape (\uXXXX)
|
|
36
|
-
const block = load<u64>(srcStart, 2); // XXXX
|
|
37
|
-
const escaped = hex4_to_u16_swar(block);
|
|
38
|
-
store<u16>(bs.offset, escaped);
|
|
39
|
-
srcStart += 10;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
bs.offset += 2;
|
|
43
|
-
}
|
|
44
|
-
return bs.sliceOut<string>(outStart);
|
|
45
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { JSON } from "../..";
|
|
2
|
-
import { bs } from "../../../lib/as-bs";
|
|
3
|
-
import { serializeArray } from "./array";
|
|
4
|
-
import { serializeBool } from "./bool";
|
|
5
|
-
import { serializeFloat32, serializeFloat64 } from "./float";
|
|
6
|
-
import { serializeInteger } from "./integer";
|
|
7
|
-
import { serializeMap } from "./map";
|
|
8
|
-
import { serializeObject } from "./object";
|
|
9
|
-
import { serializeString } from "./string";
|
|
10
|
-
import { serializeDynamic } from "../index/typedarray";
|
|
11
|
-
|
|
12
|
-
export function serializeArbitrary(src: JSON.Value): void {
|
|
13
|
-
switch (src.type) {
|
|
14
|
-
case JSON.Types.Null:
|
|
15
|
-
bs.proposeSize(8);
|
|
16
|
-
store<u64>(bs.offset, 30399761348886638);
|
|
17
|
-
bs.offset += 8;
|
|
18
|
-
break;
|
|
19
|
-
case JSON.Types.U8:
|
|
20
|
-
serializeInteger<u8>(src.get<u8>());
|
|
21
|
-
break;
|
|
22
|
-
case JSON.Types.U16:
|
|
23
|
-
serializeInteger<u16>(src.get<u16>());
|
|
24
|
-
break;
|
|
25
|
-
case JSON.Types.U32:
|
|
26
|
-
serializeInteger<u32>(src.get<u32>());
|
|
27
|
-
break;
|
|
28
|
-
case JSON.Types.U64:
|
|
29
|
-
serializeInteger<u64>(src.get<u64>());
|
|
30
|
-
break;
|
|
31
|
-
case JSON.Types.I8:
|
|
32
|
-
serializeInteger<i8>(src.get<i8>());
|
|
33
|
-
break;
|
|
34
|
-
case JSON.Types.I16:
|
|
35
|
-
serializeInteger<i16>(src.get<i16>());
|
|
36
|
-
break;
|
|
37
|
-
case JSON.Types.I32:
|
|
38
|
-
serializeInteger<i32>(src.get<i32>());
|
|
39
|
-
break;
|
|
40
|
-
case JSON.Types.I64:
|
|
41
|
-
serializeInteger<i64>(src.get<i64>());
|
|
42
|
-
break;
|
|
43
|
-
case JSON.Types.F32:
|
|
44
|
-
serializeFloat32(src.get<f32>());
|
|
45
|
-
break;
|
|
46
|
-
case JSON.Types.F64:
|
|
47
|
-
serializeFloat64(src.get<f64>());
|
|
48
|
-
break;
|
|
49
|
-
case JSON.Types.String:
|
|
50
|
-
serializeString(src.get<string>());
|
|
51
|
-
break;
|
|
52
|
-
case JSON.Types.Bool:
|
|
53
|
-
serializeBool(src.get<bool>());
|
|
54
|
-
break;
|
|
55
|
-
case JSON.Types.Array: {
|
|
56
|
-
serializeArray(src.get<JSON.Value[]>());
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
case JSON.Types.Object: {
|
|
60
|
-
serializeObject(src.get<JSON.Obj>());
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
case JSON.Types.Map: {
|
|
64
|
-
serializeMap(src.get<Map<string, JSON.Value>>());
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
case JSON.Types.TypedArray:
|
|
68
|
-
case JSON.Types.ArrayBuffer: {
|
|
69
|
-
serializeDynamic(src.type, src.get<usize>());
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
default: {
|
|
73
|
-
const fn = JSON.Value.METHODS.get(src.type - JSON.Types.Struct);
|
|
74
|
-
const ptr = src.get<usize>();
|
|
75
|
-
call_indirect<void>(fn, 0, ptr);
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { bs } from "../../../lib/as-bs";
|
|
2
|
-
import { JSON } from "../..";
|
|
3
|
-
import { BRACE_LEFT, BRACE_RIGHT, COLON, COMMA } from "../../custom/chars";
|
|
4
|
-
import { serializeArbitrary } from "./arbitrary";
|
|
5
|
-
import { serializeString_SWAR } from "../swar/string";
|
|
6
|
-
|
|
7
|
-
export function serializeObject(src: JSON.Obj): void {
|
|
8
|
-
const srcSize = src.size;
|
|
9
|
-
const srcEnd = srcSize - 1;
|
|
10
|
-
|
|
11
|
-
if (srcSize == 0) {
|
|
12
|
-
bs.proposeSize(4);
|
|
13
|
-
store<u32>(bs.offset, 8192123);
|
|
14
|
-
bs.offset += 4;
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const keys = src.keys();
|
|
19
|
-
const values = src.values();
|
|
20
|
-
|
|
21
|
-
bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
|
|
22
|
-
store<u16>(bs.offset, BRACE_LEFT);
|
|
23
|
-
bs.offset += 2;
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i < srcEnd; i++) {
|
|
26
|
-
serializeString_SWAR(unchecked(keys[i]));
|
|
27
|
-
store<u16>(bs.offset, COLON);
|
|
28
|
-
bs.offset += 2;
|
|
29
|
-
|
|
30
|
-
serializeArbitrary(unchecked(values[i]));
|
|
31
|
-
store<u16>(bs.offset, COMMA);
|
|
32
|
-
bs.offset += 2;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
serializeString_SWAR(unchecked(keys[srcEnd]));
|
|
36
|
-
store<u16>(bs.offset, COLON);
|
|
37
|
-
bs.offset += 2;
|
|
38
|
-
serializeArbitrary(unchecked(values[srcEnd]));
|
|
39
|
-
|
|
40
|
-
store<u16>(bs.offset, BRACE_RIGHT);
|
|
41
|
-
bs.offset += 2;
|
|
42
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|