json-as 1.2.5 → 1.2.6
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/.prettierrc +3 -0
- package/README.md +2 -0
- package/assembly/custom/util.ts +70 -24
- package/assembly/deserialize/simd/string.ts +7 -5
- package/assembly/deserialize/simple/arbitrary.ts +12 -5
- package/assembly/deserialize/simple/array/arbitrary.ts +24 -7
- package/assembly/deserialize/simple/array/array.ts +8 -2
- package/assembly/deserialize/simple/array/bool.ts +8 -2
- package/assembly/deserialize/simple/array/box.ts +8 -2
- package/assembly/deserialize/simple/array/float.ts +8 -2
- package/assembly/deserialize/simple/array/integer.ts +8 -2
- package/assembly/deserialize/simple/array/map.ts +26 -6
- package/assembly/deserialize/simple/array/object.ts +26 -6
- package/assembly/deserialize/simple/array/raw.ts +42 -6
- package/assembly/deserialize/simple/array/string.ts +8 -2
- package/assembly/deserialize/simple/array/struct.ts +26 -6
- package/assembly/deserialize/simple/array.ts +5 -1
- package/assembly/deserialize/simple/bool.ts +6 -2
- package/assembly/deserialize/simple/integer.ts +4 -1
- package/assembly/deserialize/simple/map.ts +85 -17
- package/assembly/deserialize/simple/object.ts +64 -12
- package/assembly/deserialize/simple/raw.ts +4 -1
- package/assembly/deserialize/simple/set.ts +37 -11
- package/assembly/deserialize/simple/staticarray/array.ts +12 -3
- package/assembly/deserialize/simple/staticarray/bool.ts +6 -2
- package/assembly/deserialize/simple/staticarray/float.ts +12 -3
- package/assembly/deserialize/simple/staticarray/integer.ts +6 -2
- package/assembly/deserialize/simple/staticarray/string.ts +12 -4
- package/assembly/deserialize/simple/staticarray/struct.ts +30 -7
- package/assembly/deserialize/simple/staticarray.ts +11 -3
- package/assembly/deserialize/simple/string.ts +9 -3
- package/assembly/deserialize/simple/struct.ts +104 -16
- package/assembly/deserialize/swar/string.ts +13 -10
- package/assembly/index.d.ts +5 -3
- package/assembly/index.ts +183 -87
- package/assembly/serialize/simd/string.ts +70 -69
- package/assembly/serialize/simple/raw.ts +5 -1
- package/assembly/serialize/simple/string.ts +9 -10
- package/assembly/serialize/swar/string.ts +33 -32
- package/assembly/test.ts +28 -22
- package/assembly/tsconfig.json +16 -1
- package/assembly/util/concat.ts +5 -1
- package/assembly/util/masks.ts +5 -6
- package/assembly/util/snp.ts +4 -1
- package/assembly/util/swar.ts +5 -7
- package/eslint.config.js +34 -51
- package/lib/as-bs.ts +22 -18
- package/package.json +7 -6
- package/tools/assemblyscript-eslint-local.js +29 -0
- package/tools/assemblyscript-eslint.js +29 -0
- package/transform/lib/builder.d.ts.map +1 -1
- package/transform/lib/builder.js +13 -5
- package/transform/lib/builder.js.map +1 -1
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +690 -151
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/alias.d.ts.map +1 -1
- package/transform/lib/linkers/alias.js.map +1 -1
- package/transform/lib/linkers/custom.d.ts.map +1 -1
- package/transform/lib/linkers/custom.js +9 -4
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/linkers/imports.d.ts.map +1 -1
- package/transform/lib/linkers/imports.js.map +1 -1
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +21 -8
- package/transform/lib/types.js.map +1 -1
- package/transform/lib/util.d.ts.map +1 -1
- package/transform/lib/util.js +1 -1
- package/transform/lib/util.js.map +1 -1
- package/transform/lib/visitor.d.ts.map +1 -1
- package/transform/lib/visitor.js +2 -1
- package/transform/lib/visitor.js.map +1 -1
- package/transform/tsconfig.json +2 -6
- package/.claude/settings.local.json +0 -9
|
@@ -1,15 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BRACE_LEFT,
|
|
3
|
+
BRACE_RIGHT,
|
|
4
|
+
BRACKET_LEFT,
|
|
5
|
+
BRACKET_RIGHT,
|
|
6
|
+
} from "../../../custom/chars";
|
|
2
7
|
import { JSON } from "../../..";
|
|
3
8
|
import { isSpace } from "util/string";
|
|
4
9
|
|
|
5
|
-
export function deserializeStaticArrayStruct<T extends StaticArray<any>>(
|
|
10
|
+
export function deserializeStaticArrayStruct<T extends StaticArray<any>>(
|
|
11
|
+
srcStart: usize,
|
|
12
|
+
srcEnd: usize,
|
|
13
|
+
dst: usize,
|
|
14
|
+
): T {
|
|
6
15
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
7
16
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2;
|
|
8
17
|
|
|
9
|
-
if (srcStart - srcEnd == 0)
|
|
18
|
+
if (srcStart - srcEnd == 0)
|
|
19
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
10
20
|
|
|
11
|
-
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
12
|
-
|
|
21
|
+
if (load<u16>(srcStart) != BRACKET_LEFT)
|
|
22
|
+
throw new Error(
|
|
23
|
+
"Expected '[' at start of object at position " +
|
|
24
|
+
(srcEnd - srcStart).toString(),
|
|
25
|
+
);
|
|
26
|
+
if (load<u16>(srcEnd - 2) != BRACKET_RIGHT)
|
|
27
|
+
throw new Error(
|
|
28
|
+
"Expected ']' at end of object at position " +
|
|
29
|
+
(srcEnd - srcStart).toString(),
|
|
30
|
+
);
|
|
13
31
|
|
|
14
32
|
// First pass: count elements using same logic as Array deserializer
|
|
15
33
|
let count: i32 = 0;
|
|
@@ -26,7 +44,7 @@ export function deserializeStaticArrayStruct<T extends StaticArray<any>>(srcStar
|
|
|
26
44
|
}
|
|
27
45
|
|
|
28
46
|
// Allocate StaticArray with correct size
|
|
29
|
-
const outSize = <usize>count << alignof<valueof<T>>();
|
|
47
|
+
const outSize = (<usize>count) << alignof<valueof<T>>();
|
|
30
48
|
const out = changetype<nonnull<T>>(dst || __new(outSize, idof<T>()));
|
|
31
49
|
|
|
32
50
|
// Second pass: populate values
|
|
@@ -38,7 +56,12 @@ export function deserializeStaticArrayStruct<T extends StaticArray<any>>(srcStar
|
|
|
38
56
|
if (code == BRACE_LEFT && depth++ == 0) {
|
|
39
57
|
lastIndex = srcStart;
|
|
40
58
|
} else if (code == BRACE_RIGHT && --depth == 0) {
|
|
41
|
-
unchecked(
|
|
59
|
+
unchecked(
|
|
60
|
+
(out[index++] = JSON.__deserialize<valueof<T>>(
|
|
61
|
+
lastIndex,
|
|
62
|
+
(srcStart += 2),
|
|
63
|
+
)),
|
|
64
|
+
);
|
|
42
65
|
}
|
|
43
66
|
srcStart += 2;
|
|
44
67
|
}
|
|
@@ -5,7 +5,11 @@ import { deserializeStaticArrayString } from "./staticarray/string";
|
|
|
5
5
|
import { deserializeStaticArrayArray } from "./staticarray/array";
|
|
6
6
|
import { deserializeStaticArrayStruct } from "./staticarray/struct";
|
|
7
7
|
|
|
8
|
-
export function deserializeStaticArray<T extends StaticArray<any>>(
|
|
8
|
+
export function deserializeStaticArray<T extends StaticArray<any>>(
|
|
9
|
+
srcStart: usize,
|
|
10
|
+
srcEnd: usize,
|
|
11
|
+
dst: usize,
|
|
12
|
+
): T {
|
|
9
13
|
if (isString<valueof<T>>()) {
|
|
10
14
|
return <T>deserializeStaticArrayString(srcStart, srcEnd, dst);
|
|
11
15
|
} else if (isBoolean<valueof<T>>()) {
|
|
@@ -21,8 +25,12 @@ export function deserializeStaticArray<T extends StaticArray<any>>(srcStart: usi
|
|
|
21
25
|
if (isDefined(type.__DESERIALIZE)) {
|
|
22
26
|
return deserializeStaticArrayStruct<T>(srcStart, srcEnd, dst);
|
|
23
27
|
}
|
|
24
|
-
throw new Error(
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Could not parse static array of type " + nameof<T>() + "!",
|
|
30
|
+
);
|
|
25
31
|
} else {
|
|
26
|
-
throw new Error(
|
|
32
|
+
throw new Error(
|
|
33
|
+
"Could not parse static array of type " + nameof<T>() + "!",
|
|
34
|
+
);
|
|
27
35
|
}
|
|
28
36
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { bs } from "../../../lib/as-bs";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
DESERIALIZE_ESCAPE_TABLE,
|
|
4
|
+
ESCAPE_HEX_TABLE,
|
|
5
|
+
} from "../../globals/tables";
|
|
3
6
|
import { hex4_to_u16_swar } from "../../util/swar";
|
|
4
7
|
|
|
5
8
|
// @ts-ignore: inline
|
|
6
|
-
@inline export function deserializeString(
|
|
9
|
+
@inline export function deserializeString(
|
|
10
|
+
srcStart: usize,
|
|
11
|
+
srcEnd: usize,
|
|
12
|
+
): string {
|
|
7
13
|
// Strip quotes
|
|
8
14
|
srcStart += 2;
|
|
9
15
|
srcEnd -= 2;
|
|
@@ -15,7 +21,7 @@ import { hex4_to_u16_swar } from "../../util/swar";
|
|
|
15
21
|
srcStart += 2;
|
|
16
22
|
|
|
17
23
|
// Early exit
|
|
18
|
-
if (block !==
|
|
24
|
+
if (block !== 0x5c) {
|
|
19
25
|
bs.offset += 2;
|
|
20
26
|
continue;
|
|
21
27
|
}
|
|
@@ -1,7 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BACK_SLASH,
|
|
3
|
+
COMMA,
|
|
4
|
+
CHAR_F,
|
|
5
|
+
BRACE_LEFT,
|
|
6
|
+
BRACKET_LEFT,
|
|
7
|
+
CHAR_N,
|
|
8
|
+
QUOTE,
|
|
9
|
+
BRACE_RIGHT,
|
|
10
|
+
BRACKET_RIGHT,
|
|
11
|
+
CHAR_T,
|
|
12
|
+
COLON,
|
|
13
|
+
} from "../../custom/chars";
|
|
2
14
|
import { isSpace } from "../../util";
|
|
3
15
|
|
|
4
|
-
export function deserializeStruct<T>(
|
|
16
|
+
export function deserializeStruct<T>(
|
|
17
|
+
srcStart: usize,
|
|
18
|
+
srcEnd: usize,
|
|
19
|
+
dst: usize,
|
|
20
|
+
): T {
|
|
5
21
|
const out = changetype<nonnull<T>>(dst || __new(offsetof<T>(), idof<T>()));
|
|
6
22
|
|
|
7
23
|
// @ts-ignore: supplied by transform
|
|
@@ -16,9 +32,18 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
16
32
|
while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
17
33
|
while (srcEnd > srcStart && isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2; // would like to optimize this later
|
|
18
34
|
|
|
19
|
-
if (srcStart - srcEnd == 0)
|
|
20
|
-
|
|
21
|
-
if (load<u16>(
|
|
35
|
+
if (srcStart - srcEnd == 0)
|
|
36
|
+
throw new Error("Input string had zero length or was all whitespace");
|
|
37
|
+
if (load<u16>(srcStart) != BRACE_LEFT)
|
|
38
|
+
throw new Error(
|
|
39
|
+
"Expected '{' at start of object at position " +
|
|
40
|
+
(srcEnd - srcStart).toString(),
|
|
41
|
+
);
|
|
42
|
+
if (load<u16>(srcEnd - 2) != BRACE_RIGHT)
|
|
43
|
+
throw new Error(
|
|
44
|
+
"Expected '}' at end of object at position " +
|
|
45
|
+
(srcEnd - srcStart).toString(),
|
|
46
|
+
);
|
|
22
47
|
|
|
23
48
|
srcStart += 2;
|
|
24
49
|
while (srcStart < srcEnd) {
|
|
@@ -31,7 +56,11 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
31
56
|
// console.log("Key: " + ptrToStr(lastIndex, srcStart));
|
|
32
57
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
|
|
33
58
|
while (isSpace((code = load<u16>((srcStart += 2))))) {}
|
|
34
|
-
if (code !== COLON)
|
|
59
|
+
if (code !== COLON)
|
|
60
|
+
throw new Error(
|
|
61
|
+
"Expected ':' after key at position " +
|
|
62
|
+
(srcEnd - srcStart).toString(),
|
|
63
|
+
);
|
|
35
64
|
isKey = false;
|
|
36
65
|
} else {
|
|
37
66
|
// console.log("Got key start");
|
|
@@ -50,7 +79,13 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
50
79
|
if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
|
|
51
80
|
// console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
|
|
52
81
|
// @ts-ignore: exists
|
|
53
|
-
out.__DESERIALIZE(
|
|
82
|
+
out.__DESERIALIZE(
|
|
83
|
+
keyStart,
|
|
84
|
+
keyEnd,
|
|
85
|
+
lastIndex,
|
|
86
|
+
srcStart + 2,
|
|
87
|
+
changetype<usize>(out),
|
|
88
|
+
);
|
|
54
89
|
// while (isSpace(load<u16>(srcStart))) srcStart += 2;
|
|
55
90
|
srcStart += 4;
|
|
56
91
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
@@ -67,7 +102,13 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
67
102
|
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
|
|
68
103
|
// console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
|
|
69
104
|
// @ts-ignore: exists
|
|
70
|
-
out.__DESERIALIZE(
|
|
105
|
+
out.__DESERIALIZE(
|
|
106
|
+
keyStart,
|
|
107
|
+
keyEnd,
|
|
108
|
+
lastIndex,
|
|
109
|
+
srcStart,
|
|
110
|
+
changetype<usize>(out),
|
|
111
|
+
);
|
|
71
112
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
72
113
|
// /* empty */
|
|
73
114
|
// }
|
|
@@ -86,12 +127,24 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
86
127
|
const code = load<u16>(srcStart);
|
|
87
128
|
if (code == QUOTE) {
|
|
88
129
|
srcStart += 2;
|
|
89
|
-
while (
|
|
130
|
+
while (
|
|
131
|
+
!(
|
|
132
|
+
load<u16>(srcStart) == QUOTE &&
|
|
133
|
+
load<u16>(srcStart - 2) != BACK_SLASH
|
|
134
|
+
)
|
|
135
|
+
)
|
|
136
|
+
srcStart += 2;
|
|
90
137
|
} else if (code == BRACE_RIGHT) {
|
|
91
138
|
if (--depth == 0) {
|
|
92
139
|
// console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
|
|
93
140
|
// @ts-ignore: exists
|
|
94
|
-
out.__DESERIALIZE(
|
|
141
|
+
out.__DESERIALIZE(
|
|
142
|
+
keyStart,
|
|
143
|
+
keyEnd,
|
|
144
|
+
lastIndex,
|
|
145
|
+
(srcStart += 2),
|
|
146
|
+
changetype<usize>(out),
|
|
147
|
+
);
|
|
95
148
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
96
149
|
keyStart = 0;
|
|
97
150
|
// while (isSpace(load<u16>(srcStart))) {
|
|
@@ -110,12 +163,24 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
110
163
|
const code = load<u16>(srcStart);
|
|
111
164
|
if (code == QUOTE) {
|
|
112
165
|
srcStart += 2;
|
|
113
|
-
while (
|
|
166
|
+
while (
|
|
167
|
+
!(
|
|
168
|
+
load<u16>(srcStart) == QUOTE &&
|
|
169
|
+
load<u16>(srcStart - 2) != BACK_SLASH
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
srcStart += 2;
|
|
114
173
|
} else if (code == BRACKET_RIGHT) {
|
|
115
174
|
if (--depth == 0) {
|
|
116
175
|
// console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
|
|
117
176
|
// @ts-ignore: exists
|
|
118
|
-
out.__DESERIALIZE(
|
|
177
|
+
out.__DESERIALIZE(
|
|
178
|
+
keyStart,
|
|
179
|
+
keyEnd,
|
|
180
|
+
lastIndex,
|
|
181
|
+
(srcStart += 2),
|
|
182
|
+
changetype<usize>(out),
|
|
183
|
+
);
|
|
119
184
|
// console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
|
|
120
185
|
keyStart = 0;
|
|
121
186
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
@@ -130,7 +195,13 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
130
195
|
if (load<u64>(srcStart) == 28429475166421108) {
|
|
131
196
|
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8));
|
|
132
197
|
// @ts-ignore: exists
|
|
133
|
-
out.__DESERIALIZE(
|
|
198
|
+
out.__DESERIALIZE(
|
|
199
|
+
keyStart,
|
|
200
|
+
keyEnd,
|
|
201
|
+
srcStart,
|
|
202
|
+
(srcStart += 8),
|
|
203
|
+
changetype<usize>(out),
|
|
204
|
+
);
|
|
134
205
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
135
206
|
// /* empty */
|
|
136
207
|
// }
|
|
@@ -142,7 +213,13 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
142
213
|
if (load<u64>(srcStart, 2) == 28429466576093281) {
|
|
143
214
|
// console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10));
|
|
144
215
|
// @ts-ignore: exists
|
|
145
|
-
out.__DESERIALIZE(
|
|
216
|
+
out.__DESERIALIZE(
|
|
217
|
+
keyStart,
|
|
218
|
+
keyEnd,
|
|
219
|
+
srcStart,
|
|
220
|
+
(srcStart += 10),
|
|
221
|
+
changetype<usize>(out),
|
|
222
|
+
);
|
|
146
223
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
147
224
|
// /* empty */
|
|
148
225
|
// }
|
|
@@ -154,7 +231,13 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
154
231
|
if (load<u64>(srcStart) == 30399761348886638) {
|
|
155
232
|
// console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8));
|
|
156
233
|
// @ts-ignore: exists
|
|
157
|
-
out.__DESERIALIZE(
|
|
234
|
+
out.__DESERIALIZE(
|
|
235
|
+
keyStart,
|
|
236
|
+
keyEnd,
|
|
237
|
+
srcStart,
|
|
238
|
+
(srcStart += 8),
|
|
239
|
+
changetype<usize>(out),
|
|
240
|
+
);
|
|
158
241
|
// while (isSpace(load<u16>((srcStart += 2)))) {
|
|
159
242
|
/* empty */
|
|
160
243
|
// }
|
|
@@ -165,7 +248,12 @@ export function deserializeStruct<T>(srcStart: usize, srcEnd: usize, dst: usize)
|
|
|
165
248
|
} else if (isSpace(code)) {
|
|
166
249
|
srcStart += 2;
|
|
167
250
|
} else {
|
|
168
|
-
throw new Error(
|
|
251
|
+
throw new Error(
|
|
252
|
+
"Unexpected character in JSON object '" +
|
|
253
|
+
String.fromCharCode(code) +
|
|
254
|
+
"' at position " +
|
|
255
|
+
(srcEnd - srcStart).toString(),
|
|
256
|
+
);
|
|
169
257
|
}
|
|
170
258
|
}
|
|
171
259
|
}
|
|
@@ -67,13 +67,13 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
67
67
|
const code = <u16>(header >> 16);
|
|
68
68
|
|
|
69
69
|
// Detect false positive (code unit where low byte is 0x5C)
|
|
70
|
-
if ((header &
|
|
70
|
+
if ((header & 0xffff) !== 0x5c) continue;
|
|
71
71
|
|
|
72
72
|
// Hot path (negative bias)
|
|
73
73
|
if (code !== 0x75) {
|
|
74
74
|
// Short escapes (\n \t \" \\)
|
|
75
75
|
const escaped = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
|
|
76
|
-
mask &= mask - usize(escaped ===
|
|
76
|
+
mask &= mask - usize(escaped === 0x5c);
|
|
77
77
|
store<u16>(dstIdx, escaped);
|
|
78
78
|
store<u32>(dstIdx, load<u32>(srcIdx, 4), 2);
|
|
79
79
|
|
|
@@ -90,7 +90,6 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
90
90
|
// store<u64>(dstIdx, load<u32>(srcIdx, 12), 2);
|
|
91
91
|
srcStart += 4 + laneIdx;
|
|
92
92
|
bs.offset -= 6 - laneIdx;
|
|
93
|
-
|
|
94
93
|
} while (mask !== 0);
|
|
95
94
|
|
|
96
95
|
bs.offset += 8;
|
|
@@ -103,7 +102,7 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
103
102
|
srcStart += 2;
|
|
104
103
|
|
|
105
104
|
// Early exit
|
|
106
|
-
if (block !==
|
|
105
|
+
if (block !== 0x5c) {
|
|
107
106
|
bs.offset += 2;
|
|
108
107
|
continue;
|
|
109
108
|
}
|
|
@@ -141,11 +140,14 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
141
140
|
*/
|
|
142
141
|
// @ts-expect-error: @inline is a valid decorator
|
|
143
142
|
@inline function backslash_mask(block: u64): u64 {
|
|
144
|
-
const b = block ^
|
|
145
|
-
const backslash_mask =
|
|
143
|
+
const b = block ^ 0x005c_005c_005c_005c;
|
|
144
|
+
const backslash_mask =
|
|
145
|
+
(b - 0x0001_0001_0001_0001) & ~b & 0x0080_0080_0080_0080;
|
|
146
146
|
const high_byte_mask =
|
|
147
|
-
~(
|
|
148
|
-
|
|
147
|
+
~(
|
|
148
|
+
((block - 0x0100_0100_0100_0100) & ~block & 0x8000_8000_8000_8000) ^
|
|
149
|
+
0x8000_8000_8000_8000
|
|
150
|
+
) >> 8;
|
|
149
151
|
return backslash_mask & high_byte_mask;
|
|
150
152
|
}
|
|
151
153
|
|
|
@@ -160,7 +162,8 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
160
162
|
*/
|
|
161
163
|
// @ts-expect-error: @inline is a valid decorator
|
|
162
164
|
@inline function backslash_mask_unsafe(block: u64): u64 {
|
|
163
|
-
const b = block ^
|
|
164
|
-
const backslash_mask =
|
|
165
|
+
const b = block ^ 0x005c_005c_005c_005c;
|
|
166
|
+
const backslash_mask =
|
|
167
|
+
(b - 0x0001_0001_0001_0001) & ~b & 0x0080_0080_0080_0080;
|
|
165
168
|
return backslash_mask;
|
|
166
169
|
}
|
package/assembly/index.d.ts
CHANGED
|
@@ -24,7 +24,9 @@ declare function omit(..._): void;
|
|
|
24
24
|
/**
|
|
25
25
|
* Property decorator that allows a field to be omitted when equal to an Expression.
|
|
26
26
|
*/
|
|
27
|
-
declare function omitif(
|
|
27
|
+
declare function omitif(
|
|
28
|
+
condition: string | ((value: any) => boolean),
|
|
29
|
+
): Function;
|
|
28
30
|
|
|
29
31
|
/**
|
|
30
32
|
* Property decorator that allows a field to be omitted when a property is null.
|
|
@@ -47,8 +49,8 @@ declare function deserializer(..._): any;
|
|
|
47
49
|
declare enum JSONMode {
|
|
48
50
|
SWAR = 0,
|
|
49
51
|
SIMD = 1,
|
|
50
|
-
NAIVE = 2
|
|
52
|
+
NAIVE = 2,
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
declare const JSON_MODE: JSONMode;
|
|
54
|
-
declare const JSON_CACHE: bool;
|
|
56
|
+
declare const JSON_CACHE: bool;
|