json-as 1.3.6 → 1.3.8
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 +45 -0
- package/README.md +1 -1
- package/assembly/deserialize/helpers/uint.ts +4 -1
- package/assembly/deserialize/index/arbitrary.ts +7 -3
- package/assembly/deserialize/index/array.ts +42 -17
- 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 +68 -1
- 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 +32 -4
- package/assembly/deserialize/index/struct.ts +1 -1
- package/assembly/deserialize/index/typedarray.ts +30 -10
- package/assembly/deserialize/index/unsigned.ts +78 -1
- package/assembly/deserialize/index.ts +1 -0
- package/assembly/deserialize/{simple → naive}/array/arbitrary.ts +24 -5
- package/assembly/deserialize/{simple → naive}/array/array.ts +8 -2
- package/assembly/deserialize/naive/array/bool.ts +68 -0
- package/assembly/deserialize/{simple → naive}/array/box.ts +8 -2
- package/assembly/deserialize/naive/array/float.ts +63 -0
- package/assembly/deserialize/{simple → naive}/array/generic.ts +14 -7
- package/assembly/deserialize/naive/array/integer.ts +86 -0
- package/assembly/deserialize/naive/array/map.ts +47 -0
- package/assembly/deserialize/naive/array/object.ts +47 -0
- package/assembly/deserialize/{simple → naive}/array/raw.ts +34 -7
- package/assembly/deserialize/naive/array/string.ts +69 -0
- package/assembly/deserialize/naive/array/struct.ts +47 -0
- package/assembly/deserialize/{simple → naive}/array.ts +15 -10
- package/assembly/deserialize/{simple → naive}/bool.ts +6 -2
- package/assembly/deserialize/naive/float.ts +135 -0
- package/assembly/deserialize/{simple → naive}/integer.ts +10 -2
- package/assembly/deserialize/{simple → naive}/map.ts +106 -27
- package/assembly/deserialize/{simple → naive}/object.ts +65 -19
- package/assembly/deserialize/{simple → naive}/raw.ts +4 -1
- package/assembly/deserialize/{simple → naive}/set.ts +49 -19
- 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/string.ts +11 -3
- package/assembly/deserialize/{simple → naive}/staticarray/struct.ts +1 -2
- package/assembly/deserialize/{simple → naive}/staticarray.ts +68 -18
- package/assembly/deserialize/naive/string.ts +199 -0
- package/assembly/deserialize/{simple → naive}/struct.ts +5 -1
- package/assembly/deserialize/{simple → naive}/typedarray.ts +17 -4
- package/assembly/deserialize/{simple → naive}/unsigned.ts +10 -15
- package/assembly/deserialize/simd/array/integer.ts +339 -62
- package/assembly/deserialize/simd/float.ts +303 -0
- package/assembly/deserialize/simd/integer.ts +233 -0
- package/assembly/deserialize/simd/string.ts +266 -107
- package/assembly/deserialize/swar/array/arbitrary.ts +11 -3
- package/assembly/deserialize/swar/array/array.ts +40 -9
- package/assembly/deserialize/swar/array/bool.ts +28 -5
- package/assembly/deserialize/swar/array/box.ts +11 -3
- package/assembly/deserialize/swar/array/float.ts +295 -7
- package/assembly/deserialize/swar/array/generic.ts +28 -7
- package/assembly/deserialize/swar/array/integer.ts +363 -112
- package/assembly/deserialize/swar/array/map.ts +11 -3
- package/assembly/deserialize/swar/array/object.ts +37 -25
- package/assembly/deserialize/swar/array/raw.ts +11 -3
- package/assembly/deserialize/swar/array/shared.ts +63 -14
- package/assembly/deserialize/swar/array/string.ts +140 -7
- package/assembly/deserialize/swar/array/struct.ts +66 -12
- package/assembly/deserialize/swar/array.ts +12 -51
- package/assembly/deserialize/swar/float.ts +304 -0
- package/assembly/deserialize/swar/integer.ts +246 -0
- package/assembly/deserialize/swar/string.ts +213 -294
- package/assembly/deserialize/swar/typedarray.ts +224 -0
- package/assembly/index.d.ts +3 -1
- package/assembly/index.ts +402 -261
- 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 +5 -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 +21 -12
- package/assembly/serialize/index.ts +1 -0
- package/assembly/serialize/naive/array.ts +351 -0
- package/assembly/serialize/{simple → naive}/float.ts +4 -1
- package/assembly/serialize/naive/integer.ts +19 -0
- package/assembly/serialize/{simple → naive}/map.ts +6 -2
- package/assembly/serialize/{simple → naive}/raw.ts +5 -1
- package/assembly/serialize/{simple → naive}/set.ts +6 -1
- package/assembly/serialize/{simple → naive}/staticarray.ts +6 -1
- package/assembly/serialize/{simple → naive}/string.ts +1 -2
- package/assembly/serialize/{simple → naive}/typedarray.ts +10 -3
- package/assembly/serialize/simd/string.ts +6 -2
- package/assembly/serialize/swar/string.ts +15 -141
- package/assembly/util/atoi-fast.ts +81 -0
- package/assembly/util/concat.ts +5 -1
- package/assembly/util/dragonbox-cache.ts +443 -2
- package/assembly/util/dragonbox.ts +53 -17
- package/assembly/util/itoa-fast.ts +241 -0
- package/assembly/util/masks.ts +18 -1
- package/assembly/util/parsefloat-fast.ts +167 -0
- package/assembly/util/scanValueEnd.ts +78 -0
- package/assembly/util/scientific.ts +132 -0
- package/assembly/util/simd-int.ts +191 -0
- package/assembly/util/snp.ts +4 -1
- package/assembly/util/swar-int.ts +248 -0
- package/assembly/util/swar.ts +13 -3
- package/lib/as-bs.ts +27 -6
- package/package.json +15 -11
- 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 +5 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +1046 -340
- 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 +3 -2
- 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 +54 -16
- 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/assembly/custom/util.ts +0 -310
- package/assembly/deserialize/simple/arbitrary.ts +0 -23
- package/assembly/deserialize/simple/array/bool.ts +0 -17
- package/assembly/deserialize/simple/array/float.ts +0 -28
- package/assembly/deserialize/simple/array/integer.ts +0 -27
- package/assembly/deserialize/simple/array/map.ts +0 -28
- package/assembly/deserialize/simple/array/object.ts +0 -28
- package/assembly/deserialize/simple/array/string.ts +0 -23
- package/assembly/deserialize/simple/array/struct.ts +0 -28
- package/assembly/deserialize/simple/float.ts +0 -201
- package/assembly/deserialize/simple/string.ts +0 -132
- package/assembly/serialize/simple/arbitrary.ts +0 -79
- package/assembly/serialize/simple/array.ts +0 -86
- package/assembly/serialize/simple/integer.ts +0 -20
- package/assembly/serialize/simple/object.ts +0 -42
- /package/assembly/deserialize/{simple → naive}/date.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}/struct.ts +0 -0
|
@@ -25,7 +25,11 @@ export function serializeString_SWAR(src: string): void {
|
|
|
25
25
|
const block = load<u64>(srcStart);
|
|
26
26
|
if ((block & 0xff00_ff00_ff00_ff00) != 0) break;
|
|
27
27
|
const lo = block & 0x00ff_00ff_00ff_00ff;
|
|
28
|
-
const asciiMask =
|
|
28
|
+
const asciiMask =
|
|
29
|
+
((lo - 0x0020_0020_0020_0020) |
|
|
30
|
+
((lo ^ 0x0022_0022_0022_0022) - 0x0001_0001_0001_0001) |
|
|
31
|
+
((lo ^ 0x005c_005c_005c_005c) - 0x0001_0001_0001_0001)) &
|
|
32
|
+
(0x0080_0080_0080_0080 & ~lo);
|
|
29
33
|
if (asciiMask != 0) break;
|
|
30
34
|
store<u64>(dst, block);
|
|
31
35
|
srcStart += 8;
|
|
@@ -35,7 +39,8 @@ export function serializeString_SWAR(src: string): void {
|
|
|
35
39
|
|
|
36
40
|
while (srcStart <= srcEnd - 2) {
|
|
37
41
|
const code = load<u16>(srcStart);
|
|
38
|
-
if (code > 0x7f || code == BACK_SLASH || code == QUOTE || code < 32)
|
|
42
|
+
if (code > 0x7f || code == BACK_SLASH || code == QUOTE || code < 32)
|
|
43
|
+
break;
|
|
39
44
|
store<u16>(dst, code);
|
|
40
45
|
srcStart += 2;
|
|
41
46
|
dst += 2;
|
|
@@ -169,130 +174,6 @@ export function serializeString_SWAR(src: string): void {
|
|
|
169
174
|
bs.offset += 2;
|
|
170
175
|
}
|
|
171
176
|
|
|
172
|
-
export function serializeString_SWAR_ExperimentalTableEscapes(src: string): void {
|
|
173
|
-
let srcStart = changetype<usize>(src);
|
|
174
|
-
const srcSize = changetype<OBJECT>(srcStart - TOTAL_OVERHEAD).rtSize;
|
|
175
|
-
const srcEnd = srcStart + srcSize;
|
|
176
|
-
const srcEnd8 = srcEnd - 8;
|
|
177
|
-
|
|
178
|
-
bs.proposeSize(srcSize + 4);
|
|
179
|
-
store<u16>(bs.offset, 34); // "
|
|
180
|
-
bs.offset += 2;
|
|
181
|
-
|
|
182
|
-
while (srcStart < srcEnd8) {
|
|
183
|
-
const block = load<u64>(srcStart);
|
|
184
|
-
let mask = detect_escapable_u64_swar_safe(block);
|
|
185
|
-
store<u64>(bs.offset, block);
|
|
186
|
-
|
|
187
|
-
if (mask === 0) {
|
|
188
|
-
srcStart += 8;
|
|
189
|
-
bs.offset += 8;
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
do {
|
|
194
|
-
const laneIdx = usize(ctz(mask) >> 3);
|
|
195
|
-
const srcIdx = srcStart + laneIdx;
|
|
196
|
-
// Even (0 2 4 6) -> Confirmed ASCII Escape
|
|
197
|
-
// Odd (1 3 5 7) -> Possibly a Unicode code unit or surrogate
|
|
198
|
-
if ((laneIdx & 1) === 0) {
|
|
199
|
-
mask &= mask - 1;
|
|
200
|
-
const code = load<u16>(srcIdx);
|
|
201
|
-
const escaped = load<u32>(SERIALIZE_ESCAPE_TABLE + (code << 2));
|
|
202
|
-
|
|
203
|
-
if ((escaped & 0xffff) != BACK_SLASH) {
|
|
204
|
-
bs.growSize(10);
|
|
205
|
-
const dstIdx = bs.offset + laneIdx;
|
|
206
|
-
store<u64>(dstIdx, U00_MARKER);
|
|
207
|
-
store<u32>(dstIdx, escaped, 8);
|
|
208
|
-
store<u64>(dstIdx, load<u64>(srcIdx, 2), 12);
|
|
209
|
-
bs.offset += 10;
|
|
210
|
-
} else {
|
|
211
|
-
bs.growSize(2);
|
|
212
|
-
const dstIdx = bs.offset + laneIdx;
|
|
213
|
-
store<u32>(dstIdx, escaped);
|
|
214
|
-
store<u64>(dstIdx, load<u64>(srcIdx, 2), 4);
|
|
215
|
-
bs.offset += 2;
|
|
216
|
-
}
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
mask &= mask - 1;
|
|
220
|
-
|
|
221
|
-
const code = load<u16>(srcIdx - 1);
|
|
222
|
-
if (code < 0xd800 || code > 0xdfff) continue;
|
|
223
|
-
|
|
224
|
-
if (code <= 0xdbff && srcIdx + 2 < srcEnd) {
|
|
225
|
-
const next = load<u16>(srcIdx, 1);
|
|
226
|
-
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
227
|
-
// paired surrogate
|
|
228
|
-
// mask &= ~(0xFF << ((laneIdx+2) << 3));
|
|
229
|
-
mask &= mask - 1;
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
bs.growSize(10);
|
|
235
|
-
|
|
236
|
-
// unpaired high/low surrogate
|
|
237
|
-
const dstIdx = bs.offset + laneIdx - 1;
|
|
238
|
-
store<u32>(dstIdx, U_MARKER); // \u
|
|
239
|
-
store<u64>(dstIdx, u16_to_hex4_swar(code), 4);
|
|
240
|
-
store<u64>(dstIdx, load<u64>(srcIdx, 1), 12);
|
|
241
|
-
bs.offset += 10;
|
|
242
|
-
} while (mask !== 0);
|
|
243
|
-
|
|
244
|
-
srcStart += 8;
|
|
245
|
-
bs.offset += 8;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
while (srcStart <= srcEnd - 2) {
|
|
249
|
-
const code = load<u16>(srcStart);
|
|
250
|
-
|
|
251
|
-
if (code == BACK_SLASH || code == QUOTE || code < 32) {
|
|
252
|
-
const escaped = load<u32>(SERIALIZE_ESCAPE_TABLE + (code << 2));
|
|
253
|
-
if ((escaped & 0xffff) != BACK_SLASH) {
|
|
254
|
-
bs.growSize(10);
|
|
255
|
-
store<u64>(bs.offset, U00_MARKER);
|
|
256
|
-
store<u32>(bs.offset, escaped, 8);
|
|
257
|
-
bs.offset += 12;
|
|
258
|
-
} else {
|
|
259
|
-
bs.growSize(2);
|
|
260
|
-
store<u32>(bs.offset, escaped);
|
|
261
|
-
bs.offset += 4;
|
|
262
|
-
}
|
|
263
|
-
srcStart += 2;
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
if (code < 0xd800 || code > 0xdfff) {
|
|
268
|
-
store<u16>(bs.offset, code);
|
|
269
|
-
bs.offset += 2;
|
|
270
|
-
srcStart += 2;
|
|
271
|
-
continue;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if (code <= 0xdbff && srcStart + 2 <= srcEnd - 2) {
|
|
275
|
-
const next = load<u16>(srcStart, 2);
|
|
276
|
-
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
277
|
-
// valid surrogate pair
|
|
278
|
-
store<u16>(bs.offset, code);
|
|
279
|
-
store<u16>(bs.offset + 2, next);
|
|
280
|
-
bs.offset += 4;
|
|
281
|
-
srcStart += 4;
|
|
282
|
-
continue;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// unpaired high/low surrogate
|
|
287
|
-
write_u_escape(code);
|
|
288
|
-
srcStart += 2;
|
|
289
|
-
continue;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
store<u16>(bs.offset, 34); // "
|
|
293
|
-
bs.offset += 2;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
177
|
// @ts-expect-error: @inline is a valid decorator
|
|
297
178
|
@inline function write_u_escape(code: u16): void {
|
|
298
179
|
bs.growSize(10);
|
|
@@ -308,21 +189,14 @@ export function serializeString_SWAR_ExperimentalTableEscapes(src: string): void
|
|
|
308
189
|
// Setting bit 8 of each 16-bit lane (high byte LSB) prevents borrow from a
|
|
309
190
|
// low byte underflow from propagating across lane boundaries into the next lane.
|
|
310
191
|
const loSafe = lo | 0x0100_0100_0100_0100;
|
|
311
|
-
const ascii_mask =
|
|
192
|
+
const ascii_mask =
|
|
193
|
+
((loSafe - 0x0020_0020_0020_0020) |
|
|
194
|
+
((loSafe ^ 0x0022_0022_0022_0022) - 0x0001_0001_0001_0001) |
|
|
195
|
+
((loSafe ^ 0x005c_005c_005c_005c) - 0x0001_0001_0001_0001)) &
|
|
196
|
+
(0x0080_0080_0080_0080 & ~lo);
|
|
312
197
|
if (hi == 0) return ascii_mask;
|
|
313
|
-
const hi_mask =
|
|
198
|
+
const hi_mask =
|
|
199
|
+
((block - 0x0100_0100_0100_0100) & ~block & 0x8000_8000_8000_8000) ^
|
|
200
|
+
0x8000_8000_8000_8000;
|
|
314
201
|
return (ascii_mask & (~hi_mask >> 8)) | hi_mask;
|
|
315
202
|
}
|
|
316
|
-
|
|
317
|
-
// @ts-expect-error: @inline is a valid decorator
|
|
318
|
-
@inline export function detect_escapable_u64_swar_unsafe(block: u64): u64 {
|
|
319
|
-
const lo = block & 0x00ff_00ff_00ff_00ff;
|
|
320
|
-
const loSafe = lo | 0x0100_0100_0100_0100;
|
|
321
|
-
const ascii_mask =
|
|
322
|
-
((loSafe - 0x0020_0020_0020_0020) | // lt 0x20
|
|
323
|
-
((loSafe ^ 0x0022_0022_0022_0022) - 0x0001_0001_0001_0001) | // eq 0x22
|
|
324
|
-
((loSafe ^ 0x005c_005c_005c_005c) - 0x0001_0001_0001_0001)) & // eq 0x5C
|
|
325
|
-
(0x0080_0080_0080_0080 & ~lo); // replace each lane with 0x80
|
|
326
|
-
const hi = block & 0xff00_ff00_ff00_ff00; // add possible non-ascii code units
|
|
327
|
-
return ascii_mask | hi;
|
|
328
|
-
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Back-compat shim. The canonical fast SWAR atoi/atou implementations live
|
|
2
|
+
// in `deserialize/swar/integer.ts`, using the full tiered stride hierarchy
|
|
3
|
+
// (parse16 -> parse8 -> parse4 -> scalar). These thin wrappers preserve the
|
|
4
|
+
// original `(srcStart, srcEnd, [dstPtr])` signatures used by existing tests
|
|
5
|
+
// and benches.
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
deserializeInteger_SWAR,
|
|
9
|
+
deserializeIntegerField_SWAR,
|
|
10
|
+
deserializeUnsigned_SWAR,
|
|
11
|
+
deserializeUnsignedField_SWAR,
|
|
12
|
+
} from "../deserialize/swar/integer";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Parse an unsigned integer by consuming the whole range as digits.
|
|
16
|
+
*
|
|
17
|
+
* @param srcStart Pointer to the first UTF-16 code unit.
|
|
18
|
+
* @param srcEnd Pointer just past the last code unit.
|
|
19
|
+
* @returns The parsed value, truncated to `T`.
|
|
20
|
+
*/
|
|
21
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
22
|
+
@inline export function atou<T extends number>(
|
|
23
|
+
srcStart: usize,
|
|
24
|
+
srcEnd: usize,
|
|
25
|
+
): T {
|
|
26
|
+
return deserializeUnsigned_SWAR<T>(srcStart, srcEnd);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Parse a signed integer by consuming the whole range as digits, with an
|
|
31
|
+
* optional leading `-`.
|
|
32
|
+
*
|
|
33
|
+
* @param srcStart Pointer to the first UTF-16 code unit.
|
|
34
|
+
* @param srcEnd Pointer just past the last code unit.
|
|
35
|
+
* @returns The parsed value, truncated to `T`.
|
|
36
|
+
*/
|
|
37
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
38
|
+
@inline export function atoi<T extends number>(
|
|
39
|
+
srcStart: usize,
|
|
40
|
+
srcEnd: usize,
|
|
41
|
+
): T {
|
|
42
|
+
return deserializeInteger_SWAR<T>(srcStart, srcEnd);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Scan an unsigned integer, stopping at the first non-digit. Writes the
|
|
47
|
+
* parsed value through `dstPtr` and returns the source position immediately
|
|
48
|
+
* after the last digit.
|
|
49
|
+
*
|
|
50
|
+
* @param srcStart Pointer to the first UTF-16 code unit.
|
|
51
|
+
* @param srcEnd Pointer just past the last code unit.
|
|
52
|
+
* @param dstPtr Destination pointer for the parsed value.
|
|
53
|
+
* @returns The source position immediately after the last digit consumed.
|
|
54
|
+
*/
|
|
55
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
56
|
+
@inline export function atouScan<T extends number>(
|
|
57
|
+
srcStart: usize,
|
|
58
|
+
srcEnd: usize,
|
|
59
|
+
dstPtr: usize,
|
|
60
|
+
): usize {
|
|
61
|
+
return deserializeUnsignedField_SWAR<T>(srcStart, srcEnd, dstPtr, 0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Scan a signed integer, stopping at the first non-digit. Handles an
|
|
66
|
+
* optional leading `-`. Writes the parsed value through `dstPtr` and
|
|
67
|
+
* returns the source position immediately after the last digit.
|
|
68
|
+
*
|
|
69
|
+
* @param srcStart Pointer to the first UTF-16 code unit.
|
|
70
|
+
* @param srcEnd Pointer just past the last code unit.
|
|
71
|
+
* @param dstPtr Destination pointer for the parsed value.
|
|
72
|
+
* @returns The source position immediately after the last digit consumed.
|
|
73
|
+
*/
|
|
74
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
75
|
+
@inline export function atoiScan<T extends number>(
|
|
76
|
+
srcStart: usize,
|
|
77
|
+
srcEnd: usize,
|
|
78
|
+
dstPtr: usize,
|
|
79
|
+
): usize {
|
|
80
|
+
return deserializeIntegerField_SWAR<T>(srcStart, srcEnd, dstPtr, 0);
|
|
81
|
+
}
|
package/assembly/util/concat.ts
CHANGED
|
@@ -4,6 +4,10 @@ export function concat(left: string, right: string): string {
|
|
|
4
4
|
const rightSize: usize = bytes(right);
|
|
5
5
|
const jointSize: usize = leftSize + rightSize;
|
|
6
6
|
const jointPtr = __renew(changetype<usize>(left), jointSize);
|
|
7
|
-
memory.copy(
|
|
7
|
+
memory.copy(
|
|
8
|
+
changetype<usize>(left) + leftSize,
|
|
9
|
+
changetype<usize>(right),
|
|
10
|
+
rightSize,
|
|
11
|
+
);
|
|
8
12
|
return changetype<string>(jointPtr);
|
|
9
13
|
}
|