json-as 1.2.5 → 1.3.0
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/.as-test/coverage/naive/coverage.arbitrary.spec.ts.log.json +5628 -0
- package/.as-test/coverage/naive/coverage.array.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.bool.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.box.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.custom.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.date.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.enum.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.float.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.generics.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.hierarchy.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.integer.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.map.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.namespace.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.null.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.raw.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.resolving.spec.ts.log.json +5628 -0
- package/.as-test/coverage/naive/coverage.set.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.staticarray.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.string.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.struct.spec.ts.log.json +5187 -0
- package/.as-test/coverage/naive/coverage.types.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.arbitrary.spec.ts.log.json +5628 -0
- package/.as-test/coverage/simd/coverage.array.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.bool.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.box.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.custom.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.date.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.enum.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.float.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.generics.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.hierarchy.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.integer.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.map.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.namespace.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.null.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.raw.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.resolving.spec.ts.log.json +5628 -0
- package/.as-test/coverage/simd/coverage.set.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.staticarray.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.string.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.struct.spec.ts.log.json +5187 -0
- package/.as-test/coverage/simd/coverage.types.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.arbitrary.spec.ts.log.json +5628 -0
- package/.as-test/coverage/swar/coverage.array.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.bool.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.box.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.custom.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.date.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.enum.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.float.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.generics.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.hierarchy.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.integer.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.map.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.namespace.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.null.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.raw.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.resolving.spec.ts.log.json +5628 -0
- package/.as-test/coverage/swar/coverage.set.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.staticarray.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.string.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.struct.spec.ts.log.json +5187 -0
- package/.as-test/coverage/swar/coverage.types.spec.ts.log.json +5187 -0
- package/.as-test/logs/naive/run.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/naive/run.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/naive/run.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/naive/run.box.spec.ts.log.json +353 -0
- package/.as-test/logs/naive/run.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/naive/run.date.spec.ts.log.json +397 -0
- package/.as-test/logs/naive/run.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/naive/run.float.spec.ts.log.json +453 -0
- package/.as-test/logs/naive/run.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/naive/run.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/naive/run.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/naive/run.map.spec.ts.log.json +247 -0
- package/.as-test/logs/naive/run.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/naive/run.null.spec.ts.log.json +273 -0
- package/.as-test/logs/naive/run.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/naive/run.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/naive/run.set.spec.ts.log.json +733 -0
- package/.as-test/logs/naive/run.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/naive/run.string.spec.ts.log.json +2289 -0
- package/.as-test/logs/naive/run.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/naive/run.types.spec.ts.log.json +273 -0
- package/.as-test/logs/naive/test.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/naive/test.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/naive/test.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/naive/test.box.spec.ts.log.json +353 -0
- package/.as-test/logs/naive/test.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/naive/test.date.spec.ts.log.json +397 -0
- package/.as-test/logs/naive/test.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/naive/test.float.spec.ts.log.json +453 -0
- package/.as-test/logs/naive/test.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/naive/test.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/naive/test.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/naive/test.log.json +2289 -0
- package/.as-test/logs/naive/test.map.spec.ts.log.json +247 -0
- package/.as-test/logs/naive/test.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/naive/test.null.spec.ts.log.json +273 -0
- package/.as-test/logs/naive/test.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/naive/test.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/naive/test.set.spec.ts.log.json +733 -0
- package/.as-test/logs/naive/test.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/naive/test.string.spec.ts.log.json +2345 -0
- package/.as-test/logs/naive/test.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/naive/test.types.spec.ts.log.json +273 -0
- package/.as-test/logs/simd/run.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/simd/run.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/simd/run.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/simd/run.box.spec.ts.log.json +353 -0
- package/.as-test/logs/simd/run.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/simd/run.date.spec.ts.log.json +397 -0
- package/.as-test/logs/simd/run.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/simd/run.float.spec.ts.log.json +453 -0
- package/.as-test/logs/simd/run.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/simd/run.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/simd/run.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/simd/run.map.spec.ts.log.json +247 -0
- package/.as-test/logs/simd/run.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/simd/run.null.spec.ts.log.json +273 -0
- package/.as-test/logs/simd/run.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/simd/run.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/simd/run.set.spec.ts.log.json +733 -0
- package/.as-test/logs/simd/run.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/simd/run.string.spec.ts.log.json +2289 -0
- package/.as-test/logs/simd/run.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/simd/run.types.spec.ts.log.json +273 -0
- package/.as-test/logs/simd/test.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/simd/test.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/simd/test.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/simd/test.box.spec.ts.log.json +353 -0
- package/.as-test/logs/simd/test.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/simd/test.date.spec.ts.log.json +397 -0
- package/.as-test/logs/simd/test.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/simd/test.float.spec.ts.log.json +453 -0
- package/.as-test/logs/simd/test.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/simd/test.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/simd/test.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/simd/test.log.json +11371 -0
- package/.as-test/logs/simd/test.map.spec.ts.log.json +247 -0
- package/.as-test/logs/simd/test.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/simd/test.null.spec.ts.log.json +273 -0
- package/.as-test/logs/simd/test.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/simd/test.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/simd/test.set.spec.ts.log.json +733 -0
- package/.as-test/logs/simd/test.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/simd/test.string.spec.ts.log.json +2345 -0
- package/.as-test/logs/simd/test.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/simd/test.types.spec.ts.log.json +273 -0
- package/.as-test/logs/swar/run.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/swar/run.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/swar/run.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/swar/run.box.spec.ts.log.json +353 -0
- package/.as-test/logs/swar/run.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/swar/run.date.spec.ts.log.json +397 -0
- package/.as-test/logs/swar/run.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/swar/run.float.spec.ts.log.json +453 -0
- package/.as-test/logs/swar/run.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/swar/run.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/swar/run.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/swar/run.map.spec.ts.log.json +247 -0
- package/.as-test/logs/swar/run.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/swar/run.null.spec.ts.log.json +273 -0
- package/.as-test/logs/swar/run.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/swar/run.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/swar/run.set.spec.ts.log.json +733 -0
- package/.as-test/logs/swar/run.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/swar/run.string.spec.ts.log.json +2289 -0
- package/.as-test/logs/swar/run.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/swar/run.types.spec.ts.log.json +273 -0
- package/.as-test/logs/swar/test.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/swar/test.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/swar/test.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/swar/test.box.spec.ts.log.json +353 -0
- package/.as-test/logs/swar/test.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/swar/test.date.spec.ts.log.json +397 -0
- package/.as-test/logs/swar/test.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/swar/test.float.spec.ts.log.json +453 -0
- package/.as-test/logs/swar/test.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/swar/test.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/swar/test.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/swar/test.log.json +11371 -0
- package/.as-test/logs/swar/test.map.spec.ts.log.json +247 -0
- package/.as-test/logs/swar/test.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/swar/test.null.spec.ts.log.json +273 -0
- package/.as-test/logs/swar/test.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/swar/test.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/swar/test.set.spec.ts.log.json +733 -0
- package/.as-test/logs/swar/test.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/swar/test.string.spec.ts.log.json +2345 -0
- package/.as-test/logs/swar/test.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/swar/test.types.spec.ts.log.json +273 -0
- package/.as-test/logs/test.arbitrary.spec.ts.log.json +943 -0
- package/.as-test/logs/test.array.spec.ts.log.json +1053 -0
- package/.as-test/logs/test.bool.spec.ts.log.json +257 -0
- package/.as-test/logs/test.box.spec.ts.log.json +353 -0
- package/.as-test/logs/test.custom.spec.ts.log.json +309 -0
- package/.as-test/logs/test.date.spec.ts.log.json +397 -0
- package/.as-test/logs/test.enum.spec.ts.log.json +343 -0
- package/.as-test/logs/test.float.spec.ts.log.json +453 -0
- package/.as-test/logs/test.generics.spec.ts.log.json +393 -0
- package/.as-test/logs/test.hierarchy.spec.ts.log.json +325 -0
- package/.as-test/logs/test.integer.spec.ts.log.json +373 -0
- package/.as-test/logs/test.log.json +11371 -0
- package/.as-test/logs/test.map.spec.ts.log.json +247 -0
- package/.as-test/logs/test.namespace.spec.ts.log.json +361 -0
- package/.as-test/logs/test.null.spec.ts.log.json +273 -0
- package/.as-test/logs/test.raw.spec.ts.log.json +309 -0
- package/.as-test/logs/test.resolving.spec.ts.log.json +273 -0
- package/.as-test/logs/test.set.spec.ts.log.json +733 -0
- package/.as-test/logs/test.staticarray.spec.ts.log.json +931 -0
- package/.as-test/logs/test.string.spec.ts.log.json +2289 -0
- package/.as-test/logs/test.struct.spec.ts.log.json +523 -0
- package/.as-test/logs/test.types.spec.ts.log.json +273 -0
- package/.as-test/runners/default.bindings.js +68 -0
- package/.as-test/runners/default.wasi.js +38 -0
- package/ARCHITECTURE.md +6 -3
- package/CONTRIBUTING.md +9 -3
- package/README.md +40 -21
- package/as-test.config.json +40 -0
- package/assembly/deserialize/float.ts +181 -0
- package/assembly/deserialize/helpers/uint.ts +12 -0
- package/assembly/deserialize/index/arbitrary.ts +25 -0
- package/assembly/deserialize/index/array.ts +61 -0
- package/assembly/deserialize/index/bool.ts +1 -0
- package/assembly/deserialize/index/date.ts +1 -0
- package/assembly/deserialize/index/float.ts +1 -0
- package/assembly/deserialize/index/integer.ts +1 -0
- package/assembly/deserialize/index/map.ts +1 -0
- package/assembly/deserialize/index/object.ts +1 -0
- package/assembly/deserialize/index/raw.ts +1 -0
- package/assembly/deserialize/index/set.ts +1 -0
- package/assembly/deserialize/index/staticarray.ts +1 -0
- package/assembly/deserialize/index/string.ts +15 -0
- package/assembly/deserialize/index/struct.ts +1 -0
- package/assembly/deserialize/index/typedarray.ts +1 -0
- package/assembly/deserialize/index/unsigned.ts +1 -0
- package/assembly/deserialize/index.ts +14 -0
- package/assembly/deserialize/integer.ts +42 -0
- package/assembly/deserialize/simd/array/integer.ts +307 -0
- package/assembly/deserialize/simd/string.ts +131 -10
- package/assembly/deserialize/simple/arbitrary.ts +2 -2
- package/assembly/deserialize/simple/array/arbitrary.ts +13 -20
- package/assembly/deserialize/simple/array/raw.ts +14 -21
- package/assembly/deserialize/simple/array/string.ts +3 -2
- package/assembly/deserialize/simple/array.ts +1 -0
- package/assembly/deserialize/simple/map.ts +14 -19
- package/assembly/deserialize/simple/object.ts +14 -19
- package/assembly/deserialize/simple/set.ts +9 -9
- package/assembly/deserialize/simple/staticarray/array.ts +12 -3
- package/assembly/deserialize/simple/staticarray/bool.ts +6 -2
- package/assembly/deserialize/simple/staticarray/float.ts +12 -3
- package/assembly/deserialize/simple/staticarray/integer.ts +6 -2
- package/assembly/deserialize/simple/staticarray/string.ts +5 -4
- package/assembly/deserialize/simple/staticarray/struct.ts +30 -7
- package/assembly/deserialize/simple/staticarray.ts +56 -12
- package/assembly/deserialize/simple/string.ts +1 -1
- package/assembly/deserialize/simple/struct.ts +12 -20
- package/assembly/deserialize/simple/typedarray.ts +94 -0
- package/assembly/deserialize/swar/array/arbitrary.ts +8 -0
- package/assembly/deserialize/swar/array/array.ts +39 -0
- package/assembly/deserialize/swar/array/bool.ts +47 -0
- package/assembly/deserialize/swar/array/box.ts +8 -0
- package/assembly/deserialize/swar/array/float.ts +39 -0
- package/assembly/deserialize/swar/array/integer.ts +461 -0
- package/assembly/deserialize/swar/array/map.ts +7 -0
- package/assembly/deserialize/swar/array/object.ts +44 -0
- package/assembly/deserialize/swar/array/raw.ts +8 -0
- package/assembly/deserialize/swar/array/shared.ts +96 -0
- package/assembly/deserialize/swar/array/string.ts +39 -0
- package/assembly/deserialize/swar/array/struct.ts +44 -0
- package/assembly/deserialize/swar/array.ts +49 -0
- package/assembly/deserialize/swar/string.ts +653 -14
- package/assembly/deserialize/unsigned.ts +75 -0
- package/assembly/index.d.ts +2 -2
- package/assembly/index.ts +214 -132
- package/assembly/serialize/index/arbitrary.ts +70 -0
- package/assembly/serialize/index/array.ts +1 -0
- package/assembly/serialize/index/bool.ts +1 -0
- package/assembly/serialize/index/date.ts +1 -0
- package/assembly/serialize/index/float.ts +1 -0
- package/assembly/serialize/index/integer.ts +1 -0
- package/assembly/serialize/index/map.ts +1 -0
- package/assembly/serialize/index/object.ts +46 -0
- package/assembly/serialize/index/raw.ts +1 -0
- package/assembly/serialize/index/set.ts +1 -0
- package/assembly/serialize/index/staticarray.ts +1 -0
- package/assembly/serialize/index/string.ts +15 -0
- package/assembly/serialize/index/struct.ts +1 -0
- package/assembly/serialize/index/typedarray.ts +1 -0
- package/assembly/serialize/index.ts +13 -0
- package/assembly/serialize/simd/string.ts +68 -68
- package/assembly/serialize/simple/string.ts +9 -10
- package/assembly/serialize/simple/typedarray.ts +63 -0
- package/assembly/serialize/swar/string.ts +26 -32
- package/assembly/test.ts +20 -20
- package/assembly/tsconfig.json +16 -1
- package/assembly/util/index.ts +1 -0
- package/assembly/util/masks.ts +17 -24
- package/assembly/util/memory.ts +0 -0
- package/assembly/util/stringScan.ts +24 -0
- package/assembly/util/swar.ts +2 -9
- package/eslint.config.js +43 -52
- package/lib/as-bs.ts +72 -77
- package/package.json +13 -9
- package/test.ts +99 -0
- package/tools/assemblyscript-eslint-local.js +6 -0
- package/tools/assemblyscript-eslint.js +53 -0
- package/tools/assemblyscript-prettier-plugin.js +33 -0
- package/tools/replacer.js +63 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +397 -64
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/types.d.ts +4 -0
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +62 -0
- package/transform/lib/types.js.map +1 -1
- package/transform/tsconfig.json +2 -6
- package/.claude/settings.local.json +0 -9
- package/assembly/deserialize/simple/float.ts +0 -11
- package/assembly/deserialize/simple/integer.ts +0 -6
package/transform/lib/index.js
CHANGED
|
@@ -13,6 +13,16 @@ const WRITE = process.env["JSON_WRITE"]?.trim();
|
|
|
13
13
|
const rawValue = process.env["JSON_DEBUG"]?.trim();
|
|
14
14
|
const DEBUG = rawValue === "true" ? 1 : rawValue === "false" || rawValue === "" ? 0 : isNaN(Number(rawValue)) ? 0 : Number(rawValue);
|
|
15
15
|
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "true";
|
|
16
|
+
const USE_FAST_PATH = process.env["JSON_USE_FAST_PATH"]?.trim() === "1";
|
|
17
|
+
function needsReferenceLoad(type) {
|
|
18
|
+
return type == "ArrayBuffer" || type == "Int8Array" || type == "Uint8Array" || type == "Uint8ClampedArray" || type == "Int16Array" || type == "Uint16Array" || type == "Int32Array" || type == "Uint32Array" || type == "Int64Array" || type == "Uint64Array" || type == "Float32Array" || type == "Float64Array";
|
|
19
|
+
}
|
|
20
|
+
function getSerializeCall(type, realName) {
|
|
21
|
+
if (type == "ArrayBuffer") {
|
|
22
|
+
return `JSON.__serializeArrayBuffer(load<ArrayBuffer>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
|
|
23
|
+
}
|
|
24
|
+
return needsReferenceLoad(type) ? `JSON.__serialize<${type}>(changetype<${type}>(load<usize>(ptr, offsetof<this>(${JSON.stringify(realName)}))));\n` : `JSON.__serialize<${type}>(load<${type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
|
|
25
|
+
}
|
|
16
26
|
export class JSONTransform extends Visitor {
|
|
17
27
|
static SN = new JSONTransform();
|
|
18
28
|
program;
|
|
@@ -79,8 +89,8 @@ export class JSONTransform extends Visitor {
|
|
|
79
89
|
if (!this.schemas.has(source.internalPath))
|
|
80
90
|
this.schemas.set(source.internalPath, []);
|
|
81
91
|
const members = [...node.members.filter((v) => v.kind === 54 && v.flags !== 32 && v.flags !== 512 && v.flags !== 1024 && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
|
|
82
|
-
const serializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer"))];
|
|
83
|
-
const deserializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer"))];
|
|
92
|
+
const serializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer") && !v.name.text.startsWith("__try"))];
|
|
93
|
+
const deserializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer") && !v.name.text.startsWith("__try"))];
|
|
84
94
|
const schema = new Schema();
|
|
85
95
|
schema.node = node;
|
|
86
96
|
schema.name = source.getQualifiedName(node);
|
|
@@ -229,9 +239,12 @@ export class JSONTransform extends Visitor {
|
|
|
229
239
|
this.schemas.get(source.internalPath).push(schema);
|
|
230
240
|
this.schema = schema;
|
|
231
241
|
this.visitedClasses.add(fullClassPath);
|
|
242
|
+
const codegenMode = getCodegenMode(this.program);
|
|
243
|
+
const useFastPath = USE_FAST_PATH && codegenMode !== JSONMode.NAIVE;
|
|
232
244
|
let SERIALIZE = "__SERIALIZE(ptr: usize): void {\n";
|
|
233
245
|
let INITIALIZE = "@inline __INITIALIZE(): this {\n";
|
|
234
|
-
let DESERIALIZE = "
|
|
246
|
+
let DESERIALIZE = "__DESERIALIZE_SLOW<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {\n";
|
|
247
|
+
let DESERIALIZE_FAST = "@inline __DESERIALIZE_FAST<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {\n";
|
|
235
248
|
let DESERIALIZE_CUSTOM = "";
|
|
236
249
|
let SERIALIZE_CUSTOM = "";
|
|
237
250
|
if (DEBUG > 0)
|
|
@@ -277,8 +290,10 @@ export class JSONTransform extends Visitor {
|
|
|
277
290
|
if (!deserializer.decorators.some((v) => v.name.text == "inline")) {
|
|
278
291
|
deserializer.decorators.push(Node.createDecorator(Node.createIdentifierExpression("inline", deserializer.range), null, deserializer.range));
|
|
279
292
|
}
|
|
280
|
-
DESERIALIZE_CUSTOM += " __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T):
|
|
281
|
-
DESERIALIZE_CUSTOM += "
|
|
293
|
+
DESERIALIZE_CUSTOM += " __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {\n";
|
|
294
|
+
DESERIALIZE_CUSTOM += " const data = inline.always(this." + deserializer.name.text + "(JSON.Util.ptrToStr(srcStart, srcEnd)));\n";
|
|
295
|
+
DESERIALIZE_CUSTOM += " memory.copy(changetype<usize>(out), changetype<usize>(data), offsetof<nonnull<__JSON_T>>());\n";
|
|
296
|
+
DESERIALIZE_CUSTOM += " return srcEnd;\n";
|
|
282
297
|
DESERIALIZE_CUSTOM += " }\n";
|
|
283
298
|
}
|
|
284
299
|
if (!members.length && !deserializers.length && !serializers.length) {
|
|
@@ -308,11 +323,7 @@ export class JSONTransform extends Visitor {
|
|
|
308
323
|
switch (decoratorName) {
|
|
309
324
|
case "alias": {
|
|
310
325
|
const arg = decorator.args[0];
|
|
311
|
-
if (!arg ||
|
|
312
|
-
arg.kind != 16 &&
|
|
313
|
-
arg.literalKind != 2 &&
|
|
314
|
-
arg.literalKind != 1 &&
|
|
315
|
-
arg.literalKind != 0)
|
|
326
|
+
if (!arg || (arg.kind != 16 && arg.literalKind != 2 && arg.literalKind != 1 && arg.literalKind != 0))
|
|
316
327
|
throwError("@alias must have an argument of type string or number", member.range);
|
|
317
328
|
mem.alias = arg.value.toString();
|
|
318
329
|
break;
|
|
@@ -360,34 +371,36 @@ export class JSONTransform extends Visitor {
|
|
|
360
371
|
const aliasName = JSON.stringify(member.alias || member.name);
|
|
361
372
|
const realName = member.name;
|
|
362
373
|
const isLast = i == this.schema.members.length - 1;
|
|
363
|
-
if (
|
|
364
|
-
if (member.value
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
else if (member.generic) {
|
|
369
|
-
INITIALIZE += ` if (isManaged<nonnull<${member.type}>>() || isReference<nonnull<${member.type}>>()) {\n`;
|
|
370
|
-
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), changetype<nonnull<${member.type}>>(__new(offsetof<nonnull<${member.type}>>(), idof<nonnull<${member.type}>>())), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
371
|
-
INITIALIZE += ` if (isDefined(this.${member.name}.__INITIALIZE)) changetype<nonnull<${member.type}>>(this.${member.name}).__INITIALIZE();\n`;
|
|
372
|
-
INITIALIZE += ` }\n`;
|
|
373
|
-
}
|
|
374
|
-
else if (!member.node.type.isNullable) {
|
|
375
|
-
if (this.getSchema(member.type)) {
|
|
376
|
-
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), changetype<nonnull<${member.type}>>(__new(offsetof<nonnull<${member.type}>>(), idof<nonnull<${member.type}>>())).__INITIALIZE(), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
377
|
-
}
|
|
378
|
-
else if (member.type.startsWith("Array<")) {
|
|
379
|
-
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), [], offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
380
|
-
}
|
|
381
|
-
else if (member.type.startsWith("Map<")) {
|
|
382
|
-
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), new ${member.type}(), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
383
|
-
}
|
|
384
|
-
else if (member.type.startsWith("Set<")) {
|
|
385
|
-
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), new ${member.type}(), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
374
|
+
if (!useFastPath) {
|
|
375
|
+
if (member.value) {
|
|
376
|
+
if (member.value != "null" && member.value != "0" && member.value != "0.0" && member.value != "false") {
|
|
377
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), ${member.value}, offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
378
|
+
}
|
|
386
379
|
}
|
|
387
|
-
else if (member.
|
|
380
|
+
else if (member.generic) {
|
|
381
|
+
INITIALIZE += ` if (isManaged<nonnull<${member.type}>>() || isReference<nonnull<${member.type}>>()) {\n`;
|
|
382
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), changetype<nonnull<${member.type}>>(__new(offsetof<nonnull<${member.type}>>(), idof<nonnull<${member.type}>>())), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
383
|
+
INITIALIZE += ` if (isDefined(this.${member.name}.__INITIALIZE)) changetype<nonnull<${member.type}>>(this.${member.name}).__INITIALIZE();\n`;
|
|
384
|
+
INITIALIZE += ` }\n`;
|
|
388
385
|
}
|
|
389
|
-
else if (member.type
|
|
390
|
-
|
|
386
|
+
else if (!member.node.type.isNullable) {
|
|
387
|
+
if (this.getSchema(member.type)) {
|
|
388
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), changetype<nonnull<${member.type}>>(__new(offsetof<nonnull<${member.type}>>(), idof<nonnull<${member.type}>>())).__INITIALIZE(), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
389
|
+
}
|
|
390
|
+
else if (member.type.startsWith("Array<")) {
|
|
391
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), [], offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
392
|
+
}
|
|
393
|
+
else if (member.type.startsWith("Map<")) {
|
|
394
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), new ${member.type}(), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
395
|
+
}
|
|
396
|
+
else if (member.type.startsWith("Set<")) {
|
|
397
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), new ${member.type}(), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
398
|
+
}
|
|
399
|
+
else if (member.type.startsWith("StaticArray<")) {
|
|
400
|
+
}
|
|
401
|
+
else if (member.type == "string" || member.type == "String") {
|
|
402
|
+
INITIALIZE += ` store<${member.type}>(changetype<usize>(this), "", offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
403
|
+
}
|
|
391
404
|
}
|
|
392
405
|
}
|
|
393
406
|
const SIMD_ENABLED = this.program.options.hasFeature(16);
|
|
@@ -399,7 +412,7 @@ export class JSONTransform extends Visitor {
|
|
|
399
412
|
SERIALIZE += this.getStores(keyPart, SIMD_ENABLED)
|
|
400
413
|
.map((v) => indent + v + "\n")
|
|
401
414
|
.join("");
|
|
402
|
-
SERIALIZE += indent +
|
|
415
|
+
SERIALIZE += indent + getSerializeCall(member.type, realName);
|
|
403
416
|
if (isFirst)
|
|
404
417
|
isFirst = false;
|
|
405
418
|
}
|
|
@@ -409,7 +422,7 @@ export class JSONTransform extends Visitor {
|
|
|
409
422
|
SERIALIZE += this.getStores(keyPart, SIMD_ENABLED)
|
|
410
423
|
.map((v) => indent + v + "\n")
|
|
411
424
|
.join("");
|
|
412
|
-
SERIALIZE += indent +
|
|
425
|
+
SERIALIZE += indent + getSerializeCall(member.type, realName);
|
|
413
426
|
if (isFirst)
|
|
414
427
|
isFirst = false;
|
|
415
428
|
}
|
|
@@ -422,7 +435,7 @@ export class JSONTransform extends Visitor {
|
|
|
422
435
|
SERIALIZE += this.getStores(keyPart, SIMD_ENABLED)
|
|
423
436
|
.map((v) => indent + v + "\n")
|
|
424
437
|
.join("");
|
|
425
|
-
SERIALIZE += indent +
|
|
438
|
+
SERIALIZE += indent + getSerializeCall(member.type, realName);
|
|
426
439
|
if (!isLast) {
|
|
427
440
|
this.schema.byteSize += 2;
|
|
428
441
|
SERIALIZE += indent + `store<u16>(bs.offset, 44, 0); // ,\n`;
|
|
@@ -440,13 +453,15 @@ export class JSONTransform extends Visitor {
|
|
|
440
453
|
SERIALIZE += indent + `if (!(${toString(member.flags.get(PropertyFlags.OmitIf))})(this)) {\n`;
|
|
441
454
|
}
|
|
442
455
|
else {
|
|
443
|
-
|
|
456
|
+
const expression = member.flags.get(PropertyFlags.OmitIf);
|
|
457
|
+
const rendered = expression.kind == 16 && expression.literalKind == 2 ? JSON.stringify(expression.value).slice(1, -1) : toString(expression);
|
|
458
|
+
SERIALIZE += indent + `if (!(${rendered})) {\n`;
|
|
444
459
|
}
|
|
445
460
|
indentInc();
|
|
446
461
|
SERIALIZE += this.getStores(aliasName + ":", SIMD_ENABLED)
|
|
447
462
|
.map((v) => indent + v + "\n")
|
|
448
463
|
.join("");
|
|
449
|
-
SERIALIZE += indent +
|
|
464
|
+
SERIALIZE += indent + getSerializeCall(member.type, realName);
|
|
450
465
|
if (!isLast) {
|
|
451
466
|
this.schema.byteSize += 2;
|
|
452
467
|
SERIALIZE += indent + `store<u16>(bs.offset, 44, 0); // ,\n`;
|
|
@@ -490,7 +505,246 @@ export class JSONTransform extends Visitor {
|
|
|
490
505
|
sortedMembers.object.push(member);
|
|
491
506
|
}
|
|
492
507
|
}
|
|
493
|
-
|
|
508
|
+
const getComparisions = (data, ptr, operator) => {
|
|
509
|
+
const dataBytes = data.length << 1;
|
|
510
|
+
let offset = 0;
|
|
511
|
+
const output = [];
|
|
512
|
+
while (offset < dataBytes) {
|
|
513
|
+
const rem = dataBytes - offset;
|
|
514
|
+
if (rem >= 8) {
|
|
515
|
+
output.push(`load<u64>(${ptr}, ${offset}) ${operator} 0x${toU64(data, offset >> 1).toString(16)}`);
|
|
516
|
+
offset += 8;
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
if (rem >= 4) {
|
|
520
|
+
output.push(`load<u32>(${ptr}, ${offset}) ${operator} 0x${toU32(data, offset >> 1).toString(16)}`);
|
|
521
|
+
offset += 4;
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
if (rem >= 2) {
|
|
525
|
+
output.push(`load<u16>(${ptr}, ${offset}) ${operator} 0x${data.charCodeAt(offset >> 1).toString(16)}`);
|
|
526
|
+
offset += 2;
|
|
527
|
+
continue;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return output;
|
|
531
|
+
};
|
|
532
|
+
const UNSIGNED_INTEGER_TYPES = ["u8", "u16", "u32", "u64", "usize"];
|
|
533
|
+
const SIGNED_INTEGER_TYPES = ["i8", "i16", "i32", "i64", "isize"];
|
|
534
|
+
const FLOAT_TYPES = ["f32", "f64"];
|
|
535
|
+
const INTEGER_TYPES = [...UNSIGNED_INTEGER_TYPES, ...SIGNED_INTEGER_TYPES];
|
|
536
|
+
const STRING_FIELD_DESERIALIZER = codegenMode === JSONMode.SIMD ? "deserializeStringField_SIMD" : "deserializeStringField_SWAR";
|
|
537
|
+
const getArrayValueType = (type) => {
|
|
538
|
+
if (type.startsWith("Array<") || type.startsWith("StaticArray<")) {
|
|
539
|
+
return stripNull(type.slice(type.indexOf("<") + 1, -1).trim());
|
|
540
|
+
}
|
|
541
|
+
return null;
|
|
542
|
+
};
|
|
543
|
+
const getDeserializer = (type, srcPtr, outPtr, member, keyOffset = 0) => {
|
|
544
|
+
const out = [];
|
|
545
|
+
const resolvedType = stripNull(type);
|
|
546
|
+
const fieldOffset = `offsetof<this>(${JSON.stringify(member.name)})`;
|
|
547
|
+
const fieldPtr = `${outPtr} + offsetof<this>(${JSON.stringify(member.name)})`;
|
|
548
|
+
const valuePtr = keyOffset ? `${srcPtr} + ${keyOffset}` : srcPtr;
|
|
549
|
+
if (INTEGER_TYPES.includes(resolvedType)) {
|
|
550
|
+
const helper = SIGNED_INTEGER_TYPES.includes(resolvedType) ? "deserializeIntegerField" : "deserializeUnsignedField";
|
|
551
|
+
out.push(`${srcPtr} = ${helper}<${resolvedType}>(${valuePtr}, srcEnd, ${fieldPtr});`);
|
|
552
|
+
}
|
|
553
|
+
else if (["string", "String"].includes(resolvedType)) {
|
|
554
|
+
out.push("{");
|
|
555
|
+
if (member.node.type.isNullable) {
|
|
556
|
+
out.push(` if (load<u64>(${valuePtr}) == 30399761348886638) {`);
|
|
557
|
+
out.push(` store<${member.type}>(${outPtr}, changetype<${member.type}>(0), ${fieldOffset});`);
|
|
558
|
+
out.push(` ${srcPtr} = ${valuePtr} + 8;`);
|
|
559
|
+
out.push(" } else {");
|
|
560
|
+
}
|
|
561
|
+
out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${member.type}>(${valuePtr}, srcEnd, ${fieldPtr});`);
|
|
562
|
+
if (member.node.type.isNullable) {
|
|
563
|
+
out.push(" }");
|
|
564
|
+
}
|
|
565
|
+
out.push("}");
|
|
566
|
+
}
|
|
567
|
+
else if (isBoolean(resolvedType)) {
|
|
568
|
+
out.push("{");
|
|
569
|
+
out.push(` if (load<u64>(${srcPtr}) == 28429475166421108) {`);
|
|
570
|
+
out.push(` store<${resolvedType}>(${outPtr}, true, ${fieldOffset});`);
|
|
571
|
+
out.push(` ${srcPtr} += 8;`);
|
|
572
|
+
out.push(" } else if (load<u64>(" + srcPtr + ") == 32370086184550502 && load<u16>(" + srcPtr + ", 8) == 101) {");
|
|
573
|
+
out.push(` store<${resolvedType}>(${outPtr}, false, ${fieldOffset});`);
|
|
574
|
+
out.push(` ${srcPtr} += 10;`);
|
|
575
|
+
out.push(" } else break;");
|
|
576
|
+
out.push("}");
|
|
577
|
+
}
|
|
578
|
+
else if (FLOAT_TYPES.includes(resolvedType)) {
|
|
579
|
+
out.push(`${srcPtr} = deserializeFloatField<${resolvedType}>(${valuePtr}, srcEnd, ${fieldPtr});`);
|
|
580
|
+
}
|
|
581
|
+
else if (this.getSchema(resolvedType)) {
|
|
582
|
+
out.push("{");
|
|
583
|
+
if (member.node.type.isNullable) {
|
|
584
|
+
out.push(` if (load<u64>(${srcPtr}) == 30399761348886638) {`);
|
|
585
|
+
out.push(` store<${resolvedType}>(${outPtr}, changetype<${resolvedType}>(0), ${fieldOffset});`);
|
|
586
|
+
out.push(` ${srcPtr} += 8;`);
|
|
587
|
+
out.push(" } else {");
|
|
588
|
+
}
|
|
589
|
+
out.push(` let value = load<${resolvedType}>(${outPtr}, ${fieldOffset});`);
|
|
590
|
+
out.push(" if (changetype<usize>(value) == 0) {");
|
|
591
|
+
out.push(` value = changetype<${resolvedType}>(__new(offsetof<nonnull<${resolvedType}>>(), idof<nonnull<${resolvedType}>>()));`);
|
|
592
|
+
out.push(` store<${resolvedType}>(${outPtr}, value, ${fieldOffset});`);
|
|
593
|
+
out.push(" }");
|
|
594
|
+
out.push(` ${srcPtr} = changetype<nonnull<${resolvedType}>>(value).__DESERIALIZE<${resolvedType}>(${srcPtr}, srcEnd, value);`);
|
|
595
|
+
if (member.node.type.isNullable) {
|
|
596
|
+
out.push(" }");
|
|
597
|
+
}
|
|
598
|
+
out.push("}");
|
|
599
|
+
}
|
|
600
|
+
else if (resolvedType.startsWith("Array<")) {
|
|
601
|
+
const valueType = getArrayValueType(resolvedType);
|
|
602
|
+
if (valueType && ["string", "String"].includes(valueType)) {
|
|
603
|
+
out.push("{");
|
|
604
|
+
out.push(` if (load<u16>(${srcPtr}) != 0x5b) break;`);
|
|
605
|
+
out.push(` let value = load<${resolvedType}>(${outPtr}, ${fieldOffset});`);
|
|
606
|
+
out.push(" if (changetype<usize>(value) == 0) {");
|
|
607
|
+
out.push(` value = [];`);
|
|
608
|
+
out.push(` store<${resolvedType}>(${outPtr}, value, ${fieldOffset});`);
|
|
609
|
+
out.push(" }");
|
|
610
|
+
out.push(" let index = 0;");
|
|
611
|
+
out.push(` ${srcPtr} += 2;`);
|
|
612
|
+
out.push(` if (load<u16>(${srcPtr}) == 0x5d) {`);
|
|
613
|
+
out.push(" value.length = 0;");
|
|
614
|
+
out.push(` ${srcPtr} += 2;`);
|
|
615
|
+
out.push(" } else while (true) {");
|
|
616
|
+
out.push(' if (index >= value.length) value.push("");');
|
|
617
|
+
out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${valueType}>(${srcPtr}, srcEnd, value.dataStart + ((<usize>index) << alignof<${valueType}>()));`);
|
|
618
|
+
out.push(" index++;");
|
|
619
|
+
out.push(` const code = load<u16>(${srcPtr});`);
|
|
620
|
+
out.push(" if (code == 0x2c) {");
|
|
621
|
+
out.push(` ${srcPtr} += 2;`);
|
|
622
|
+
out.push(" continue;");
|
|
623
|
+
out.push(" }");
|
|
624
|
+
out.push(" if (code == 0x5d) {");
|
|
625
|
+
out.push(" value.length = index;");
|
|
626
|
+
out.push(` ${srcPtr} += 2;`);
|
|
627
|
+
out.push(" break;");
|
|
628
|
+
out.push(" }");
|
|
629
|
+
out.push(" break;");
|
|
630
|
+
out.push(" }");
|
|
631
|
+
out.push("}");
|
|
632
|
+
}
|
|
633
|
+
else if (valueType && this.getSchema(valueType)) {
|
|
634
|
+
out.push("{");
|
|
635
|
+
out.push(` if (load<u16>(${srcPtr}) != 0x5b) break;`);
|
|
636
|
+
out.push(` let value = load<${resolvedType}>(${outPtr}, ${fieldOffset});`);
|
|
637
|
+
out.push(" if (changetype<usize>(value) == 0) {");
|
|
638
|
+
out.push(` value = [];`);
|
|
639
|
+
out.push(` store<${resolvedType}>(${outPtr}, value, ${fieldOffset});`);
|
|
640
|
+
out.push(" }");
|
|
641
|
+
out.push(" let index = 0;");
|
|
642
|
+
out.push(` ${srcPtr} += 2;`);
|
|
643
|
+
out.push(` if (load<u16>(${srcPtr}) == 0x5d) {`);
|
|
644
|
+
out.push(" value.length = 0;");
|
|
645
|
+
out.push(` ${srcPtr} += 2;`);
|
|
646
|
+
out.push(" } else while (true) {");
|
|
647
|
+
out.push(` let item: ${valueType};`);
|
|
648
|
+
out.push(" if (index < value.length) {");
|
|
649
|
+
out.push(" item = unchecked(value[index]);");
|
|
650
|
+
out.push(" if (changetype<usize>(item) == 0) {");
|
|
651
|
+
out.push(` item = changetype<${valueType}>(__new(offsetof<nonnull<${valueType}>>(), idof<nonnull<${valueType}>>()));`);
|
|
652
|
+
out.push(" unchecked((value[index] = item));");
|
|
653
|
+
out.push(" }");
|
|
654
|
+
out.push(" } else {");
|
|
655
|
+
out.push(` item = changetype<${valueType}>(__new(offsetof<nonnull<${valueType}>>(), idof<nonnull<${valueType}>>()));`);
|
|
656
|
+
out.push(" value.push(item);");
|
|
657
|
+
out.push(" }");
|
|
658
|
+
out.push(` ${srcPtr} = changetype<nonnull<${valueType}>>(item).__DESERIALIZE<${valueType}>(${srcPtr}, srcEnd, item);`);
|
|
659
|
+
out.push(" index++;");
|
|
660
|
+
out.push(` const code = load<u16>(${srcPtr});`);
|
|
661
|
+
out.push(" if (code == 0x2c) {");
|
|
662
|
+
out.push(` ${srcPtr} += 2;`);
|
|
663
|
+
out.push(" continue;");
|
|
664
|
+
out.push(" }");
|
|
665
|
+
out.push(" if (code == 0x5d) {");
|
|
666
|
+
out.push(" value.length = index;");
|
|
667
|
+
out.push(` ${srcPtr} += 2;`);
|
|
668
|
+
out.push(" break;");
|
|
669
|
+
out.push(" }");
|
|
670
|
+
out.push(" break;");
|
|
671
|
+
out.push(" }");
|
|
672
|
+
out.push("}");
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
out.push(`${srcPtr} = deserializeArrayField_SWAR<${resolvedType}>(${srcPtr}, srcEnd, ${fieldPtr});`);
|
|
676
|
+
out.push(`if (!${srcPtr}) break;`);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
out.push("{");
|
|
681
|
+
out.push(` const valueStart = ${srcPtr};`);
|
|
682
|
+
out.push(" let depth: i32 = 0;");
|
|
683
|
+
out.push(" let inString = false;");
|
|
684
|
+
out.push(` while (${srcPtr} < srcEnd) {`);
|
|
685
|
+
out.push(` const code = load<u16>(${srcPtr});`);
|
|
686
|
+
out.push(" if (inString) {");
|
|
687
|
+
out.push(` if (code == 0x22 && load<u16>(${srcPtr} - 2) != 0x5c) inString = false;`);
|
|
688
|
+
out.push(` ${srcPtr} += 2;`);
|
|
689
|
+
out.push(" continue;");
|
|
690
|
+
out.push(" }");
|
|
691
|
+
out.push(" if (code == 0x22) {");
|
|
692
|
+
out.push(" inString = true;");
|
|
693
|
+
out.push(` ${srcPtr} += 2;`);
|
|
694
|
+
out.push(" continue;");
|
|
695
|
+
out.push(" }");
|
|
696
|
+
out.push(" if (code == 0x7b || code == 0x5b) {");
|
|
697
|
+
out.push(" depth++;");
|
|
698
|
+
out.push(` ${srcPtr} += 2;`);
|
|
699
|
+
out.push(" continue;");
|
|
700
|
+
out.push(" }");
|
|
701
|
+
out.push(" if (code == 0x7d || code == 0x5d) {");
|
|
702
|
+
out.push(" if (depth == 0) break;");
|
|
703
|
+
out.push(" depth--;");
|
|
704
|
+
out.push(` ${srcPtr} += 2;`);
|
|
705
|
+
out.push(" continue;");
|
|
706
|
+
out.push(" }");
|
|
707
|
+
out.push(" if (code == 0x2c && depth == 0) break;");
|
|
708
|
+
out.push(` ${srcPtr} += 2;`);
|
|
709
|
+
out.push(" }");
|
|
710
|
+
out.push(` if (inString || depth != 0 || ${srcPtr} <= valueStart) break;`);
|
|
711
|
+
out.push(` store<${resolvedType}>(${outPtr}, JSON.__deserialize<${resolvedType}>(valueStart, ${srcPtr}), ${fieldOffset});`);
|
|
712
|
+
out.push("}");
|
|
713
|
+
}
|
|
714
|
+
return out;
|
|
715
|
+
};
|
|
716
|
+
indent = " ";
|
|
717
|
+
DESERIALIZE_FAST += indent + "const dst = changetype<usize>(out);\n";
|
|
718
|
+
DESERIALIZE_FAST += indent + "do {\n";
|
|
719
|
+
indent += " ";
|
|
720
|
+
for (let i = 0; i < this.schema.members.length; i++) {
|
|
721
|
+
const member = this.schema.members[i];
|
|
722
|
+
const key = JSON.stringify(member.alias || member.name);
|
|
723
|
+
if (key.length <= 2)
|
|
724
|
+
throw new Error("Key cannot be empty!");
|
|
725
|
+
const keySection = (i == 0 ? "{" : ",") + key + ":";
|
|
726
|
+
DESERIALIZE_FAST += indent + `if ( // ${keySection}\n${(indent += " ")}${getComparisions(keySection, "srcStart", "!=").join("\n" + indent + "|| ")}\n${(indent = indent.slice(0, -2))}) break;\n`;
|
|
727
|
+
const keyOffset = keySection.length << 1;
|
|
728
|
+
const resolvedType = stripNull(member.type);
|
|
729
|
+
const inlineStringValue = ["string", "String"].includes(resolvedType);
|
|
730
|
+
if (!inlineStringValue) {
|
|
731
|
+
DESERIALIZE_FAST += indent + `srcStart += ${keyOffset};\n\n`;
|
|
732
|
+
}
|
|
733
|
+
const deserializer = getDeserializer(member.type, "srcStart", "dst", member, inlineStringValue ? keyOffset : 0);
|
|
734
|
+
if (!deserializer.length) {
|
|
735
|
+
DESERIALIZE_FAST += indent + "break;\n\n";
|
|
736
|
+
continue;
|
|
737
|
+
}
|
|
738
|
+
DESERIALIZE_FAST += indent + deserializer.join("\n" + indent) + "\n\n";
|
|
739
|
+
}
|
|
740
|
+
DESERIALIZE_FAST += indent + "if (load<u16>(srcStart) !== 0x7d) break; // }\n";
|
|
741
|
+
DESERIALIZE_FAST += indent + "srcStart += 2;\n";
|
|
742
|
+
DESERIALIZE_FAST += indent + "return srcStart;\n";
|
|
743
|
+
indent = indent.slice(0, -2);
|
|
744
|
+
DESERIALIZE_FAST += indent + "} while (false);\n\n";
|
|
745
|
+
DESERIALIZE_FAST += indent + 'throw new Error("Failed to parse JSON ");';
|
|
746
|
+
indent = indent.slice(0, -2);
|
|
747
|
+
DESERIALIZE_FAST += indent + "}";
|
|
494
748
|
DESERIALIZE += indent + " let keyStart: usize = 0;\n";
|
|
495
749
|
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
|
|
496
750
|
DESERIALIZE += indent + " let isKey = false;\n";
|
|
@@ -856,7 +1110,7 @@ export class JSONTransform extends Visitor {
|
|
|
856
1110
|
DESERIALIZE += "\n }";
|
|
857
1111
|
mbElse = " else ";
|
|
858
1112
|
DESERIALIZE += mbElse + "if (code == 102) {\n";
|
|
859
|
-
DESERIALIZE += "
|
|
1113
|
+
DESERIALIZE += " {\n";
|
|
860
1114
|
DESERIALIZE += " srcStart += 10;\n";
|
|
861
1115
|
if (DEBUG > 1)
|
|
862
1116
|
DESERIALIZE += ' console.log("Value (bool, ' + ++id + '): " + JSON.Util.ptrToStr(lastIndex, srcStart - 10));';
|
|
@@ -894,9 +1148,6 @@ export class JSONTransform extends Visitor {
|
|
|
894
1148
|
}
|
|
895
1149
|
}, "boolean");
|
|
896
1150
|
DESERIALIZE += " }";
|
|
897
|
-
DESERIALIZE += " else {\n";
|
|
898
|
-
DESERIALIZE += " throw new Error(\"Expected to find 'false' but found '\" + JSON.Util.ptrToStr(lastIndex, srcStart) + \"' instead at position \" + (srcEnd - srcStart).toString());\n";
|
|
899
|
-
DESERIALIZE += " }";
|
|
900
1151
|
DESERIALIZE += "\n }";
|
|
901
1152
|
mbElse = " else ";
|
|
902
1153
|
}
|
|
@@ -951,29 +1202,36 @@ export class JSONTransform extends Visitor {
|
|
|
951
1202
|
indentDec();
|
|
952
1203
|
DESERIALIZE += ` }\n`;
|
|
953
1204
|
indentDec();
|
|
954
|
-
DESERIALIZE += ` return
|
|
1205
|
+
DESERIALIZE += ` return srcStart;\n}\n`;
|
|
955
1206
|
indent = " ";
|
|
956
1207
|
this.schema.byteSize += 2;
|
|
957
1208
|
SERIALIZE += indent + "store<u16>(bs.offset, 125, 0); // }\n";
|
|
958
1209
|
SERIALIZE += indent + "bs.offset += 2;\n";
|
|
959
1210
|
SERIALIZE += "}";
|
|
960
1211
|
SERIALIZE = SERIALIZE.slice(0, 32) + indent + "bs.proposeSize(" + this.schema.byteSize + ");\n" + SERIALIZE.slice(32);
|
|
961
|
-
|
|
962
|
-
|
|
1212
|
+
if (!useFastPath) {
|
|
1213
|
+
INITIALIZE += " return this;\n";
|
|
1214
|
+
INITIALIZE += "}";
|
|
1215
|
+
}
|
|
963
1216
|
if (DEBUG > 0) {
|
|
964
1217
|
console.log(SERIALIZE_CUSTOM || SERIALIZE);
|
|
965
|
-
|
|
1218
|
+
if (!useFastPath)
|
|
1219
|
+
console.log(INITIALIZE);
|
|
966
1220
|
console.log(DESERIALIZE_CUSTOM || DESERIALIZE);
|
|
967
1221
|
}
|
|
1222
|
+
const DESERIALIZE_DIRECT = useFastPath ? DESERIALIZE_FAST.replace("@inline __DESERIALIZE_FAST<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {", "@inline __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {") : DESERIALIZE.replace("__DESERIALIZE_SLOW<__JSON_T>", "__DESERIALIZE<__JSON_T>");
|
|
968
1223
|
const SERIALIZE_METHOD = SimpleParser.parseClassMember(SERIALIZE_CUSTOM || SERIALIZE, node);
|
|
969
|
-
const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
|
|
970
|
-
const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_CUSTOM ||
|
|
1224
|
+
const INITIALIZE_METHOD = !useFastPath ? SimpleParser.parseClassMember(INITIALIZE, node) : null;
|
|
1225
|
+
const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_CUSTOM || DESERIALIZE_DIRECT, node);
|
|
1226
|
+
const DESERIALIZE_FAST_METHOD = useFastPath ? SimpleParser.parseClassMember(DESERIALIZE_FAST, node) : null;
|
|
971
1227
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
972
1228
|
node.members.push(SERIALIZE_METHOD);
|
|
973
|
-
if (!node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
1229
|
+
if (!useFastPath && INITIALIZE_METHOD && !node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
974
1230
|
node.members.push(INITIALIZE_METHOD);
|
|
975
1231
|
if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
976
1232
|
node.members.push(DESERIALIZE_METHOD);
|
|
1233
|
+
if (!DESERIALIZE_CUSTOM && useFastPath && DESERIALIZE_FAST_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE_FAST"))
|
|
1234
|
+
node.members.push(DESERIALIZE_FAST_METHOD);
|
|
977
1235
|
super.visitClassDeclaration(node);
|
|
978
1236
|
}
|
|
979
1237
|
getSchema(name) {
|
|
@@ -983,18 +1241,20 @@ export class JSONTransform extends Visitor {
|
|
|
983
1241
|
generateEmptyMethods(node) {
|
|
984
1242
|
const SERIALIZE_EMPTY = "@inline __SERIALIZE(ptr: usize): void {\n bs.proposeSize(4);\n store<u32>(bs.offset, 8192123);\n bs.offset += 4;\n}";
|
|
985
1243
|
const INITIALIZE_EMPTY = "@inline __INITIALIZE(): this {\n return this;\n}";
|
|
986
|
-
const DESERIALIZE_EMPTY = "@inline __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T):
|
|
1244
|
+
const DESERIALIZE_EMPTY = "@inline __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {\n return srcEnd;\n}";
|
|
1245
|
+
const useFastPath = USE_FAST_PATH && getCodegenMode(this.program) !== JSONMode.NAIVE;
|
|
987
1246
|
if (DEBUG > 0) {
|
|
988
1247
|
console.log(SERIALIZE_EMPTY);
|
|
989
|
-
|
|
1248
|
+
if (!useFastPath)
|
|
1249
|
+
console.log(INITIALIZE_EMPTY);
|
|
990
1250
|
console.log(DESERIALIZE_EMPTY);
|
|
991
1251
|
}
|
|
992
1252
|
const SERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_EMPTY, node);
|
|
993
|
-
const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
|
|
1253
|
+
const INITIALIZE_METHOD_EMPTY = !useFastPath ? SimpleParser.parseClassMember(INITIALIZE_EMPTY, node) : null;
|
|
994
1254
|
const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
|
|
995
1255
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
996
1256
|
node.members.push(SERIALIZE_METHOD_EMPTY);
|
|
997
|
-
if (!node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
1257
|
+
if (!useFastPath && INITIALIZE_METHOD_EMPTY && !node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
998
1258
|
node.members.push(INITIALIZE_METHOD_EMPTY);
|
|
999
1259
|
if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
1000
1260
|
node.members.push(DESERIALIZE_METHOD_EMPTY);
|
|
@@ -1023,6 +1283,20 @@ export class JSONTransform extends Visitor {
|
|
|
1023
1283
|
fromPath = fromPath.startsWith("~lib") ? fromPath.slice(5) : path.join(this.baseCWD, fromPath);
|
|
1024
1284
|
const bsImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "bs" || d.name.text == "bs"));
|
|
1025
1285
|
const jsonImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "JSON" || d.name.text == "JSON"));
|
|
1286
|
+
const atoiImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "atoi" || d.name.text == "atoi"));
|
|
1287
|
+
const deserializeIntegerFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeIntegerField" || d.name.text == "deserializeIntegerField"));
|
|
1288
|
+
const deserializeUnsignedFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeUnsignedField" || d.name.text == "deserializeUnsignedField"));
|
|
1289
|
+
const deserializeFloatFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeFloatField" || d.name.text == "deserializeFloatField"));
|
|
1290
|
+
const deserializeArrayField_SWARImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeArrayField_SWAR" || d.name.text == "deserializeArrayField_SWAR"));
|
|
1291
|
+
const deserializeStringFieldSWARImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeStringField_SWAR" || d.name.text == "deserializeStringField_SWAR"));
|
|
1292
|
+
const deserializeStringFieldSIMDImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeStringField_SIMD" || d.name.text == "deserializeStringField_SIMD"));
|
|
1293
|
+
const sourceText = readFileSync(fromPath).toString();
|
|
1294
|
+
const hasLocalDeserializeIntegerField = /\bdeserializeIntegerField\b/.test(sourceText);
|
|
1295
|
+
const hasLocalDeserializeUnsignedField = /\bdeserializeUnsignedField\b/.test(sourceText);
|
|
1296
|
+
const hasLocalDeserializeFloatField = /\bdeserializeFloatField\b/.test(sourceText);
|
|
1297
|
+
const hasLocaldeserializeArrayField_SWAR = /\bdeserializeArrayField_SWAR\b/.test(sourceText);
|
|
1298
|
+
const hasLocalDeserializeStringFieldSWAR = /\bdeserializeStringField_SWAR\b/.test(sourceText);
|
|
1299
|
+
const hasLocalDeserializeStringFieldSIMD = /\bdeserializeStringField_SIMD\b/.test(sourceText);
|
|
1026
1300
|
let baseRel = path.posix.join(...path.relative(path.dirname(fromPath), path.join(baseDir)).split(path.sep));
|
|
1027
1301
|
if (baseRel.endsWith("json-as")) {
|
|
1028
1302
|
baseRel = "json-as" + baseRel.slice(baseRel.indexOf("json-as") + 7);
|
|
@@ -1042,6 +1316,49 @@ export class JSONTransform extends Visitor {
|
|
|
1042
1316
|
if (DEBUG > 0)
|
|
1043
1317
|
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1044
1318
|
}
|
|
1319
|
+
if (!atoiImport) {
|
|
1320
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("atoi", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "util", "atoi"), node.range), node.range);
|
|
1321
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1322
|
+
if (DEBUG > 0)
|
|
1323
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1324
|
+
}
|
|
1325
|
+
if (!deserializeIntegerFieldImport && !hasLocalDeserializeIntegerField) {
|
|
1326
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("deserializeIntegerField", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "integer"), node.range), node.range);
|
|
1327
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1328
|
+
if (DEBUG > 0)
|
|
1329
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1330
|
+
}
|
|
1331
|
+
if (!deserializeUnsignedFieldImport && !hasLocalDeserializeUnsignedField) {
|
|
1332
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("deserializeUnsignedField", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "unsigned"), node.range), node.range);
|
|
1333
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1334
|
+
if (DEBUG > 0)
|
|
1335
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1336
|
+
}
|
|
1337
|
+
if (!deserializeFloatFieldImport && !hasLocalDeserializeFloatField) {
|
|
1338
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("deserializeFloatField", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "float"), node.range), node.range);
|
|
1339
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1340
|
+
if (DEBUG > 0)
|
|
1341
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1342
|
+
}
|
|
1343
|
+
if (!deserializeArrayField_SWARImport && !hasLocaldeserializeArrayField_SWAR) {
|
|
1344
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("deserializeArrayField_SWAR", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "array"), node.range), node.range);
|
|
1345
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1346
|
+
if (DEBUG > 0)
|
|
1347
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1348
|
+
}
|
|
1349
|
+
const codegenMode = getCodegenMode(this.program);
|
|
1350
|
+
if (codegenMode !== JSONMode.SIMD && !deserializeStringFieldSWARImport && !hasLocalDeserializeStringFieldSWAR) {
|
|
1351
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("deserializeStringField_SWAR", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "swar", "string"), node.range), node.range);
|
|
1352
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1353
|
+
if (DEBUG > 0)
|
|
1354
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1355
|
+
}
|
|
1356
|
+
if (codegenMode === JSONMode.SIMD && !deserializeStringFieldSIMDImport && !hasLocalDeserializeStringFieldSIMD) {
|
|
1357
|
+
const replaceNode = Node.createImportStatement([Node.createImportDeclaration(Node.createIdentifierExpression("deserializeStringField_SIMD", node.range, false), null, node.range)], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simd", "string"), node.range), node.range);
|
|
1358
|
+
node.range.source.statements.unshift(replaceNode);
|
|
1359
|
+
if (DEBUG > 0)
|
|
1360
|
+
console.log("Added import: " + toString(replaceNode) + " to " + node.range.source.normalizedPath + "\n");
|
|
1361
|
+
}
|
|
1045
1362
|
}
|
|
1046
1363
|
getStores(data, simd = false) {
|
|
1047
1364
|
const out = [];
|
|
@@ -1051,7 +1368,7 @@ export class JSONTransform extends Visitor {
|
|
|
1051
1368
|
if (size == "v128" && simd) {
|
|
1052
1369
|
const index = this.simdStatements.findIndex((v) => v.includes(num));
|
|
1053
1370
|
const name = "SIMD_" + (index == -1 ? this.simdStatements.length : index);
|
|
1054
|
-
if (index
|
|
1371
|
+
if (index == -1)
|
|
1055
1372
|
this.simdStatements.push(`const ${name} = ${num};`);
|
|
1056
1373
|
out.push("store<v128>(bs.offset, " + name + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 8));
|
|
1057
1374
|
offset += 16;
|
|
@@ -1096,6 +1413,23 @@ var JSONMode;
|
|
|
1096
1413
|
JSONMode[JSONMode["NAIVE"] = 2] = "NAIVE";
|
|
1097
1414
|
})(JSONMode || (JSONMode = {}));
|
|
1098
1415
|
let MODE = JSONMode.SWAR;
|
|
1416
|
+
function getCodegenMode(program) {
|
|
1417
|
+
let mode = program.options.hasFeature(16) ? JSONMode.SIMD : JSONMode.SWAR;
|
|
1418
|
+
if (process.env["JSON_MODE"]) {
|
|
1419
|
+
switch (process.env["JSON_MODE"].toLowerCase().trim()) {
|
|
1420
|
+
case "simd":
|
|
1421
|
+
mode = JSONMode.SIMD;
|
|
1422
|
+
break;
|
|
1423
|
+
case "swar":
|
|
1424
|
+
mode = JSONMode.SWAR;
|
|
1425
|
+
break;
|
|
1426
|
+
case "naive":
|
|
1427
|
+
mode = JSONMode.NAIVE;
|
|
1428
|
+
break;
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
return mode;
|
|
1432
|
+
}
|
|
1099
1433
|
export default class Transformer extends Transform {
|
|
1100
1434
|
afterInitialize(program) {
|
|
1101
1435
|
if (program.options.hasFeature(16))
|
|
@@ -1117,8 +1451,7 @@ export default class Transformer extends Transform {
|
|
|
1117
1451
|
}
|
|
1118
1452
|
}
|
|
1119
1453
|
program.registerConstantInteger("JSON_MODE", Type.i32, i64_new(MODE));
|
|
1120
|
-
if (process.env["JSON_CACHE"]?.trim().toLowerCase() === "true" ||
|
|
1121
|
-
process.env["JSON_CACHE"]?.trim().toLowerCase() === "1") {
|
|
1454
|
+
if (process.env["JSON_CACHE"]?.trim().toLowerCase() === "true" || process.env["JSON_CACHE"]?.trim().toLowerCase() === "1") {
|
|
1122
1455
|
program.registerConstantInteger("JSON_CACHE", Type.bool, i64_one);
|
|
1123
1456
|
}
|
|
1124
1457
|
}
|
|
@@ -1192,16 +1525,16 @@ function sortMembers(members) {
|
|
|
1192
1525
|
});
|
|
1193
1526
|
}
|
|
1194
1527
|
function toU16(data, offset = 0) {
|
|
1195
|
-
return data.charCodeAt(offset + 0)
|
|
1528
|
+
return data.charCodeAt(offset + 0);
|
|
1196
1529
|
}
|
|
1197
1530
|
function toU32(data, offset = 0) {
|
|
1198
|
-
return (
|
|
1531
|
+
return (data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0);
|
|
1199
1532
|
}
|
|
1200
1533
|
function toU48(data, offset = 0) {
|
|
1201
|
-
return (
|
|
1534
|
+
return (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0));
|
|
1202
1535
|
}
|
|
1203
1536
|
function toU64(data, offset = 0) {
|
|
1204
|
-
return (
|
|
1537
|
+
return (BigInt(data.charCodeAt(offset + 3)) << 48n) | (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0));
|
|
1205
1538
|
}
|
|
1206
1539
|
function toMemCDecl(n, indent) {
|
|
1207
1540
|
let out = "";
|