json-as 1.3.0 → 1.3.2
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 +400 -0
- package/README.md +137 -32
- package/assembly/deserialize/index/arbitrary.ts +1 -1
- package/assembly/deserialize/index/array.ts +6 -1
- package/assembly/deserialize/index/float.ts +1 -1
- package/assembly/deserialize/index/integer.ts +1 -1
- package/assembly/deserialize/index/typedarray.ts +14 -0
- package/assembly/deserialize/index/unsigned.ts +1 -1
- package/assembly/deserialize/simd/string.ts +20 -16
- package/assembly/deserialize/simple/arbitrary.ts +1 -1
- package/assembly/deserialize/simple/array/generic.ts +42 -0
- package/assembly/deserialize/simple/array.ts +8 -1
- package/assembly/deserialize/{float.ts → simple/float.ts} +22 -2
- package/assembly/deserialize/{integer.ts → simple/integer.ts} +3 -2
- package/assembly/deserialize/simple/map.ts +60 -12
- package/assembly/deserialize/simple/object.ts +1 -1
- package/assembly/deserialize/simple/set.ts +119 -134
- package/assembly/deserialize/simple/staticarray.ts +12 -1
- package/assembly/deserialize/simple/string.ts +93 -2
- package/assembly/deserialize/simple/struct.ts +7 -157
- package/assembly/deserialize/simple/typedarray.ts +1 -1
- package/assembly/deserialize/{unsigned.ts → simple/unsigned.ts} +3 -2
- package/assembly/deserialize/swar/array/array.ts +42 -7
- package/assembly/deserialize/swar/array/bool.ts +5 -2
- package/assembly/deserialize/swar/array/float.ts +7 -3
- package/assembly/deserialize/swar/array/generic.ts +40 -0
- package/assembly/deserialize/swar/array/integer.ts +7 -4
- package/assembly/deserialize/swar/array/object.ts +20 -4
- package/assembly/deserialize/swar/array/shared.ts +18 -4
- package/assembly/deserialize/swar/array/string.ts +5 -2
- package/assembly/deserialize/swar/array/struct.ts +20 -4
- package/assembly/deserialize/swar/array.ts +56 -2
- package/assembly/deserialize/swar/string.ts +245 -370
- package/assembly/index.ts +207 -194
- package/assembly/serialize/index/arbitrary.ts +8 -3
- package/assembly/serialize/index/float.ts +1 -1
- package/assembly/serialize/index/object.ts +1 -5
- package/assembly/serialize/index/typedarray.ts +65 -0
- package/assembly/serialize/simd/string.ts +7 -16
- package/assembly/serialize/simple/arbitrary.ts +9 -3
- package/assembly/serialize/simple/array.ts +17 -6
- package/assembly/serialize/simple/float.ts +18 -4
- package/assembly/serialize/simple/map.ts +10 -27
- package/assembly/serialize/simple/object.ts +1 -5
- package/assembly/serialize/simple/set.ts +3 -4
- package/assembly/serialize/simple/staticarray.ts +4 -3
- package/assembly/serialize/simple/string.ts +3 -11
- package/assembly/serialize/simple/typedarray.ts +9 -7
- package/assembly/serialize/swar/string.ts +3 -12
- package/assembly/tsconfig.json +3 -2
- package/assembly/util/dragonbox-cache.ts +1322 -0
- package/assembly/util/dragonbox.ts +596 -0
- package/assembly/util/swar.ts +49 -0
- package/lib/as-bs.ts +92 -70
- package/package.json +35 -10
- package/transform/lib/index.d.ts +1 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +559 -221
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/custom.d.ts.map +1 -1
- package/transform/lib/linkers/custom.js +7 -3
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/types.d.ts +2 -0
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +13 -0
- package/transform/lib/types.js.map +1 -1
- package/.as-test/coverage/naive/coverage.arbitrary.spec.ts.log.json +0 -5628
- package/.as-test/coverage/naive/coverage.array.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.bool.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.box.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.custom.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.date.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.enum.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.float.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.generics.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.hierarchy.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.integer.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.map.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.namespace.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.null.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.raw.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.resolving.spec.ts.log.json +0 -5628
- package/.as-test/coverage/naive/coverage.set.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.staticarray.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.string.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.struct.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.types.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.arbitrary.spec.ts.log.json +0 -5628
- package/.as-test/coverage/simd/coverage.array.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.bool.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.box.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.custom.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.date.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.enum.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.float.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.generics.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.hierarchy.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.integer.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.map.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.namespace.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.null.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.raw.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.resolving.spec.ts.log.json +0 -5628
- package/.as-test/coverage/simd/coverage.set.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.staticarray.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.string.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.struct.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.types.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.arbitrary.spec.ts.log.json +0 -5628
- package/.as-test/coverage/swar/coverage.array.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.bool.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.box.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.custom.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.date.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.enum.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.float.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.generics.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.hierarchy.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.integer.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.map.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.namespace.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.null.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.raw.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.resolving.spec.ts.log.json +0 -5628
- package/.as-test/coverage/swar/coverage.set.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.staticarray.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.string.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.struct.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.types.spec.ts.log.json +0 -5187
- package/.as-test/logs/naive/run.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/naive/run.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/naive/run.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/naive/run.box.spec.ts.log.json +0 -353
- package/.as-test/logs/naive/run.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/run.date.spec.ts.log.json +0 -397
- package/.as-test/logs/naive/run.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/naive/run.float.spec.ts.log.json +0 -453
- package/.as-test/logs/naive/run.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/naive/run.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/naive/run.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/naive/run.map.spec.ts.log.json +0 -247
- package/.as-test/logs/naive/run.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/naive/run.null.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/run.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/run.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/run.set.spec.ts.log.json +0 -733
- package/.as-test/logs/naive/run.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/naive/run.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/naive/run.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/naive/run.types.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/naive/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/naive/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/naive/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/naive/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/naive/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/naive/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/naive/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/naive/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/naive/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/naive/test.log.json +0 -2289
- package/.as-test/logs/naive/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/naive/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/naive/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/naive/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/naive/test.string.spec.ts.log.json +0 -2345
- package/.as-test/logs/naive/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/naive/test.types.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/run.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/simd/run.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/simd/run.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/simd/run.box.spec.ts.log.json +0 -353
- package/.as-test/logs/simd/run.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/run.date.spec.ts.log.json +0 -397
- package/.as-test/logs/simd/run.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/simd/run.float.spec.ts.log.json +0 -453
- package/.as-test/logs/simd/run.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/simd/run.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/simd/run.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/simd/run.map.spec.ts.log.json +0 -247
- package/.as-test/logs/simd/run.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/simd/run.null.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/run.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/run.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/run.set.spec.ts.log.json +0 -733
- package/.as-test/logs/simd/run.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/simd/run.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/simd/run.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/simd/run.types.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/simd/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/simd/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/simd/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/simd/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/simd/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/simd/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/simd/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/simd/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/simd/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/simd/test.log.json +0 -11371
- package/.as-test/logs/simd/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/simd/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/simd/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/simd/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/simd/test.string.spec.ts.log.json +0 -2345
- package/.as-test/logs/simd/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/simd/test.types.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/run.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/swar/run.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/swar/run.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/swar/run.box.spec.ts.log.json +0 -353
- package/.as-test/logs/swar/run.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/run.date.spec.ts.log.json +0 -397
- package/.as-test/logs/swar/run.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/swar/run.float.spec.ts.log.json +0 -453
- package/.as-test/logs/swar/run.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/swar/run.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/swar/run.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/swar/run.map.spec.ts.log.json +0 -247
- package/.as-test/logs/swar/run.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/swar/run.null.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/run.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/run.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/run.set.spec.ts.log.json +0 -733
- package/.as-test/logs/swar/run.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/swar/run.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/swar/run.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/swar/run.types.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/swar/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/swar/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/swar/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/swar/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/swar/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/swar/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/swar/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/swar/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/swar/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/swar/test.log.json +0 -11371
- package/.as-test/logs/swar/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/swar/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/swar/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/swar/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/swar/test.string.spec.ts.log.json +0 -2345
- package/.as-test/logs/swar/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/swar/test.types.spec.ts.log.json +0 -273
- package/.as-test/logs/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/test.log.json +0 -11371
- package/.as-test/logs/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/test.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/test.types.spec.ts.log.json +0 -273
- package/.as-test/runners/default.bindings.js +0 -68
- package/.as-test/runners/default.wasi.js +0 -38
- package/ARCHITECTURE.md +0 -323
- package/CONTRIBUTING.md +0 -244
- package/TODO +0 -1
- package/as-test.config.json +0 -40
- package/assembly/test.ts +0 -24
- package/eslint.config.js +0 -68
- package/lib/tsconfig.json +0 -8
- package/test.ts +0 -99
- package/tools/assemblyscript-eslint-local.js +0 -6
- package/tools/assemblyscript-eslint.js +0 -53
- package/tools/assemblyscript-prettier-plugin.js +0 -33
- package/tools/replacer.js +0 -63
- package/transform/tsconfig.json +0 -35
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { bs } from "../../../lib/as-bs";
|
|
2
2
|
import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
|
|
3
|
+
import { __heap_base } from "memory";
|
|
3
4
|
import { BACK_SLASH, QUOTE } from "../../custom/chars";
|
|
4
5
|
import { DESERIALIZE_ESCAPE_TABLE } from "../../globals/tables";
|
|
5
6
|
import { hex4_to_u16_swar } from "../../util/swar";
|
|
@@ -43,7 +44,6 @@ import { hex4_to_u16_swar } from "../../util/swar";
|
|
|
43
44
|
// @ts-expect-error: @inline is a valid decorator
|
|
44
45
|
@inline function copyStringFromSource(srcStart: usize, byteLength: usize): string {
|
|
45
46
|
if (byteLength == 0) return changetype<string>("");
|
|
46
|
-
// @ts-expect-error: __new is a runtime builtin
|
|
47
47
|
const out = __new(byteLength, idof<string>());
|
|
48
48
|
memory.copy(out, srcStart, byteLength);
|
|
49
49
|
return changetype<string>(out);
|
|
@@ -53,10 +53,10 @@ import { hex4_to_u16_swar } from "../../util/swar";
|
|
|
53
53
|
@inline function deserializeEscapedString_SWAR(payloadStart: usize, escapeStart: usize, srcEnd: usize): string {
|
|
54
54
|
const srcEnd8 = srcEnd - 8;
|
|
55
55
|
const prefixLen = <u32>(escapeStart - payloadStart);
|
|
56
|
-
bs.offset
|
|
56
|
+
const outStart = bs.offset - bs.buffer;
|
|
57
57
|
bs.ensureSize(<u32>(srcEnd - payloadStart));
|
|
58
58
|
if (prefixLen != 0) {
|
|
59
|
-
memory.copy(bs.
|
|
59
|
+
memory.copy(bs.offset, payloadStart, prefixLen);
|
|
60
60
|
bs.offset += prefixLen;
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -141,7 +141,7 @@ import { hex4_to_u16_swar } from "../../util/swar";
|
|
|
141
141
|
|
|
142
142
|
bs.offset += 2;
|
|
143
143
|
}
|
|
144
|
-
return bs.
|
|
144
|
+
return bs.sliceOut<string>(outStart);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
@@ -185,106 +185,7 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
185
185
|
return copyStringFromSource(payloadStart, srcEnd - payloadStart);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
//
|
|
189
|
-
// * Deserializes a quoted JSON string into a reused/renewed destination string buffer.
|
|
190
|
-
// * @param srcStart pointer to opening quote
|
|
191
|
-
// * @param srcEnd pointer to closing quote
|
|
192
|
-
// * @param outPtr existing destination string pointer (or 0)
|
|
193
|
-
// * @returns next unread source pointer
|
|
194
|
-
// */
|
|
195
|
-
// export function deserializeString_SWAR_TO(srcStart: usize, srcEnd: usize, outPtr: usize): usize {
|
|
196
|
-
// srcStart += 2;
|
|
197
|
-
// let dst = outPtr;
|
|
198
|
-
// const srcEnd8 = srcEnd - 8;
|
|
199
|
-
// const byteSize = srcEnd - srcStart;
|
|
200
|
-
// if (!dst) {
|
|
201
|
-
// dst = __new(byteSize, idof<string>());
|
|
202
|
-
// } else if (changetype<OBJECT>(dst - TOTAL_OVERHEAD).rtSize < <u32>byteSize) {
|
|
203
|
-
// dst = __renew(dst, byteSize);
|
|
204
|
-
// }
|
|
205
|
-
// let offset = dst;
|
|
206
|
-
|
|
207
|
-
// while (srcStart < srcEnd8) {
|
|
208
|
-
// const block = load<u64>(srcStart);
|
|
209
|
-
// store<u64>(offset, block);
|
|
210
|
-
|
|
211
|
-
// let mask = inline.always(backslash_mask_unsafe(block));
|
|
212
|
-
|
|
213
|
-
// if (mask === 0) {
|
|
214
|
-
// srcStart += 8;
|
|
215
|
-
// offset += 8;
|
|
216
|
-
// continue;
|
|
217
|
-
// }
|
|
218
|
-
|
|
219
|
-
// do {
|
|
220
|
-
// const laneIdx = usize(ctz(mask) >> 3); // 0 2 4 6
|
|
221
|
-
// mask &= mask - 1;
|
|
222
|
-
// const srcIdx = srcStart + laneIdx;
|
|
223
|
-
// const dstIdx = offset + laneIdx;
|
|
224
|
-
// const header = load<u32>(srcIdx);
|
|
225
|
-
// const code = <u16>(header >> 16);
|
|
226
|
-
|
|
227
|
-
// if ((header & 0xffff) !== 0x5c) continue;
|
|
228
|
-
|
|
229
|
-
// if (code !== 0x75) {
|
|
230
|
-
// const escaped = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
|
|
231
|
-
// mask &= mask - usize(escaped === 0x5c);
|
|
232
|
-
// store<u16>(dstIdx, escaped);
|
|
233
|
-
// const copyStart = srcIdx + 4;
|
|
234
|
-
// if (copyStart < srcEnd) {
|
|
235
|
-
// const copyBytes = min<usize>(4, srcEnd - copyStart);
|
|
236
|
-
// memory.copy(dstIdx + 2, copyStart, copyBytes);
|
|
237
|
-
// }
|
|
238
|
-
|
|
239
|
-
// const l6 = usize(laneIdx === 6);
|
|
240
|
-
// offset -= (1 - l6) << 1;
|
|
241
|
-
// srcStart += l6 << 1;
|
|
242
|
-
// continue;
|
|
243
|
-
// }
|
|
244
|
-
|
|
245
|
-
// const block = load<u64>(srcIdx, 4); // XXXX
|
|
246
|
-
// const escaped = hex4_to_u16_swar(block);
|
|
247
|
-
// store<u16>(dstIdx, escaped);
|
|
248
|
-
// srcStart += 4 + laneIdx;
|
|
249
|
-
// offset -= 6 - laneIdx;
|
|
250
|
-
// } while (mask !== 0);
|
|
251
|
-
|
|
252
|
-
// offset += 8;
|
|
253
|
-
// srcStart += 8;
|
|
254
|
-
// }
|
|
255
|
-
|
|
256
|
-
// while (srcStart < srcEnd) {
|
|
257
|
-
// const block = load<u16>(srcStart);
|
|
258
|
-
// store<u16>(offset, block);
|
|
259
|
-
// srcStart += 2;
|
|
260
|
-
|
|
261
|
-
// if (block !== 0x5c) {
|
|
262
|
-
// offset += 2;
|
|
263
|
-
// continue;
|
|
264
|
-
// }
|
|
265
|
-
|
|
266
|
-
// const code = load<u16>(srcStart);
|
|
267
|
-
// if (code !== 0x75) {
|
|
268
|
-
// const block = load<u16>(srcStart);
|
|
269
|
-
// const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
|
|
270
|
-
// store<u16>(offset, escape);
|
|
271
|
-
// srcStart += 2;
|
|
272
|
-
// } else {
|
|
273
|
-
// const block = load<u64>(srcStart, 2); // XXXX
|
|
274
|
-
// const escaped = hex4_to_u16_swar(block);
|
|
275
|
-
// store<u16>(offset, escaped);
|
|
276
|
-
// srcStart += 10;
|
|
277
|
-
// }
|
|
278
|
-
|
|
279
|
-
// offset += 2;
|
|
280
|
-
// }
|
|
281
|
-
// if (offset - dst != byteSize) {
|
|
282
|
-
// dst = __renew(dst, offset - dst);
|
|
283
|
-
// }
|
|
284
|
-
// return srcEnd + 2;
|
|
285
|
-
// }
|
|
286
|
-
|
|
287
|
-
// Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
|
|
188
|
+
// Writes into the destination field, reusing or resizing the backing string.
|
|
288
189
|
// @ts-expect-error: @inline is a valid decorator
|
|
289
190
|
@inline function writeStringToField(dstFieldPtr: usize, srcStart: usize, byteLength: u32): void {
|
|
290
191
|
if (byteLength == 0) {
|
|
@@ -294,11 +195,13 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
294
195
|
|
|
295
196
|
const current = load<usize>(dstFieldPtr);
|
|
296
197
|
let stringPtr: usize;
|
|
297
|
-
if (current
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
198
|
+
if (current >= __heap_base) {
|
|
199
|
+
if (changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
|
|
200
|
+
stringPtr = current;
|
|
201
|
+
} else {
|
|
202
|
+
stringPtr = __renew(current, byteLength);
|
|
203
|
+
store<usize>(dstFieldPtr, stringPtr);
|
|
204
|
+
}
|
|
302
205
|
} else {
|
|
303
206
|
stringPtr = __new(byteLength, idof<string>());
|
|
304
207
|
store<usize>(dstFieldPtr, stringPtr);
|
|
@@ -306,17 +209,14 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
|
|
|
306
209
|
memory.copy(stringPtr, srcStart, byteLength);
|
|
307
210
|
}
|
|
308
211
|
|
|
309
|
-
/*
|
|
310
|
-
export function deserializeStringField_SWAR<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
|
|
311
|
-
if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
|
|
312
212
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
213
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
214
|
+
@inline function deserializeEscapedStringContinuation_SWAR(lastPtr: usize, srcStart: usize, srcEnd: usize, dstFieldPtr: usize, outStart: usize): usize {
|
|
215
|
+
const srcEnd8 = srcEnd - 8;
|
|
316
216
|
|
|
317
217
|
while (srcStart <= srcEnd8) {
|
|
218
|
+
const blockStart = srcStart;
|
|
318
219
|
let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
|
|
319
|
-
|
|
320
220
|
if (mask === 0) {
|
|
321
221
|
srcStart += 8;
|
|
322
222
|
continue;
|
|
@@ -324,290 +224,89 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
|
|
|
324
224
|
|
|
325
225
|
do {
|
|
326
226
|
const laneIdx = usize(ctz(mask) >> 3);
|
|
327
|
-
mask &=
|
|
328
|
-
// since we clear the entire byte, we can guarentee that any discovered lane where char == QUOTE is unescaped and a terminator.
|
|
227
|
+
mask &= mask - 1;
|
|
329
228
|
const srcIdx = srcStart + laneIdx;
|
|
330
229
|
const char = load<u16>(srcIdx);
|
|
331
|
-
|
|
332
230
|
if (char == QUOTE) {
|
|
333
|
-
|
|
231
|
+
const runLen = <u32>(srcIdx - lastPtr);
|
|
232
|
+
if (runLen != 0) {
|
|
233
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
234
|
+
bs.offset += runLen;
|
|
235
|
+
}
|
|
236
|
+
bs.toField(outStart, dstFieldPtr);
|
|
334
237
|
return srcIdx + 2;
|
|
335
238
|
}
|
|
336
239
|
if (char != BACK_SLASH) continue;
|
|
337
240
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
memory.copy(bs.buffer, payloadStart, prefixLen);
|
|
343
|
-
bs.offset += prefixLen;
|
|
241
|
+
const runLen = <u32>(srcIdx - lastPtr);
|
|
242
|
+
if (runLen != 0) {
|
|
243
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
244
|
+
bs.offset += runLen;
|
|
344
245
|
}
|
|
345
246
|
|
|
346
247
|
const chunk = load<u32>(srcIdx);
|
|
347
248
|
const code = <u16>(chunk >> 16);
|
|
348
|
-
|
|
349
249
|
if (code !== 0x75) {
|
|
350
250
|
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
|
|
351
251
|
bs.offset += 2;
|
|
352
|
-
|
|
353
|
-
srcStart = lastPtr;
|
|
354
|
-
while (srcStart <= srcEnd8) {
|
|
355
|
-
const blockStart = srcStart;
|
|
356
|
-
let escapedMask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
|
|
357
|
-
if (escapedMask === 0) {
|
|
358
|
-
srcStart += 8;
|
|
359
|
-
continue;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
do {
|
|
363
|
-
const escapedLaneIdx = usize(ctz(escapedMask) >> 3);
|
|
364
|
-
escapedMask &= escapedMask - 1;
|
|
365
|
-
const escapedIdx = srcStart + escapedLaneIdx;
|
|
366
|
-
const escapedChar = load<u16>(escapedIdx);
|
|
367
|
-
|
|
368
|
-
if (escapedChar == QUOTE) {
|
|
369
|
-
const runLen = <u32>(escapedIdx - lastPtr);
|
|
370
|
-
if (runLen != 0) {
|
|
371
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
372
|
-
bs.offset += runLen;
|
|
373
|
-
}
|
|
374
|
-
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
375
|
-
bs.offset = bs.buffer;
|
|
376
|
-
return escapedIdx + 2;
|
|
377
|
-
}
|
|
378
|
-
if (escapedChar != BACK_SLASH) continue;
|
|
379
|
-
|
|
380
|
-
const runLen = <u32>(escapedIdx - lastPtr);
|
|
381
|
-
if (runLen != 0) {
|
|
382
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
383
|
-
bs.offset += runLen;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
const escapedChunk = load<u32>(escapedIdx);
|
|
387
|
-
const escapedCode = <u16>(escapedChunk >> 16);
|
|
388
|
-
if (escapedCode !== 0x75) {
|
|
389
|
-
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + escapedCode));
|
|
390
|
-
bs.offset += 2;
|
|
391
|
-
lastPtr = escapedIdx + 4;
|
|
392
|
-
} else {
|
|
393
|
-
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(escapedIdx, 4)));
|
|
394
|
-
bs.offset += 2;
|
|
395
|
-
lastPtr = escapedIdx + 12;
|
|
396
|
-
}
|
|
397
|
-
srcStart = lastPtr;
|
|
398
|
-
break;
|
|
399
|
-
} while (escapedMask !== 0);
|
|
400
|
-
|
|
401
|
-
if (srcStart == blockStart) srcStart += 8;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
while (srcStart < srcEnd) {
|
|
405
|
-
const tailChar = load<u16>(srcStart);
|
|
406
|
-
if (tailChar == QUOTE) {
|
|
407
|
-
const runLen = <u32>(srcStart - lastPtr);
|
|
408
|
-
if (runLen != 0) {
|
|
409
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
410
|
-
bs.offset += runLen;
|
|
411
|
-
}
|
|
412
|
-
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
413
|
-
bs.offset = bs.buffer;
|
|
414
|
-
return srcStart + 2;
|
|
415
|
-
}
|
|
416
|
-
if (tailChar != BACK_SLASH) {
|
|
417
|
-
srcStart += 2;
|
|
418
|
-
continue;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
const runLen = <u32>(srcStart - lastPtr);
|
|
422
|
-
if (runLen != 0) {
|
|
423
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
424
|
-
bs.offset += runLen;
|
|
425
|
-
}
|
|
426
|
-
const tailCode = load<u16>(srcStart, 2);
|
|
427
|
-
if (tailCode !== 0x75) {
|
|
428
|
-
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
|
|
429
|
-
bs.offset += 2;
|
|
430
|
-
srcStart += 4;
|
|
431
|
-
} else {
|
|
432
|
-
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
433
|
-
bs.offset += 2;
|
|
434
|
-
srcStart += 12;
|
|
435
|
-
}
|
|
436
|
-
lastPtr = srcStart;
|
|
437
|
-
}
|
|
438
|
-
bs.offset = bs.buffer;
|
|
439
|
-
return srcStart;
|
|
252
|
+
lastPtr = srcIdx + 4;
|
|
440
253
|
} else {
|
|
441
254
|
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
|
|
442
255
|
bs.offset += 2;
|
|
443
|
-
|
|
444
|
-
srcStart = lastPtr;
|
|
445
|
-
while (srcStart <= srcEnd8) {
|
|
446
|
-
const blockStart = srcStart;
|
|
447
|
-
let escapedMask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
|
|
448
|
-
if (escapedMask === 0) {
|
|
449
|
-
srcStart += 8;
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
do {
|
|
454
|
-
const escapedLaneIdx = usize(ctz(escapedMask) >> 3);
|
|
455
|
-
escapedMask &= escapedMask - 1;
|
|
456
|
-
const escapedIdx = srcStart + escapedLaneIdx;
|
|
457
|
-
const escapedChar = load<u16>(escapedIdx);
|
|
458
|
-
|
|
459
|
-
if (escapedChar == QUOTE) {
|
|
460
|
-
const runLen = <u32>(escapedIdx - lastPtr);
|
|
461
|
-
if (runLen != 0) {
|
|
462
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
463
|
-
bs.offset += runLen;
|
|
464
|
-
}
|
|
465
|
-
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
466
|
-
bs.offset = bs.buffer;
|
|
467
|
-
return escapedIdx + 2;
|
|
468
|
-
}
|
|
469
|
-
if (escapedChar != BACK_SLASH) continue;
|
|
470
|
-
|
|
471
|
-
const runLen = <u32>(escapedIdx - lastPtr);
|
|
472
|
-
if (runLen != 0) {
|
|
473
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
474
|
-
bs.offset += runLen;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
const escapedChunk = load<u32>(escapedIdx);
|
|
478
|
-
const escapedCode = <u16>(escapedChunk >> 16);
|
|
479
|
-
if (escapedCode !== 0x75) {
|
|
480
|
-
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + escapedCode));
|
|
481
|
-
bs.offset += 2;
|
|
482
|
-
lastPtr = escapedIdx + 4;
|
|
483
|
-
} else {
|
|
484
|
-
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(escapedIdx, 4)));
|
|
485
|
-
bs.offset += 2;
|
|
486
|
-
lastPtr = escapedIdx + 12;
|
|
487
|
-
}
|
|
488
|
-
srcStart = lastPtr;
|
|
489
|
-
break;
|
|
490
|
-
} while (escapedMask !== 0);
|
|
491
|
-
|
|
492
|
-
if (srcStart == blockStart) srcStart += 8;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
while (srcStart < srcEnd) {
|
|
496
|
-
const tailChar = load<u16>(srcStart);
|
|
497
|
-
if (tailChar == QUOTE) {
|
|
498
|
-
const runLen = <u32>(srcStart - lastPtr);
|
|
499
|
-
if (runLen != 0) {
|
|
500
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
501
|
-
bs.offset += runLen;
|
|
502
|
-
}
|
|
503
|
-
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
504
|
-
bs.offset = bs.buffer;
|
|
505
|
-
return srcStart + 2;
|
|
506
|
-
}
|
|
507
|
-
if (tailChar != BACK_SLASH) {
|
|
508
|
-
srcStart += 2;
|
|
509
|
-
continue;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
const runLen = <u32>(srcStart - lastPtr);
|
|
513
|
-
if (runLen != 0) {
|
|
514
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
515
|
-
bs.offset += runLen;
|
|
516
|
-
}
|
|
517
|
-
const tailCode = load<u16>(srcStart, 2);
|
|
518
|
-
if (tailCode !== 0x75) {
|
|
519
|
-
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
|
|
520
|
-
bs.offset += 2;
|
|
521
|
-
srcStart += 4;
|
|
522
|
-
} else {
|
|
523
|
-
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
524
|
-
bs.offset += 2;
|
|
525
|
-
srcStart += 12;
|
|
526
|
-
}
|
|
527
|
-
lastPtr = srcStart;
|
|
528
|
-
}
|
|
529
|
-
bs.offset = bs.buffer;
|
|
530
|
-
return srcStart;
|
|
256
|
+
lastPtr = srcIdx + 12;
|
|
531
257
|
}
|
|
258
|
+
srcStart = lastPtr;
|
|
259
|
+
break;
|
|
532
260
|
} while (mask !== 0);
|
|
261
|
+
|
|
262
|
+
if (srcStart == blockStart) srcStart += 8;
|
|
533
263
|
}
|
|
534
264
|
|
|
535
265
|
while (srcStart < srcEnd) {
|
|
536
266
|
const char = load<u16>(srcStart);
|
|
537
267
|
if (char == QUOTE) {
|
|
538
|
-
|
|
268
|
+
const runLen = <u32>(srcStart - lastPtr);
|
|
269
|
+
if (runLen != 0) {
|
|
270
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
271
|
+
bs.offset += runLen;
|
|
272
|
+
}
|
|
273
|
+
bs.toField(outStart, dstFieldPtr);
|
|
539
274
|
return srcStart + 2;
|
|
540
275
|
}
|
|
541
|
-
if (char
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
if (prefixLen != 0) {
|
|
546
|
-
memory.copy(bs.buffer, payloadStart, prefixLen);
|
|
547
|
-
bs.offset += prefixLen;
|
|
548
|
-
}
|
|
276
|
+
if (char != BACK_SLASH) {
|
|
277
|
+
srcStart += 2;
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
549
280
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
srcStart += 4;
|
|
556
|
-
} else {
|
|
557
|
-
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
558
|
-
bs.offset += 2;
|
|
559
|
-
srcStart += 12;
|
|
560
|
-
}
|
|
561
|
-
lastPtr = srcStart;
|
|
562
|
-
|
|
563
|
-
while (srcStart < srcEnd) {
|
|
564
|
-
const tailChar = load<u16>(srcStart);
|
|
565
|
-
if (tailChar == QUOTE) {
|
|
566
|
-
const runLen = <u32>(srcStart - lastPtr);
|
|
567
|
-
if (runLen != 0) {
|
|
568
|
-
memory.copy(bs.offset, lastPtr, runLen);
|
|
569
|
-
bs.offset += runLen;
|
|
570
|
-
}
|
|
571
|
-
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
572
|
-
bs.offset = bs.buffer;
|
|
573
|
-
return srcStart + 2;
|
|
574
|
-
}
|
|
575
|
-
if (tailChar != BACK_SLASH) {
|
|
576
|
-
srcStart += 2;
|
|
577
|
-
continue;
|
|
578
|
-
}
|
|
281
|
+
const runLen = <u32>(srcStart - lastPtr);
|
|
282
|
+
if (runLen != 0) {
|
|
283
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
284
|
+
bs.offset += runLen;
|
|
285
|
+
}
|
|
579
286
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
srcStart += 4;
|
|
590
|
-
} else {
|
|
591
|
-
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
592
|
-
bs.offset += 2;
|
|
593
|
-
srcStart += 12;
|
|
594
|
-
}
|
|
595
|
-
lastPtr = srcStart;
|
|
596
|
-
}
|
|
597
|
-
bs.offset = bs.buffer;
|
|
598
|
-
return srcStart;
|
|
287
|
+
const code = load<u16>(srcStart, 2);
|
|
288
|
+
if (code !== 0x75) {
|
|
289
|
+
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
|
|
290
|
+
bs.offset += 2;
|
|
291
|
+
srcStart += 4;
|
|
292
|
+
} else {
|
|
293
|
+
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
294
|
+
bs.offset += 2;
|
|
295
|
+
srcStart += 12;
|
|
599
296
|
}
|
|
600
|
-
|
|
297
|
+
lastPtr = srcStart;
|
|
601
298
|
}
|
|
602
299
|
|
|
300
|
+
bs.offset = bs.buffer + outStart;
|
|
301
|
+
abort("Unterminated string literal");
|
|
603
302
|
return srcStart;
|
|
604
303
|
}
|
|
605
|
-
*/
|
|
606
304
|
|
|
305
|
+
// Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
|
|
607
306
|
// @ts-expect-error: @inline is a valid decorator
|
|
608
|
-
@inline function
|
|
307
|
+
@inline function deserializeEscapedStringScan_SWAR_SplitTuned(payloadStart: usize, escapeStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
|
|
609
308
|
const prefixLen = <u32>(escapeStart - payloadStart);
|
|
610
|
-
const srcEnd8 = srcEnd
|
|
309
|
+
const srcEnd8 = srcEnd - 8;
|
|
611
310
|
bs.offset = bs.buffer;
|
|
612
311
|
bs.ensureSize(<u32>(srcEnd - payloadStart));
|
|
613
312
|
if (prefixLen != 0) {
|
|
@@ -699,7 +398,6 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
|
|
|
699
398
|
bs.offset += 2;
|
|
700
399
|
srcStart += 12;
|
|
701
400
|
}
|
|
702
|
-
|
|
703
401
|
lastPtr = srcStart;
|
|
704
402
|
}
|
|
705
403
|
|
|
@@ -708,12 +406,189 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
|
|
|
708
406
|
return srcStart;
|
|
709
407
|
}
|
|
710
408
|
|
|
711
|
-
//
|
|
409
|
+
// @ts-expect-error: @inline is a valid decorator
|
|
410
|
+
@inline function deserializeEscapedStringContinuation_SWAR_MergedTuned(lastPtr: usize, srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
|
|
411
|
+
const srcEnd8 = srcEnd - 8;
|
|
412
|
+
|
|
413
|
+
while (srcStart <= srcEnd8) {
|
|
414
|
+
const blockStart = srcStart;
|
|
415
|
+
let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
|
|
416
|
+
if (mask === 0) {
|
|
417
|
+
srcStart += 8;
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
do {
|
|
422
|
+
const laneIdx = usize(ctz(mask) >> 3);
|
|
423
|
+
mask &= mask - 1;
|
|
424
|
+
const srcIdx = srcStart + laneIdx;
|
|
425
|
+
const char = load<u16>(srcIdx);
|
|
426
|
+
if (char == QUOTE) {
|
|
427
|
+
const runLen = <u32>(srcIdx - lastPtr);
|
|
428
|
+
if (runLen != 0) {
|
|
429
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
430
|
+
bs.offset += runLen;
|
|
431
|
+
}
|
|
432
|
+
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
433
|
+
bs.offset = bs.buffer;
|
|
434
|
+
return srcIdx + 2;
|
|
435
|
+
}
|
|
436
|
+
if (char != BACK_SLASH) continue;
|
|
437
|
+
|
|
438
|
+
const runLen = <u32>(srcIdx - lastPtr);
|
|
439
|
+
if (runLen != 0) {
|
|
440
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
441
|
+
bs.offset += runLen;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const chunk = load<u32>(srcIdx);
|
|
445
|
+
const code = <u16>(chunk >> 16);
|
|
446
|
+
if (code !== 0x75) {
|
|
447
|
+
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
|
|
448
|
+
bs.offset += 2;
|
|
449
|
+
lastPtr = srcIdx + 4;
|
|
450
|
+
} else {
|
|
451
|
+
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
|
|
452
|
+
bs.offset += 2;
|
|
453
|
+
lastPtr = srcIdx + 12;
|
|
454
|
+
}
|
|
455
|
+
srcStart = lastPtr;
|
|
456
|
+
break;
|
|
457
|
+
} while (mask !== 0);
|
|
458
|
+
|
|
459
|
+
if (srcStart == blockStart) srcStart += 8;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
while (srcStart < srcEnd) {
|
|
463
|
+
const tailChar = load<u16>(srcStart);
|
|
464
|
+
if (tailChar == QUOTE) {
|
|
465
|
+
const runLen = <u32>(srcStart - lastPtr);
|
|
466
|
+
if (runLen != 0) {
|
|
467
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
468
|
+
bs.offset += runLen;
|
|
469
|
+
}
|
|
470
|
+
writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
|
|
471
|
+
bs.offset = bs.buffer;
|
|
472
|
+
return srcStart + 2;
|
|
473
|
+
}
|
|
474
|
+
if (tailChar != BACK_SLASH) {
|
|
475
|
+
srcStart += 2;
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const runLen = <u32>(srcStart - lastPtr);
|
|
480
|
+
if (runLen != 0) {
|
|
481
|
+
memory.copy(bs.offset, lastPtr, runLen);
|
|
482
|
+
bs.offset += runLen;
|
|
483
|
+
}
|
|
484
|
+
const tailCode = load<u16>(srcStart, 2);
|
|
485
|
+
if (tailCode !== 0x75) {
|
|
486
|
+
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
|
|
487
|
+
bs.offset += 2;
|
|
488
|
+
srcStart += 4;
|
|
489
|
+
} else {
|
|
490
|
+
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
491
|
+
bs.offset += 2;
|
|
492
|
+
srcStart += 12;
|
|
493
|
+
}
|
|
494
|
+
lastPtr = srcStart;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
bs.offset = bs.buffer;
|
|
498
|
+
return srcStart;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function deserializeStringField_SWAR_MergedTuned(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
|
|
502
|
+
if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
|
|
503
|
+
|
|
504
|
+
const payloadStart = srcStart + 2;
|
|
505
|
+
const srcEnd8 = srcEnd - 8;
|
|
506
|
+
srcStart = payloadStart;
|
|
507
|
+
|
|
508
|
+
while (srcStart <= srcEnd8) {
|
|
509
|
+
let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
|
|
510
|
+
if (mask === 0) {
|
|
511
|
+
srcStart += 8;
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
do {
|
|
516
|
+
const laneIdx = usize(ctz(mask) >> 3);
|
|
517
|
+
mask &= ~(0xffff << (laneIdx << 3));
|
|
518
|
+
const srcIdx = srcStart + laneIdx;
|
|
519
|
+
const char = load<u16>(srcIdx);
|
|
520
|
+
|
|
521
|
+
if (char == QUOTE) {
|
|
522
|
+
writeStringToField(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
|
|
523
|
+
return srcIdx + 2;
|
|
524
|
+
}
|
|
525
|
+
if (char != BACK_SLASH) continue;
|
|
526
|
+
|
|
527
|
+
bs.offset = bs.buffer;
|
|
528
|
+
bs.ensureSize(<u32>(srcEnd - payloadStart));
|
|
529
|
+
const prefixLen = <u32>(srcIdx - payloadStart);
|
|
530
|
+
if (prefixLen != 0) {
|
|
531
|
+
memory.copy(bs.buffer, payloadStart, prefixLen);
|
|
532
|
+
bs.offset += prefixLen;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
const chunk = load<u32>(srcIdx);
|
|
536
|
+
const code = <u16>(chunk >> 16);
|
|
537
|
+
let lastPtr: usize;
|
|
538
|
+
if (code !== 0x75) {
|
|
539
|
+
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
|
|
540
|
+
bs.offset += 2;
|
|
541
|
+
lastPtr = srcIdx + 4;
|
|
542
|
+
} else {
|
|
543
|
+
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
|
|
544
|
+
bs.offset += 2;
|
|
545
|
+
lastPtr = srcIdx + 12;
|
|
546
|
+
}
|
|
547
|
+
return inline.always(deserializeEscapedStringContinuation_SWAR_MergedTuned(lastPtr, lastPtr, srcEnd, dstFieldPtr));
|
|
548
|
+
} while (mask !== 0);
|
|
549
|
+
|
|
550
|
+
srcStart += 8;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
while (srcStart < srcEnd) {
|
|
554
|
+
const char = load<u16>(srcStart);
|
|
555
|
+
if (char == QUOTE) {
|
|
556
|
+
writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
|
|
557
|
+
return srcStart + 2;
|
|
558
|
+
}
|
|
559
|
+
if (char == BACK_SLASH) {
|
|
560
|
+
bs.offset = bs.buffer;
|
|
561
|
+
bs.ensureSize(<u32>(srcEnd - payloadStart));
|
|
562
|
+
const prefixLen = <u32>(srcStart - payloadStart);
|
|
563
|
+
if (prefixLen != 0) {
|
|
564
|
+
memory.copy(bs.buffer, payloadStart, prefixLen);
|
|
565
|
+
bs.offset += prefixLen;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const code = load<u16>(srcStart, 2);
|
|
569
|
+
let lastPtr: usize;
|
|
570
|
+
if (code !== 0x75) {
|
|
571
|
+
store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
|
|
572
|
+
bs.offset += 2;
|
|
573
|
+
lastPtr = srcStart + 4;
|
|
574
|
+
} else {
|
|
575
|
+
store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
|
|
576
|
+
bs.offset += 2;
|
|
577
|
+
lastPtr = srcStart + 12;
|
|
578
|
+
}
|
|
579
|
+
return inline.always(deserializeEscapedStringContinuation_SWAR_MergedTuned(lastPtr, lastPtr, srcEnd, dstFieldPtr));
|
|
580
|
+
}
|
|
581
|
+
srcStart += 2;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
return srcStart;
|
|
585
|
+
}
|
|
586
|
+
|
|
712
587
|
export function deserializeStringField_SWAR<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
|
|
713
588
|
if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
|
|
714
589
|
|
|
715
590
|
const payloadStart = srcStart + 2;
|
|
716
|
-
const srcEnd8 = srcEnd
|
|
591
|
+
const srcEnd8 = srcEnd - 8;
|
|
717
592
|
srcStart = payloadStart;
|
|
718
593
|
|
|
719
594
|
while (srcStart <= srcEnd8) {
|
|
@@ -733,8 +608,7 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
|
|
|
733
608
|
return srcIdx + 2;
|
|
734
609
|
}
|
|
735
610
|
if (char != BACK_SLASH) continue;
|
|
736
|
-
|
|
737
|
-
return deserializeEscapedStringScan_SWAR(payloadStart, srcIdx, srcEnd, dstFieldPtr);
|
|
611
|
+
return inline.always(deserializeEscapedStringScan_SWAR_SplitTuned(payloadStart, srcIdx, srcEnd, dstFieldPtr));
|
|
738
612
|
} while (mask !== 0);
|
|
739
613
|
|
|
740
614
|
srcStart += 8;
|
|
@@ -747,7 +621,7 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
|
|
|
747
621
|
return srcStart + 2;
|
|
748
622
|
}
|
|
749
623
|
if (char == BACK_SLASH) {
|
|
750
|
-
return
|
|
624
|
+
return inline.always(deserializeEscapedStringScan_SWAR_SplitTuned(payloadStart, srcStart, srcEnd, dstFieldPtr));
|
|
751
625
|
}
|
|
752
626
|
srcStart += 2;
|
|
753
627
|
}
|
|
@@ -756,6 +630,7 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
|
|
|
756
630
|
return srcStart;
|
|
757
631
|
}
|
|
758
632
|
|
|
633
|
+
|
|
759
634
|
/**
|
|
760
635
|
* Computes a per-byte mask identifying ASCII backslash or quote bytes.
|
|
761
636
|
*
|