json-as 1.3.5 → 1.3.7
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 +17 -1
- package/assembly/deserialize/helpers/uint.ts +4 -1
- package/assembly/deserialize/index/arbitrary.ts +5 -1
- package/assembly/deserialize/index/array.ts +13 -3
- package/assembly/deserialize/index/integer.ts +68 -1
- package/assembly/deserialize/index/string.ts +4 -1
- package/assembly/deserialize/index/typedarray.ts +13 -3
- package/assembly/deserialize/index/unsigned.ts +78 -1
- package/assembly/deserialize/simd/array/integer.ts +327 -50
- package/assembly/deserialize/simd/integer.ts +233 -0
- package/assembly/deserialize/simd/string.ts +45 -11
- package/assembly/deserialize/simple/arbitrary.ts +11 -4
- package/assembly/deserialize/simple/array/arbitrary.ts +24 -5
- package/assembly/deserialize/simple/array/array.ts +8 -2
- package/assembly/deserialize/simple/array/bool.ts +38 -7
- package/assembly/deserialize/simple/array/box.ts +8 -2
- package/assembly/deserialize/simple/array/float.ts +36 -9
- package/assembly/deserialize/simple/array/generic.ts +12 -4
- 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 +34 -7
- package/assembly/deserialize/simple/array/string.ts +8 -2
- package/assembly/deserialize/simple/array/struct.ts +26 -6
- package/assembly/deserialize/simple/array.ts +13 -3
- package/assembly/deserialize/simple/bool.ts +6 -2
- package/assembly/deserialize/simple/float.ts +6 -1
- package/assembly/deserialize/simple/integer.ts +10 -2
- package/assembly/deserialize/simple/map.ts +95 -22
- package/assembly/deserialize/simple/object.ts +63 -14
- package/assembly/deserialize/simple/raw.ts +4 -1
- package/assembly/deserialize/simple/set.ts +59 -14
- package/assembly/deserialize/simple/staticarray/string.ts +11 -3
- package/assembly/deserialize/simple/staticarray.ts +64 -14
- package/assembly/deserialize/simple/string.ts +5 -92
- package/assembly/deserialize/simple/struct.ts +5 -1
- package/assembly/deserialize/simple/typedarray.ts +16 -3
- package/assembly/deserialize/simple/unsigned.ts +10 -15
- package/assembly/deserialize/swar/array/arbitrary.ts +5 -1
- package/assembly/deserialize/swar/array/array.ts +30 -6
- package/assembly/deserialize/swar/array/bool.ts +22 -4
- package/assembly/deserialize/swar/array/box.ts +5 -1
- package/assembly/deserialize/swar/array/float.ts +15 -3
- package/assembly/deserialize/swar/array/generic.ts +24 -7
- package/assembly/deserialize/swar/array/integer.ts +328 -84
- package/assembly/deserialize/swar/array/map.ts +5 -1
- package/assembly/deserialize/swar/array/object.ts +27 -7
- package/assembly/deserialize/swar/array/raw.ts +5 -1
- package/assembly/deserialize/swar/array/shared.ts +36 -11
- package/assembly/deserialize/swar/array/string.ts +20 -4
- package/assembly/deserialize/swar/array/struct.ts +27 -7
- package/assembly/deserialize/swar/array.ts +19 -4
- package/assembly/deserialize/swar/integer.ts +246 -0
- package/assembly/deserialize/swar/string.ts +98 -194
- package/assembly/index.d.ts +3 -1
- package/assembly/index.ts +312 -81
- package/assembly/serialize/index/float.ts +5 -1
- package/assembly/serialize/index/typedarray.ts +25 -7
- package/assembly/serialize/simd/string.ts +6 -2
- package/assembly/serialize/simple/array.ts +179 -1
- package/assembly/serialize/simple/float.ts +4 -1
- package/assembly/serialize/simple/integer.ts +9 -9
- package/assembly/serialize/simple/map.ts +6 -2
- package/assembly/serialize/simple/raw.ts +5 -1
- package/assembly/serialize/simple/set.ts +6 -1
- package/assembly/serialize/simple/staticarray.ts +6 -1
- package/assembly/serialize/simple/string.ts +0 -1
- package/assembly/serialize/simple/typedarray.ts +10 -3
- package/assembly/serialize/swar/string.ts +25 -8
- package/assembly/tsconfig.json +1 -21
- 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 +43 -14
- package/assembly/util/itoa-fast.ts +230 -0
- package/assembly/util/masks.ts +18 -1
- package/assembly/util/parsefloat-fast.ts +167 -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 +13 -5
- package/package.json +12 -4
- 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 +1 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +1030 -241
- 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
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// 4-digit lane masks
|
|
2
|
+
const LANE_LO_4: u64 = 0x00ff_00ff_00ff_00ff;
|
|
3
|
+
const ZERO_4: u64 = 0x0030_0030_0030_0030;
|
|
4
|
+
const RANGE_ADD_4: u64 = 0x0006_0006_0006_0006;
|
|
5
|
+
const RANGE_MASK_4: u64 = 0xfff0_fff0_fff0_fff0;
|
|
6
|
+
|
|
7
|
+
// 32-bit-pair masks used by the pair-multiply fold
|
|
8
|
+
const U32_LO_PAIR: u64 = 0x0000_ffff_0000_ffff;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Magic multiplier for the 4-digit final combine.
|
|
12
|
+
*
|
|
13
|
+
* With `pairs = (cd << 32) | ab` where `ab` and `cd` are two-digit fold
|
|
14
|
+
* results each in `[0, 99]`, multiplying by this constant places
|
|
15
|
+
* `ab*100 + cd` in the high 32 bits via the u64 multiplication's cross-term.
|
|
16
|
+
* Taking the high 32 yields the 4-digit value `1000a + 100b + 10c + d`.
|
|
17
|
+
*/
|
|
18
|
+
const FINAL_4_MAGIC: u64 = 0x0000_0064_0000_0001;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Parse four UTF-16 ASCII digits in a `u64` into the 4-digit value, using
|
|
22
|
+
* the baseline scalar combine. Kept for reference and head-to-head benches.
|
|
23
|
+
*
|
|
24
|
+
* Returns `U32.MAX_VALUE` on any non-digit lane.
|
|
25
|
+
*
|
|
26
|
+
* @param block Four UTF-16 code units packed into a `u64`.
|
|
27
|
+
* @returns The parsed 4-digit value, or `U32.MAX_VALUE` on invalid input.
|
|
28
|
+
*/
|
|
29
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
30
|
+
@inline export function parse4Digits_Baseline(block: u64): u32 {
|
|
31
|
+
const digits = (block & LANE_LO_4) - ZERO_4;
|
|
32
|
+
if (((digits | (digits + RANGE_ADD_4)) & RANGE_MASK_4) != 0) {
|
|
33
|
+
return U32.MAX_VALUE;
|
|
34
|
+
}
|
|
35
|
+
return <u32>(
|
|
36
|
+
(<u32>(digits & 0xffff) * 1000 +
|
|
37
|
+
<u32>((digits >> 16) & 0xffff) * 100 +
|
|
38
|
+
<u32>((digits >> 32) & 0xffff) * 10 +
|
|
39
|
+
<u32>(digits >> 48))
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parse four UTF-16 ASCII digits into the 4-digit value.
|
|
45
|
+
*
|
|
46
|
+
* Three Lemire-inspired op reductions vs the baseline:
|
|
47
|
+
*
|
|
48
|
+
* 1. Skip the initial `& LANE_LO_4` mask. For valid UTF-16 ASCII the high
|
|
49
|
+
* byte of each lane is already 0, so the AND is redundant. Validation
|
|
50
|
+
* runs before any multiply and rejects every input where dropping the
|
|
51
|
+
* AND would produce inter-lane carry corruption.
|
|
52
|
+
* 2. Mul-then-mask pair fold: apply `digits * 10 + (digits >> 16)` to the
|
|
53
|
+
* whole `u64` and mask after. Saves one AND vs the lane-isolated form.
|
|
54
|
+
* 3. Magic-multiplier final combine: see {@link FINAL_4_MAGIC}.
|
|
55
|
+
*
|
|
56
|
+
* Returns `U32.MAX_VALUE` on any non-digit lane.
|
|
57
|
+
*
|
|
58
|
+
* @param block Four UTF-16 code units packed into a `u64`.
|
|
59
|
+
* @returns The parsed 4-digit value, or `U32.MAX_VALUE` on invalid input.
|
|
60
|
+
*/
|
|
61
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
62
|
+
@inline export function parse4Digits_PairMul(block: u64): u32 {
|
|
63
|
+
const digits = block - ZERO_4;
|
|
64
|
+
if (((digits | (digits + RANGE_ADD_4)) & RANGE_MASK_4) != 0) {
|
|
65
|
+
return U32.MAX_VALUE;
|
|
66
|
+
}
|
|
67
|
+
const pairs = (digits * 10 + (digits >> 16)) & U32_LO_PAIR;
|
|
68
|
+
return <u32>((pairs * FINAL_4_MAGIC) >> 32);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Same as {@link parse4Digits_PairMul} but with the validation step removed.
|
|
73
|
+
* Used in consume-to-end paths where the caller has already bounded the
|
|
74
|
+
* digit range, so per-stride validation isn't needed.
|
|
75
|
+
*
|
|
76
|
+
* @param block Four UTF-16 code units packed into a `u64`.
|
|
77
|
+
* @returns The parsed 4-digit value.
|
|
78
|
+
*/
|
|
79
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
80
|
+
@inline export function parse4Digits_PairMul_Unsafe(block: u64): u32 {
|
|
81
|
+
const digits = block - ZERO_4;
|
|
82
|
+
const pairs = (digits * 10 + (digits >> 16)) & U32_LO_PAIR;
|
|
83
|
+
return <u32>((pairs * FINAL_4_MAGIC) >> 32);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Parse eight UTF-16 ASCII digits across two `u64` blocks into one 8-digit
|
|
88
|
+
* `u32` value.
|
|
89
|
+
*
|
|
90
|
+
* Caller passes two consecutive `u64` loads (16 source bytes). Validates
|
|
91
|
+
* both halves with one combined check, then folds each half via
|
|
92
|
+
* {@link parse4Digits_PairMul} and combines as `lo * 10_000 + hi`.
|
|
93
|
+
*
|
|
94
|
+
* Returns `U32.MAX_VALUE` on any non-digit lane.
|
|
95
|
+
*
|
|
96
|
+
* @param lo The first `u64`, four UTF-16 code units.
|
|
97
|
+
* @param hi The second `u64`, four UTF-16 code units.
|
|
98
|
+
* @returns The parsed 8-digit value, or `U32.MAX_VALUE` on invalid input.
|
|
99
|
+
*/
|
|
100
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
101
|
+
@inline export function parse8Digits_PairMul(lo: u64, hi: u64): u32 {
|
|
102
|
+
const loDigits = lo - ZERO_4;
|
|
103
|
+
const hiDigits = hi - ZERO_4;
|
|
104
|
+
const bad =
|
|
105
|
+
(loDigits |
|
|
106
|
+
(loDigits + RANGE_ADD_4) |
|
|
107
|
+
hiDigits |
|
|
108
|
+
(hiDigits + RANGE_ADD_4)) &
|
|
109
|
+
RANGE_MASK_4;
|
|
110
|
+
if (bad != 0) return U32.MAX_VALUE;
|
|
111
|
+
|
|
112
|
+
const loPairs = (loDigits * 10 + (loDigits >> 16)) & U32_LO_PAIR;
|
|
113
|
+
const hiPairs = (hiDigits * 10 + (hiDigits >> 16)) & U32_LO_PAIR;
|
|
114
|
+
const loVal = <u32>((loPairs * FINAL_4_MAGIC) >> 32);
|
|
115
|
+
const hiVal = <u32>((hiPairs * FINAL_4_MAGIC) >> 32);
|
|
116
|
+
return loVal * 10_000 + hiVal;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Same as {@link parse8Digits_PairMul} but with the validation step removed.
|
|
121
|
+
* Used in consume-to-end paths.
|
|
122
|
+
*
|
|
123
|
+
* @param lo The first `u64`, four UTF-16 code units.
|
|
124
|
+
* @param hi The second `u64`, four UTF-16 code units.
|
|
125
|
+
* @returns The parsed 8-digit value.
|
|
126
|
+
*/
|
|
127
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
128
|
+
@inline export function parse8Digits_PairMul_Unsafe(lo: u64, hi: u64): u32 {
|
|
129
|
+
const loDigits = lo - ZERO_4;
|
|
130
|
+
const hiDigits = hi - ZERO_4;
|
|
131
|
+
const loPairs = (loDigits * 10 + (loDigits >> 16)) & U32_LO_PAIR;
|
|
132
|
+
const hiPairs = (hiDigits * 10 + (hiDigits >> 16)) & U32_LO_PAIR;
|
|
133
|
+
const loVal = <u32>((loPairs * FINAL_4_MAGIC) >> 32);
|
|
134
|
+
const hiVal = <u32>((hiPairs * FINAL_4_MAGIC) >> 32);
|
|
135
|
+
return loVal * 10_000 + hiVal;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Non-digit lane mask for a `u64` holding four UTF-16 code units. Returns a
|
|
140
|
+
* `u64` with bit 7 of each non-digit lane set, or 0 if all four lanes are
|
|
141
|
+
* valid ASCII `'0'..'9'`. Lets a caller find the digit-run boundary in one
|
|
142
|
+
* SWAR step:
|
|
143
|
+
*
|
|
144
|
+
* ```ts
|
|
145
|
+
* const mask = nonDigitMask4(block);
|
|
146
|
+
* if (mask == 0) { /* all valid *\/ }
|
|
147
|
+
* else { const laneIdx = ctz(mask) >> 3; /* first bad byte *\/ }
|
|
148
|
+
* ```
|
|
149
|
+
*
|
|
150
|
+
* @param block Four UTF-16 code units packed into a `u64`.
|
|
151
|
+
* @returns A mask with non-digit lanes flagged in their high bit, or 0.
|
|
152
|
+
*/
|
|
153
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
154
|
+
@inline export function nonDigitMask4(block: u64): u64 {
|
|
155
|
+
const digits = (block & LANE_LO_4) - ZERO_4;
|
|
156
|
+
return (digits | (digits + RANGE_ADD_4)) & RANGE_MASK_4;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Parse sixteen UTF-16 ASCII digits (32 source bytes) into one 16-digit
|
|
161
|
+
* `u64` value.
|
|
162
|
+
*
|
|
163
|
+
* Mirrors the SIMD 16-digit parser's shape using pure SWAR. Four `u64`
|
|
164
|
+
* loads, one combined validation mask, four independent 4-digit folds (each
|
|
165
|
+
* a chance for the engine to issue them in parallel), then a parallel-pair
|
|
166
|
+
* tree combine.
|
|
167
|
+
*
|
|
168
|
+
* Best for long-integer atoi: one branch covers 16 digits, the four folds
|
|
169
|
+
* have no cross-dependencies, and the final combine forms two independent
|
|
170
|
+
* 8-digit values that merge in one mul-add.
|
|
171
|
+
*
|
|
172
|
+
* Returns `U64.MAX_VALUE` on any non-digit lane.
|
|
173
|
+
*
|
|
174
|
+
* @param srcStart Pointer to the start of 32 source bytes (16 UTF-16 chars).
|
|
175
|
+
* @returns The parsed 16-digit value, or `U64.MAX_VALUE` on invalid input.
|
|
176
|
+
*/
|
|
177
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
178
|
+
@inline export function parse16Digits_SWAR(srcStart: usize): u64 {
|
|
179
|
+
const b0 = load<u64>(srcStart);
|
|
180
|
+
const b1 = load<u64>(srcStart, 8);
|
|
181
|
+
const b2 = load<u64>(srcStart, 16);
|
|
182
|
+
const b3 = load<u64>(srcStart, 24);
|
|
183
|
+
|
|
184
|
+
const d0 = b0 - ZERO_4;
|
|
185
|
+
const d1 = b1 - ZERO_4;
|
|
186
|
+
const d2 = b2 - ZERO_4;
|
|
187
|
+
const d3 = b3 - ZERO_4;
|
|
188
|
+
|
|
189
|
+
const bad =
|
|
190
|
+
(d0 |
|
|
191
|
+
(d0 + RANGE_ADD_4) |
|
|
192
|
+
d1 |
|
|
193
|
+
(d1 + RANGE_ADD_4) |
|
|
194
|
+
d2 |
|
|
195
|
+
(d2 + RANGE_ADD_4) |
|
|
196
|
+
d3 |
|
|
197
|
+
(d3 + RANGE_ADD_4)) &
|
|
198
|
+
RANGE_MASK_4;
|
|
199
|
+
if (bad != 0) return U64.MAX_VALUE;
|
|
200
|
+
|
|
201
|
+
const p0 = (d0 * 10 + (d0 >> 16)) & U32_LO_PAIR;
|
|
202
|
+
const p1 = (d1 * 10 + (d1 >> 16)) & U32_LO_PAIR;
|
|
203
|
+
const p2 = (d2 * 10 + (d2 >> 16)) & U32_LO_PAIR;
|
|
204
|
+
const p3 = (d3 * 10 + (d3 >> 16)) & U32_LO_PAIR;
|
|
205
|
+
|
|
206
|
+
const v0 = <u32>((p0 * FINAL_4_MAGIC) >> 32);
|
|
207
|
+
const v1 = <u32>((p1 * FINAL_4_MAGIC) >> 32);
|
|
208
|
+
const v2 = <u32>((p2 * FINAL_4_MAGIC) >> 32);
|
|
209
|
+
const v3 = <u32>((p3 * FINAL_4_MAGIC) >> 32);
|
|
210
|
+
|
|
211
|
+
const pair01 = <u64>v0 * 10_000 + <u64>v1;
|
|
212
|
+
const pair23 = <u64>v2 * 10_000 + <u64>v3;
|
|
213
|
+
return pair01 * 100_000_000 + pair23;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Same as {@link parse16Digits_SWAR} but with the validation step removed.
|
|
218
|
+
* Used in consume-to-end paths.
|
|
219
|
+
*
|
|
220
|
+
* @param srcStart Pointer to the start of 32 source bytes (16 UTF-16 chars).
|
|
221
|
+
* @returns The parsed 16-digit value.
|
|
222
|
+
*/
|
|
223
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
224
|
+
@inline export function parse16Digits_SWAR_Unsafe(srcStart: usize): u64 {
|
|
225
|
+
const b0 = load<u64>(srcStart);
|
|
226
|
+
const b1 = load<u64>(srcStart, 8);
|
|
227
|
+
const b2 = load<u64>(srcStart, 16);
|
|
228
|
+
const b3 = load<u64>(srcStart, 24);
|
|
229
|
+
|
|
230
|
+
const d0 = b0 - ZERO_4;
|
|
231
|
+
const d1 = b1 - ZERO_4;
|
|
232
|
+
const d2 = b2 - ZERO_4;
|
|
233
|
+
const d3 = b3 - ZERO_4;
|
|
234
|
+
|
|
235
|
+
const p0 = (d0 * 10 + (d0 >> 16)) & U32_LO_PAIR;
|
|
236
|
+
const p1 = (d1 * 10 + (d1 >> 16)) & U32_LO_PAIR;
|
|
237
|
+
const p2 = (d2 * 10 + (d2 >> 16)) & U32_LO_PAIR;
|
|
238
|
+
const p3 = (d3 * 10 + (d3 >> 16)) & U32_LO_PAIR;
|
|
239
|
+
|
|
240
|
+
const v0 = <u32>((p0 * FINAL_4_MAGIC) >> 32);
|
|
241
|
+
const v1 = <u32>((p1 * FINAL_4_MAGIC) >> 32);
|
|
242
|
+
const v2 = <u32>((p2 * FINAL_4_MAGIC) >> 32);
|
|
243
|
+
const v3 = <u32>((p3 * FINAL_4_MAGIC) >> 32);
|
|
244
|
+
|
|
245
|
+
const pair01 = <u64>v0 * 10_000 + <u64>v1;
|
|
246
|
+
const pair23 = <u64>v2 * 10_000 + <u64>v3;
|
|
247
|
+
return pair01 * 100_000_000 + pair23;
|
|
248
|
+
}
|
package/assembly/util/swar.ts
CHANGED
|
@@ -23,7 +23,12 @@
|
|
|
23
23
|
// (c & 0xF) + 9 * (c >> 6)
|
|
24
24
|
block = (block & 0x0f000f000f000f) + ((block >> 6) & 0x03000300030003) * 9;
|
|
25
25
|
|
|
26
|
-
return <u16>(
|
|
26
|
+
return <u16>(
|
|
27
|
+
(((block >> 0) << 12) |
|
|
28
|
+
((block >> 16) << 8) |
|
|
29
|
+
((block >> 32) << 4) |
|
|
30
|
+
(block >> 48))
|
|
31
|
+
);
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
/**
|
|
@@ -48,9 +53,14 @@
|
|
|
48
53
|
*/
|
|
49
54
|
// @ts-expect-error: @inline is a valid decorator
|
|
50
55
|
@inline export function u16_to_hex4_swar(code: u16): u64 {
|
|
51
|
-
let block =
|
|
56
|
+
let block =
|
|
57
|
+
(<u64>((code >> 12) & 0xf)) |
|
|
58
|
+
((<u64>((code >> 8) & 0xf)) << 16) |
|
|
59
|
+
((<u64>((code >> 4) & 0xf)) << 32) |
|
|
60
|
+
((<u64>(code & 0xf)) << 48);
|
|
52
61
|
|
|
53
|
-
const alphaMask =
|
|
62
|
+
const alphaMask =
|
|
63
|
+
((block + 0x0006_0006_0006_0006) >> 4) & 0x0001_0001_0001_0001;
|
|
54
64
|
block += 0x0030_0030_0030_0030 + alphaMask * 39;
|
|
55
65
|
return block;
|
|
56
66
|
}
|
package/lib/as-bs.ts
CHANGED
|
@@ -180,7 +180,8 @@ export namespace bs {
|
|
|
180
180
|
memory.copy(_out, buffer, len);
|
|
181
181
|
return changetype<T>(_out);
|
|
182
182
|
} else {
|
|
183
|
-
const pauseOffset =
|
|
183
|
+
const pauseOffset =
|
|
184
|
+
buffer + unchecked(pauseOffsets[pauseOffsets.length - 1]);
|
|
184
185
|
const len = offset - pauseOffset;
|
|
185
186
|
// @ts-expect-error: __new is a runtime builtin
|
|
186
187
|
const _out = __new(len, idof<T>());
|
|
@@ -330,15 +331,22 @@ export namespace sc {
|
|
|
330
331
|
// @ts-expect-error: JSON_CACHE may not be defined. If so, it will default to false.
|
|
331
332
|
export const CACHE_ENABLED: bool = isDefined(JSON_CACHE) ? JSON_CACHE : false;
|
|
332
333
|
// @ts-expect-error: JSON_CACHE_SIZE may not be defined. If so, it will default to 1MB.
|
|
333
|
-
export const CACHE_BYTES: usize = isDefined(JSON_CACHE_SIZE)
|
|
334
|
+
export const CACHE_BYTES: usize = isDefined(JSON_CACHE_SIZE)
|
|
335
|
+
? <usize>JSON_CACHE_SIZE
|
|
336
|
+
: 1 << 20;
|
|
334
337
|
/** Minimum serialized length to cache - smaller outputs aren't worth caching */
|
|
335
338
|
export const MIN_CACHE_LEN: usize = 128;
|
|
336
339
|
/** Size of the circular arena buffer for cached strings */
|
|
337
|
-
export const ARENA_SIZE: usize =
|
|
340
|
+
export const ARENA_SIZE: usize =
|
|
341
|
+
CACHE_BYTES >= MIN_CACHE_LEN ? CACHE_BYTES : MIN_CACHE_LEN;
|
|
338
342
|
|
|
339
343
|
/** Number of cache slots (power of 2 for efficient masking). Set to 0 when caching disabled. */
|
|
340
|
-
const CACHE_SIZE_BASE: i32 = CACHE_ENABLED
|
|
341
|
-
|
|
344
|
+
const CACHE_SIZE_BASE: i32 = CACHE_ENABLED
|
|
345
|
+
? i32(ARENA_SIZE >> 10 >= 1 ? ARENA_SIZE >> 10 : 1)
|
|
346
|
+
: 0;
|
|
347
|
+
export const CACHE_SIZE: usize = CACHE_ENABLED
|
|
348
|
+
? <usize>(1 << (32 - clz<i32>(CACHE_SIZE_BASE - 1)))
|
|
349
|
+
: 0;
|
|
342
350
|
/** Bitmask for fast modulo operation on cache index */
|
|
343
351
|
export const CACHE_MASK: usize = CACHE_SIZE > 0 ? CACHE_SIZE - 1 : 0;
|
|
344
352
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.7",
|
|
4
4
|
"author": "Jairus Tanaka",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -12,15 +12,18 @@
|
|
|
12
12
|
"@assemblyscript/wasi-shim": "^0.1.0",
|
|
13
13
|
"@eslint/js": "^10.0.1",
|
|
14
14
|
"@types/node": "^25.6.2",
|
|
15
|
-
"as-test": "1.
|
|
15
|
+
"as-test": "^1.1.10",
|
|
16
16
|
"assemblyscript": "^0.28.17",
|
|
17
17
|
"assemblyscript-prettier": "^3.0.4",
|
|
18
18
|
"chartjs-node-canvas": "^5.0.0",
|
|
19
19
|
"chartjs-plugin-datalabels": "^2.2.0",
|
|
20
20
|
"eslint": "^10.3.0",
|
|
21
|
+
"husky": "^9.1.7",
|
|
22
|
+
"json-as": "./",
|
|
21
23
|
"prettier": "3.8.3",
|
|
22
24
|
"serve": "^14.2.6",
|
|
23
25
|
"tinybench": "^6.0.1",
|
|
26
|
+
"try-as": "^1.0.1",
|
|
24
27
|
"typescript": "^6.0.3",
|
|
25
28
|
"typescript-eslint": "^8.59.2"
|
|
26
29
|
},
|
|
@@ -83,12 +86,13 @@
|
|
|
83
86
|
"scripts": {
|
|
84
87
|
"ci": "act",
|
|
85
88
|
"test": "ast test --parallel",
|
|
89
|
+
"test:transform": "node transform/__tests__/normalize-base-rel.test.mjs",
|
|
86
90
|
"test:fast": "npm run build:transform && JSON_USE_FAST_PATH=1 ast test --parallel --mode swar,simd",
|
|
87
91
|
"fuzz": "ast fuzz",
|
|
88
92
|
"test:fuzz": "ast test --fuzz --parallel",
|
|
89
93
|
"test:ci": "ast test --parallel --clean",
|
|
90
94
|
"test:coverage": "ast test --enable coverage",
|
|
91
|
-
"bench": "
|
|
95
|
+
"bench": "bash -c 'bash ./scripts/run-bench.as.sh \"$@\" && { arg=\"${1:-}\"; if [ -z \"$arg\" ] || [ \"${arg#custom/}\" = \"$arg\" ]; then bash ./scripts/run-bench.js.sh \"$@\"; fi; } && bash ./scripts/build-charts.sh' --",
|
|
92
96
|
"bench:as": "bash ./scripts/run-bench.as.sh",
|
|
93
97
|
"bench:js": "bash ./scripts/run-bench.js.sh",
|
|
94
98
|
"charts": "bun run charts:build && bun run charts:serve",
|
|
@@ -105,12 +109,16 @@
|
|
|
105
109
|
"format": "prettier -w .",
|
|
106
110
|
"lint": "eslint . --no-warn-ignored",
|
|
107
111
|
"lint:fix": "eslint . --fix --no-warn-ignored",
|
|
112
|
+
"commitmsg:verify": "bash ./scripts/commit-msg.sh",
|
|
113
|
+
"precommit:verify": "bash ./scripts/pre-commit.sh",
|
|
114
|
+
"prepush:verify": "bash ./scripts/pre-push.sh",
|
|
108
115
|
"typecheck": "tsc -p ./transform --noEmit",
|
|
109
116
|
"clean": "rm -rf build/ transform/lib/",
|
|
110
117
|
"prebuild": "npm run clean",
|
|
111
118
|
"build": "npm run build:transform",
|
|
112
119
|
"pretest": "npm run build:transform",
|
|
113
|
-
"check": "npm run typecheck && npm run lint"
|
|
120
|
+
"check": "npm run typecheck && npm run lint",
|
|
121
|
+
"prepare": "husky"
|
|
114
122
|
},
|
|
115
123
|
"type": "module",
|
|
116
124
|
"types": "assembly/index.ts"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|
package/transform/lib/builder.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isTypeOmitted, operatorTokenToString, util } from "assemblyscript/dist/assemblyscript.js";
|
|
1
|
+
import { isTypeOmitted, operatorTokenToString, util, } from "assemblyscript/dist/assemblyscript.js";
|
|
2
2
|
import { NodeKind } from "./types.js";
|
|
3
3
|
import { Visitor } from "./visitor.js";
|
|
4
4
|
function assert(isTruish, message = "assertion error") {
|
|
@@ -523,7 +523,9 @@ export class ASTBuilder extends Visitor {
|
|
|
523
523
|
else {
|
|
524
524
|
const last = sb[sb.length - 1];
|
|
525
525
|
const lastCharPos = last.length - 1;
|
|
526
|
-
if (lastCharPos >= 0 &&
|
|
526
|
+
if (lastCharPos >= 0 &&
|
|
527
|
+
(last.charCodeAt(lastCharPos) == 125 ||
|
|
528
|
+
last.charCodeAt(lastCharPos) == 59)) {
|
|
527
529
|
sb.push("\n");
|
|
528
530
|
}
|
|
529
531
|
else {
|
|
@@ -631,7 +633,8 @@ export class ASTBuilder extends Visitor {
|
|
|
631
633
|
}
|
|
632
634
|
for (let i = 0, k = members.length; i < k; ++i) {
|
|
633
635
|
const member = members[i];
|
|
634
|
-
if (member.kind != NodeKind.FieldDeclaration ||
|
|
636
|
+
if (member.kind != NodeKind.FieldDeclaration ||
|
|
637
|
+
member.parameterIndex < 0) {
|
|
635
638
|
util.indent(sb, indentLevel);
|
|
636
639
|
this.visitNodeAndTerminate(member);
|
|
637
640
|
}
|
|
@@ -926,7 +929,8 @@ export class ASTBuilder extends Visitor {
|
|
|
926
929
|
}
|
|
927
930
|
}
|
|
928
931
|
else {
|
|
929
|
-
if (!isTypeOmitted(returnType) &&
|
|
932
|
+
if (!isTypeOmitted(returnType) &&
|
|
933
|
+
!node.isAny(524288 | 4096)) {
|
|
930
934
|
sb.push("): ");
|
|
931
935
|
this.visitTypeNode(returnType);
|
|
932
936
|
}
|
|
@@ -1247,7 +1251,11 @@ export class ASTBuilder extends Visitor {
|
|
|
1247
1251
|
const numDeclarations = declarations.length;
|
|
1248
1252
|
const firstDeclaration = declarations[0];
|
|
1249
1253
|
this.serializeExternalModifiers(firstDeclaration);
|
|
1250
|
-
sb.push(firstDeclaration.is(8)
|
|
1254
|
+
sb.push(firstDeclaration.is(8)
|
|
1255
|
+
? "const "
|
|
1256
|
+
: firstDeclaration.is(16)
|
|
1257
|
+
? "let "
|
|
1258
|
+
: "var ");
|
|
1251
1259
|
this.visitVariableDeclaration(node.declarations[0]);
|
|
1252
1260
|
for (let i = 1; i < numDeclarations; ++i) {
|
|
1253
1261
|
sb.push(", ");
|