json-as 1.3.7 → 1.3.9

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.
Files changed (116) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +1 -1
  3. package/assembly/deserialize/index/arbitrary.ts +2 -2
  4. package/assembly/deserialize/index/array.ts +29 -14
  5. package/assembly/deserialize/index/bool.ts +1 -1
  6. package/assembly/deserialize/index/date.ts +1 -1
  7. package/assembly/deserialize/index/float.ts +40 -1
  8. package/assembly/deserialize/index/integer.ts +3 -3
  9. package/assembly/deserialize/index/map.ts +1 -1
  10. package/assembly/deserialize/index/object.ts +1 -1
  11. package/assembly/deserialize/index/raw.ts +1 -1
  12. package/assembly/deserialize/index/set.ts +1 -1
  13. package/assembly/deserialize/index/staticarray.ts +4 -1
  14. package/assembly/deserialize/index/string.ts +28 -3
  15. package/assembly/deserialize/index/struct.ts +1 -1
  16. package/assembly/deserialize/index/typedarray.ts +25 -15
  17. package/assembly/deserialize/index/unsigned.ts +3 -3
  18. package/assembly/deserialize/index.ts +1 -0
  19. package/assembly/deserialize/naive/array/bool.ts +68 -0
  20. package/assembly/deserialize/naive/array/float.ts +63 -0
  21. package/assembly/deserialize/{simple → naive}/array/generic.ts +1 -2
  22. package/assembly/deserialize/naive/array/integer.ts +86 -0
  23. package/assembly/deserialize/{simple → naive}/array/map.ts +0 -1
  24. package/assembly/deserialize/{simple → naive}/array/object.ts +0 -1
  25. package/assembly/deserialize/naive/array/string.ts +69 -0
  26. package/assembly/deserialize/{simple → naive}/array/struct.ts +0 -1
  27. package/assembly/deserialize/{simple → naive}/array.ts +6 -11
  28. package/assembly/deserialize/naive/float.ts +135 -0
  29. package/assembly/deserialize/{simple → naive}/integer.ts +2 -2
  30. package/assembly/deserialize/{simple → naive}/map.ts +12 -6
  31. package/assembly/deserialize/{simple → naive}/object.ts +4 -7
  32. package/assembly/deserialize/{simple → naive}/set.ts +12 -27
  33. package/assembly/deserialize/{simple → naive}/staticarray/array.ts +1 -1
  34. package/assembly/deserialize/{simple → naive}/staticarray/bool.ts +1 -1
  35. package/assembly/deserialize/{simple → naive}/staticarray/float.ts +1 -1
  36. package/assembly/deserialize/{simple → naive}/staticarray/integer.ts +1 -1
  37. package/assembly/deserialize/{simple → naive}/staticarray/struct.ts +1 -2
  38. package/assembly/deserialize/{simple → naive}/staticarray.ts +4 -4
  39. package/assembly/deserialize/naive/string.ts +199 -0
  40. package/assembly/deserialize/{simple → naive}/typedarray.ts +4 -4
  41. package/assembly/deserialize/{simple → naive}/unsigned.ts +2 -2
  42. package/assembly/deserialize/simd/array/integer.ts +19 -19
  43. package/assembly/deserialize/simd/float.ts +303 -0
  44. package/assembly/deserialize/simd/string.ts +233 -108
  45. package/assembly/deserialize/swar/array/arbitrary.ts +6 -2
  46. package/assembly/deserialize/swar/array/array.ts +14 -7
  47. package/assembly/deserialize/swar/array/bool.ts +8 -3
  48. package/assembly/deserialize/swar/array/box.ts +6 -2
  49. package/assembly/deserialize/swar/array/float.ts +282 -6
  50. package/assembly/deserialize/swar/array/generic.ts +6 -2
  51. package/assembly/deserialize/swar/array/integer.ts +81 -74
  52. package/assembly/deserialize/swar/array/map.ts +6 -2
  53. package/assembly/deserialize/swar/array/object.ts +24 -32
  54. package/assembly/deserialize/swar/array/raw.ts +6 -2
  55. package/assembly/deserialize/swar/array/shared.ts +32 -8
  56. package/assembly/deserialize/swar/array/string.ts +127 -10
  57. package/assembly/deserialize/swar/array/struct.ts +45 -11
  58. package/assembly/deserialize/swar/array.ts +2 -56
  59. package/assembly/deserialize/swar/float.ts +304 -0
  60. package/assembly/deserialize/swar/string.ts +119 -104
  61. package/assembly/deserialize/swar/typedarray.ts +224 -0
  62. package/assembly/index.ts +203 -293
  63. package/assembly/serialize/index/array.ts +1 -1
  64. package/assembly/serialize/index/bool.ts +1 -1
  65. package/assembly/serialize/index/date.ts +1 -1
  66. package/assembly/serialize/index/float.ts +1 -1
  67. package/assembly/serialize/index/integer.ts +1 -1
  68. package/assembly/serialize/index/map.ts +1 -1
  69. package/assembly/serialize/index/raw.ts +1 -1
  70. package/assembly/serialize/index/set.ts +1 -1
  71. package/assembly/serialize/index/staticarray.ts +1 -1
  72. package/assembly/serialize/index/string.ts +1 -1
  73. package/assembly/serialize/index/struct.ts +1 -1
  74. package/assembly/serialize/index/typedarray.ts +2 -11
  75. package/assembly/serialize/index.ts +1 -0
  76. package/assembly/serialize/{simple → naive}/array.ts +87 -0
  77. package/assembly/serialize/{simple → naive}/string.ts +1 -1
  78. package/assembly/serialize/swar/string.ts +0 -139
  79. package/assembly/util/dragonbox.ts +10 -3
  80. package/assembly/util/itoa-fast.ts +29 -18
  81. package/assembly/util/scanValueEnd.ts +78 -0
  82. package/assembly/util/scientific.ts +132 -0
  83. package/lib/as-bs.ts +14 -1
  84. package/package.json +14 -13
  85. package/transform/lib/index.d.ts +4 -0
  86. package/transform/lib/index.d.ts.map +1 -1
  87. package/transform/lib/index.js +155 -238
  88. package/transform/lib/index.js.map +1 -1
  89. package/assembly/deserialize/simple/arbitrary.ts +0 -30
  90. package/assembly/deserialize/simple/array/bool.ts +0 -48
  91. package/assembly/deserialize/simple/array/float.ts +0 -55
  92. package/assembly/deserialize/simple/array/integer.ts +0 -33
  93. package/assembly/deserialize/simple/array/string.ts +0 -29
  94. package/assembly/deserialize/simple/float.ts +0 -206
  95. package/assembly/deserialize/simple/string.ts +0 -45
  96. package/assembly/serialize/simple/arbitrary.ts +0 -79
  97. package/assembly/serialize/simple/object.ts +0 -42
  98. /package/assembly/deserialize/{simple → naive}/array/arbitrary.ts +0 -0
  99. /package/assembly/deserialize/{simple → naive}/array/array.ts +0 -0
  100. /package/assembly/deserialize/{simple → naive}/array/box.ts +0 -0
  101. /package/assembly/deserialize/{simple → naive}/array/raw.ts +0 -0
  102. /package/assembly/deserialize/{simple → naive}/bool.ts +0 -0
  103. /package/assembly/deserialize/{simple → naive}/date.ts +0 -0
  104. /package/assembly/deserialize/{simple → naive}/raw.ts +0 -0
  105. /package/assembly/deserialize/{simple → naive}/staticarray/string.ts +0 -0
  106. /package/assembly/deserialize/{simple → naive}/struct.ts +0 -0
  107. /package/assembly/serialize/{simple → naive}/bool.ts +0 -0
  108. /package/assembly/serialize/{simple → naive}/date.ts +0 -0
  109. /package/assembly/serialize/{simple → naive}/float.ts +0 -0
  110. /package/assembly/serialize/{simple → naive}/integer.ts +0 -0
  111. /package/assembly/serialize/{simple → naive}/map.ts +0 -0
  112. /package/assembly/serialize/{simple → naive}/raw.ts +0 -0
  113. /package/assembly/serialize/{simple → naive}/set.ts +0 -0
  114. /package/assembly/serialize/{simple → naive}/staticarray.ts +0 -0
  115. /package/assembly/serialize/{simple → naive}/struct.ts +0 -0
  116. /package/assembly/serialize/{simple → naive}/typedarray.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as",
3
- "version": "1.3.7",
3
+ "version": "1.3.9",
4
4
  "author": "Jairus Tanaka",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,21 +11,22 @@
11
11
  "devDependencies": {
12
12
  "@assemblyscript/wasi-shim": "^0.1.0",
13
13
  "@eslint/js": "^10.0.1",
14
- "@types/node": "^25.6.2",
15
- "as-test": "^1.1.10",
14
+ "@types/node": "^25.9.1",
15
+ "as-heap-analyzer": "^1.2.0",
16
+ "as-test": "^1.5.2",
16
17
  "assemblyscript": "^0.28.17",
17
18
  "assemblyscript-prettier": "^3.0.4",
18
19
  "chartjs-node-canvas": "^5.0.0",
19
20
  "chartjs-plugin-datalabels": "^2.2.0",
20
- "eslint": "^10.3.0",
21
+ "eslint": "^10.4.0",
21
22
  "husky": "^9.1.7",
22
23
  "json-as": "./",
23
24
  "prettier": "3.8.3",
24
25
  "serve": "^14.2.6",
25
- "tinybench": "^6.0.1",
26
- "try-as": "^1.0.1",
26
+ "tinybench": "^6.0.2",
27
+ "try-as": "^1.1.2",
27
28
  "typescript": "^6.0.3",
28
- "typescript-eslint": "^8.59.2"
29
+ "typescript-eslint": "^8.60.0"
29
30
  },
30
31
  "bugs": {
31
32
  "url": "https://github.com/JairusSW/json-as/issues"
@@ -85,13 +86,14 @@
85
86
  },
86
87
  "scripts": {
87
88
  "ci": "act",
88
- "test": "ast test --parallel",
89
- "test:transform": "node transform/__tests__/normalize-base-rel.test.mjs",
90
- "test:fast": "npm run build:transform && JSON_USE_FAST_PATH=1 ast test --parallel --mode swar,simd",
89
+ "test": "ast test --parallel --enable try-as",
90
+ "test:rfc": "ast test --config rfc.config.json --parallel --enable try-as",
91
+ "test:transform": "node transform/__tests__/normalize-base-rel.test.mjs && node transform/__tests__/compute-base-rel.test.mjs && node transform/__tests__/resolve-imports.test.mjs",
92
+ "test:fast": "npm run build:transform && JSON_USE_FAST_PATH=1 ast test --parallel --mode swar,simd --enable try-as",
91
93
  "fuzz": "ast fuzz",
92
94
  "test:fuzz": "ast test --fuzz --parallel",
93
- "test:ci": "ast test --parallel --clean",
94
- "test:coverage": "ast test --enable coverage",
95
+ "test:ci": "ast test --parallel --clean --enable try-as",
96
+ "test:coverage": "ast test --enable coverage --enable try-as",
95
97
  "bench": "bash -c 'bash ./scripts/run-bench.as.sh \"$@\" && { arg=\"${1:-}\"; if [ -z \"$arg\" ] || [ \"${arg#custom/}\" = \"$arg\" ]; then bash ./scripts/run-bench.js.sh \"$@\"; fi; } && bash ./scripts/build-charts.sh' --",
96
98
  "bench:as": "bash ./scripts/run-bench.as.sh",
97
99
  "bench:js": "bash ./scripts/run-bench.js.sh",
@@ -111,7 +113,6 @@
111
113
  "lint:fix": "eslint . --fix --no-warn-ignored",
112
114
  "commitmsg:verify": "bash ./scripts/commit-msg.sh",
113
115
  "precommit:verify": "bash ./scripts/pre-commit.sh",
114
- "prepush:verify": "bash ./scripts/pre-push.sh",
115
116
  "typecheck": "tsc -p ./transform --noEmit",
116
117
  "clean": "rm -rf build/ transform/lib/",
117
118
  "prebuild": "npm run clean",
@@ -3,6 +3,10 @@ import { Transform } from "assemblyscript/dist/transform.js";
3
3
  import { Schema, SourceSet, Src } from "./types.js";
4
4
  import { Visitor } from "./visitor.js";
5
5
  export declare function normalizeJsonAsBaseRel(baseRel: string): string;
6
+ export declare function computeImportBaseRel(fromDir: string, packageDir: string, p?: {
7
+ relative(from: string, to: string): string;
8
+ sep: string;
9
+ }): string;
6
10
  export declare class JSONTransform extends Visitor {
7
11
  static SN: JSONTransform;
8
12
  program: Program;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAOhB,eAAe,EAOf,MAAM,EACN,OAAO,EAEP,MAAM,EAIP,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAM7D,OAAO,EAA2B,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsCvC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9D;AAgND,qBAAa,aAAc,SAAQ,OAAO;IACxC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAuB;IAExC,OAAO,EAAG,OAAO,CAAC;IAClB,OAAO,EAAG,MAAM,CAAC;IACjB,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAA+B;IAC7D,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAmB;IACrC,OAAO,EAAE,eAAe,EAAE,CAAM;IAChC,cAAc,EAAE,MAAM,EAAE,CAAM;IAE9B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAqB;IAEvD,OAAO,CAAC,4BAA4B;IA2DpC,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAiBtD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,cAAoB,GAAG,MAAM;IA4C3E,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA68EnD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQtC,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA8DlD,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAIjD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmrB9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe,GAAG,MAAM,EAAE;IAuDxD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO;CA8C3D;AA8BD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAChD,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BvD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAqEjC;AAqRD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAOhB,eAAe,EAOf,MAAM,EACN,OAAO,EAEP,MAAM,EAIP,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAM7D,OAAO,EAA2B,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsCvC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9D;AAsBD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,CAAC,GAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAS,GACpE,MAAM,CAIR;AAgND,qBAAa,aAAc,SAAQ,OAAO;IACxC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAuB;IAExC,OAAO,EAAG,OAAO,CAAC;IAClB,OAAO,EAAG,MAAM,CAAC;IACjB,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAA+B;IAC7D,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAmB;IACrC,OAAO,EAAE,eAAe,EAAE,CAAM;IAChC,cAAc,EAAE,MAAM,EAAE,CAAM;IAE9B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAqB;IAEvD,OAAO,CAAC,4BAA4B;IA2DpC,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAiBtD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,cAAoB,GAAG,MAAM;IA4C3E,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAwkFnD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQtC,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA8DlD,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAIjD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAyN9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe,GAAG,MAAM,EAAE;IAuDxD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO;CA8C3D;AA8BD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAChD,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BvD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAqEjC;AAqRD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C"}
@@ -1,6 +1,6 @@
1
1
  import { Node, Type, } from "assemblyscript/dist/assemblyscript.js";
2
2
  import { Transform } from "assemblyscript/dist/transform.js";
3
- import { readFileSync, writeFileSync } from "fs";
3
+ import { writeFileSync } from "fs";
4
4
  import * as path from "path";
5
5
  import { fileURLToPath } from "url";
6
6
  import { CustomTransform } from "./linkers/custom.js";
@@ -32,6 +32,9 @@ export function normalizeJsonAsBaseRel(baseRel) {
32
32
  }
33
33
  return baseRel;
34
34
  }
35
+ export function computeImportBaseRel(fromDir, packageDir, p = path) {
36
+ return normalizeJsonAsBaseRel(path.posix.join(...p.relative(fromDir, packageDir).split(p.sep)));
37
+ }
35
38
  function envFlagDefaultTrue(value) {
36
39
  if (!value)
37
40
  return true;
@@ -937,9 +940,7 @@ export class JSONTransform extends Visitor {
937
940
  const SIGNED_INTEGER_TYPES = ["i8", "i16", "i32", "i64", "isize"];
938
941
  const FLOAT_TYPES = ["f32", "f64"];
939
942
  const INTEGER_TYPES = [...UNSIGNED_INTEGER_TYPES, ...SIGNED_INTEGER_TYPES];
940
- const STRING_FIELD_DESERIALIZER = codegenMode === JSONMode.SIMD
941
- ? "deserializeStringField_SIMD"
942
- : "deserializeStringField_SWAR";
943
+ const STRING_FIELD_DESERIALIZER = "__deserializeStringField";
943
944
  const getArrayValueType = (type) => {
944
945
  if (!type.startsWith("Array<") && !type.startsWith("StaticArray<"))
945
946
  return null;
@@ -953,8 +954,8 @@ export class JSONTransform extends Visitor {
953
954
  const valuePtr = keyOffset ? `${srcPtr} + ${keyOffset}` : srcPtr;
954
955
  if (INTEGER_TYPES.includes(resolvedType)) {
955
956
  const helper = SIGNED_INTEGER_TYPES.includes(resolvedType)
956
- ? "deserializeIntegerField"
957
- : "deserializeUnsignedField";
957
+ ? "__deserializeIntegerField"
958
+ : "__deserializeUnsignedField";
958
959
  out.push(`${srcPtr} = ${helper}<${resolvedType}>(${valuePtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
959
960
  }
960
961
  else if (["string", "String"].includes(resolvedType)) {
@@ -965,7 +966,7 @@ export class JSONTransform extends Visitor {
965
966
  out.push(` ${srcPtr} = ${valuePtr} + 8;`);
966
967
  out.push(" } else {");
967
968
  }
968
- out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${member.type}>(${valuePtr}, srcEnd, ${outPtr} + ${fieldOffset});`);
969
+ out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${member.type}>(${valuePtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
969
970
  if (member.node.type.isNullable) {
970
971
  out.push(" }");
971
972
  }
@@ -1083,7 +1084,7 @@ export class JSONTransform extends Visitor {
1083
1084
  out.push("} else break;");
1084
1085
  }
1085
1086
  else if (FLOAT_TYPES.includes(resolvedType)) {
1086
- out.push(`${srcPtr} = deserializeFloatField<${resolvedType}>(${valuePtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1087
+ out.push(`${srcPtr} = __deserializeFloatField<${resolvedType}>(${valuePtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1087
1088
  }
1088
1089
  else if (resolvedSchema && !resolvedSchema.custom) {
1089
1090
  if (fastPath) {
@@ -1135,6 +1136,10 @@ export class JSONTransform extends Visitor {
1135
1136
  }
1136
1137
  else if (resolvedType.startsWith("Array<")) {
1137
1138
  const valueType = getArrayValueType(resolvedType);
1139
+ const rawInner = resolvedType
1140
+ .slice(resolvedType.indexOf("<") + 1, -1)
1141
+ .trim();
1142
+ const elementNullable = stripNull(rawInner) !== rawInner;
1138
1143
  out.push("{");
1139
1144
  if (member.node.type.isNullable) {
1140
1145
  out.push(` if (load<u64>(${valuePtr}) == 30399761348886638) {`);
@@ -1151,13 +1156,27 @@ export class JSONTransform extends Visitor {
1151
1156
  out.push(" }");
1152
1157
  out.push(" let index = 0;");
1153
1158
  out.push(` ${srcPtr} = ${valuePtr} + 2;`);
1159
+ out.push(` ${srcPtr} = JSON.Util.skipWhitespace(${srcPtr}, srcEnd);`);
1154
1160
  out.push(` if (load<u16>(${srcPtr}) == 0x5d) {`);
1155
1161
  out.push(" value.length = 0;");
1156
1162
  out.push(` ${srcPtr} += 2;`);
1157
1163
  out.push(" } else while (true) {");
1158
- out.push(' if (index >= value.length) value.push("");');
1159
- out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${valueType}>(${srcPtr}, srcEnd, value.dataStart + ((<usize>index) << alignof<${valueType}>()));`);
1164
+ out.push(` ${srcPtr} = JSON.Util.skipWhitespace(${srcPtr}, srcEnd);`);
1165
+ if (elementNullable) {
1166
+ out.push(` if (index >= value.length) value.push(changetype<${valueType} | null>(0));`);
1167
+ out.push(` if (load<u64>(${srcPtr}) == 30399761348886638) {`);
1168
+ out.push(` store<usize>(value.dataStart + ((<usize>index) << alignof<${valueType}>()), 0);`);
1169
+ out.push(` ${srcPtr} += 8;`);
1170
+ out.push(" } else {");
1171
+ out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${valueType}>(${srcPtr}, srcEnd, value.dataStart + ((<usize>index) << alignof<${valueType}>()));`);
1172
+ out.push(" }");
1173
+ }
1174
+ else {
1175
+ out.push(' if (index >= value.length) value.push("");');
1176
+ out.push(` ${srcPtr} = ${STRING_FIELD_DESERIALIZER}<${valueType}>(${srcPtr}, srcEnd, value.dataStart + ((<usize>index) << alignof<${valueType}>()));`);
1177
+ }
1160
1178
  out.push(" index++;");
1179
+ out.push(` ${srcPtr} = JSON.Util.skipWhitespace(${srcPtr}, srcEnd);`);
1161
1180
  out.push(` const code = load<u16>(${srcPtr});`);
1162
1181
  out.push(" if (code == 0x2c) {");
1163
1182
  out.push(` ${srcPtr} += 2;`);
@@ -1186,6 +1205,7 @@ export class JSONTransform extends Visitor {
1186
1205
  out.push(" }");
1187
1206
  out.push(" let index = 0;");
1188
1207
  out.push(` ${srcPtr} = ${valuePtr} + 2;`);
1208
+ out.push(` ${srcPtr} = JSON.Util.skipWhitespace(${srcPtr}, srcEnd);`);
1189
1209
  out.push(` if (load<u16>(${srcPtr}) == 0x5d) {`);
1190
1210
  out.push(" value.length = 0;");
1191
1211
  out.push(` ${srcPtr} += 2;`);
@@ -1204,6 +1224,7 @@ export class JSONTransform extends Visitor {
1204
1224
  out.push(` ${srcPtr} = changetype<nonnull<${valueType}>>(item).__DESERIALIZE_FAST<${valueType}>(${srcPtr}, srcEnd, item);`);
1205
1225
  out.push(` if (!${srcPtr}) break;`);
1206
1226
  out.push(" index++;");
1227
+ out.push(` ${srcPtr} = JSON.Util.skipWhitespace(${srcPtr}, srcEnd);`);
1207
1228
  out.push(` const code = load<u16>(${srcPtr});`);
1208
1229
  out.push(" if (code == 0x2c) {");
1209
1230
  out.push(` ${srcPtr} += 2;`);
@@ -1222,63 +1243,23 @@ export class JSONTransform extends Visitor {
1222
1243
  out.push("}");
1223
1244
  return out;
1224
1245
  }
1225
- out.push(` let value = load<${resolvedType}>(${outPtr}, ${fieldOffset});`);
1226
- out.push(` if (changetype<usize>(value) == 0) {`);
1227
- out.push(` value = changetype<${resolvedType}>(instantiate<nonnull<${resolvedType}>>());`);
1228
- out.push(` store<${resolvedType}>(${outPtr}, value, ${fieldOffset});`);
1229
- out.push(" }");
1230
- out.push(` if (load<u16>(${valuePtr}) == 0x5b && load<u16>(${valuePtr}, 2) == 0x5d) {`);
1231
- out.push(" value.length = 0;");
1232
- out.push(` ${srcPtr} = ${valuePtr} + 4;`);
1233
- out.push(" } else {");
1234
- out.push(` ${srcPtr} = deserializeArrayInto_SWAR<${resolvedType}>(${valuePtr}, srcEnd, value);`);
1235
- out.push(` if (!${srcPtr}) break;`);
1236
- out.push(" }");
1246
+ out.push(` ${srcPtr} = __deserializeArrayField_SWAR<${resolvedType}>(${valuePtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1247
+ out.push(` if (!${srcPtr}) break;`);
1237
1248
  if (member.node.type.isNullable) {
1238
1249
  out.push(" }");
1239
1250
  }
1240
1251
  out.push("}");
1241
1252
  }
1242
1253
  else if (resolvedType.startsWith("Map<")) {
1243
- if (member.node.type.isNullable) {
1244
- out.push(`${srcPtr} = deserializeMapField<${resolvedType}>(${srcPtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1245
- }
1246
- else if (fastPath) {
1247
- out.push("{");
1248
- out.push(` let value = load<${resolvedType}>(${outPtr}, ${fieldOffset});`);
1249
- out.push(" if (changetype<usize>(value) == 0) {");
1250
- out.push(` value = new ${resolvedType}();`);
1251
- out.push(` store<${resolvedType}>(${outPtr}, value, ${fieldOffset});`);
1252
- out.push(" }");
1253
- out.push(` ${srcPtr} = deserializeMapInto<${resolvedType}>(${srcPtr}, srcEnd, value);`);
1254
- out.push("}");
1255
- }
1256
- else {
1257
- out.push(`${srcPtr} = deserializeMapInto<${resolvedType}>(${srcPtr}, srcEnd, load<${resolvedType}>(${outPtr}, ${fieldOffset}));`);
1258
- }
1254
+ out.push(`${srcPtr} = __deserializeMapField<${resolvedType}>(${srcPtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1259
1255
  out.push(`if (!${srcPtr}) break;`);
1260
1256
  }
1261
1257
  else if (resolvedType.startsWith("Set<")) {
1262
- if (member.node.type.isNullable) {
1263
- out.push(`${srcPtr} = deserializeSetField<${resolvedType}>(${srcPtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1264
- }
1265
- else if (fastPath) {
1266
- out.push("{");
1267
- out.push(` let value = load<${resolvedType}>(${outPtr}, ${fieldOffset});`);
1268
- out.push(" if (changetype<usize>(value) == 0) {");
1269
- out.push(` value = new ${resolvedType}();`);
1270
- out.push(` store<${resolvedType}>(${outPtr}, value, ${fieldOffset});`);
1271
- out.push(" }");
1272
- out.push(` ${srcPtr} = deserializeSetInto<${resolvedType}>(${srcPtr}, srcEnd, value);`);
1273
- out.push("}");
1274
- }
1275
- else {
1276
- out.push(`${srcPtr} = deserializeSetInto<${resolvedType}>(${srcPtr}, srcEnd, load<${resolvedType}>(${outPtr}, ${fieldOffset}));`);
1277
- }
1258
+ out.push(`${srcPtr} = __deserializeSetField<${resolvedType}>(${srcPtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1278
1259
  out.push(`if (!${srcPtr}) break;`);
1279
1260
  }
1280
1261
  else if (resolvedType.startsWith("StaticArray<")) {
1281
- out.push(`${srcPtr} = deserializeStaticArrayField<${resolvedType}>(${srcPtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1262
+ out.push(`${srcPtr} = __deserializeStaticArrayField<${resolvedType}>(${srcPtr}, srcEnd, ${outPtr}, ${fieldOffset});`);
1282
1263
  out.push(`if (!${srcPtr}) break;`);
1283
1264
  }
1284
1265
  else if (resolvedType == "JSON.Value" ||
@@ -1337,6 +1318,9 @@ export class JSONTransform extends Visitor {
1337
1318
  indent += " ";
1338
1319
  if (!inlineStringValue)
1339
1320
  DESERIALIZE_FAST += indent + `srcStart += ${firstKeyOffset};\n`;
1321
+ DESERIALIZE_FAST +=
1322
+ indent +
1323
+ `if (JSON.Util.isSpace(load<u16>(${inlineStringValue ? `srcStart + ${firstKeyOffset}` : "srcStart"}))) break;\n`;
1340
1324
  DESERIALIZE_FAST +=
1341
1325
  indent + deserializerFirst.join("\n" + indent) + "\n";
1342
1326
  DESERIALIZE_FAST += indent + "seenAny = true;\n";
@@ -1360,6 +1344,9 @@ export class JSONTransform extends Visitor {
1360
1344
  indent += " ";
1361
1345
  if (!inlineStringValue)
1362
1346
  DESERIALIZE_FAST += indent + `srcStart += ${nextKeyOffset};\n`;
1347
+ DESERIALIZE_FAST +=
1348
+ indent +
1349
+ `if (JSON.Util.isSpace(load<u16>(${inlineStringValue ? `srcStart + ${nextKeyOffset}` : "srcStart"}))) break;\n`;
1363
1350
  DESERIALIZE_FAST +=
1364
1351
  indent + deserializerNext.join("\n" + indent) + "\n";
1365
1352
  indent = indent.slice(0, -2);
@@ -1389,6 +1376,9 @@ export class JSONTransform extends Visitor {
1389
1376
  DESERIALIZE_FAST += indent + "break;\n\n";
1390
1377
  continue;
1391
1378
  }
1379
+ DESERIALIZE_FAST +=
1380
+ indent +
1381
+ `if (JSON.Util.isSpace(load<u16>(${inlineStringValue ? `srcStart + ${keyOffset}` : "srcStart"}))) break;\n`;
1392
1382
  DESERIALIZE_FAST += indent + deserializer.join("\n" + indent) + "\n\n";
1393
1383
  }
1394
1384
  }
@@ -1398,6 +1388,98 @@ export class JSONTransform extends Visitor {
1398
1388
  DESERIALIZE_FAST += indent + "return srcStart;\n";
1399
1389
  indent = indent.slice(0, -2);
1400
1390
  DESERIALIZE_FAST += indent + "} while (false);\n\n";
1391
+ const tier2Desers = this.schema.members.map((member) => getDeserializer(member.type, "srcStart", "dst", member, 0, true));
1392
+ const tier2Ok = tier2Desers.every((d) => d.length && !(d.length === 1 && d[0].trim() === "break;"));
1393
+ if (tier2Ok && !supportsFastOptionalPath) {
1394
+ const i1 = " ";
1395
+ const i2 = " ";
1396
+ const skip = i2 + "srcStart = JSON.Util.skipWhitespace(srcStart, srcEnd);\n";
1397
+ DESERIALIZE_FAST += i1 + "srcStart = start;\n";
1398
+ DESERIALIZE_FAST += i1 + "do {\n";
1399
+ DESERIALIZE_FAST += skip;
1400
+ DESERIALIZE_FAST += i2 + "if (load<u16>(srcStart) != 0x7b) break; // {\n";
1401
+ DESERIALIZE_FAST += i2 + "srcStart += 2;\n";
1402
+ for (let i = 0; i < this.schema.members.length; i++) {
1403
+ const member = this.schema.members[i];
1404
+ const key = JSON.stringify(member.alias || member.name);
1405
+ const keyBytes = key.length << 1;
1406
+ DESERIALIZE_FAST += "\n";
1407
+ DESERIALIZE_FAST += skip;
1408
+ DESERIALIZE_FAST +=
1409
+ i2 +
1410
+ `if ( // ${key}\n${i2} ` +
1411
+ getComparisions(key, "srcStart", "!=").join("\n" + i2 + " || ") +
1412
+ `\n${i2}) break;\n`;
1413
+ DESERIALIZE_FAST += i2 + `srcStart += ${keyBytes};\n`;
1414
+ DESERIALIZE_FAST += skip;
1415
+ DESERIALIZE_FAST +=
1416
+ i2 + "if (load<u16>(srcStart) != 0x3a) break; // :\n";
1417
+ DESERIALIZE_FAST += i2 + "srcStart += 2;\n";
1418
+ DESERIALIZE_FAST += skip;
1419
+ DESERIALIZE_FAST += i2 + tier2Desers[i].join("\n" + i2) + "\n";
1420
+ if (i < this.schema.members.length - 1) {
1421
+ DESERIALIZE_FAST += skip;
1422
+ DESERIALIZE_FAST +=
1423
+ i2 + "if (load<u16>(srcStart) != 0x2c) break; // ,\n";
1424
+ DESERIALIZE_FAST += i2 + "srcStart += 2;\n";
1425
+ }
1426
+ }
1427
+ DESERIALIZE_FAST += "\n";
1428
+ DESERIALIZE_FAST += skip;
1429
+ DESERIALIZE_FAST += i2 + "if (load<u16>(srcStart) != 0x7d) break; // }\n";
1430
+ DESERIALIZE_FAST += i2 + "srcStart += 2;\n";
1431
+ DESERIALIZE_FAST += i2 + "return srcStart;\n";
1432
+ DESERIALIZE_FAST += i1 + "} while (false);\n\n";
1433
+ }
1434
+ else if (tier2Ok && supportsFastOptionalPath) {
1435
+ const multi = this.schema.members.length > 1;
1436
+ const i1 = " ";
1437
+ const i2 = " ";
1438
+ const i3 = " ";
1439
+ DESERIALIZE_FAST += i1 + "srcStart = start;\n";
1440
+ DESERIALIZE_FAST += i1 + "do {\n";
1441
+ DESERIALIZE_FAST +=
1442
+ i2 + "srcStart = JSON.Util.skipWhitespace(srcStart, srcEnd);\n";
1443
+ DESERIALIZE_FAST += i2 + "if (load<u16>(srcStart) != 0x7b) break; // {\n";
1444
+ DESERIALIZE_FAST += i2 + "srcStart += 2;\n";
1445
+ DESERIALIZE_FAST += i2 + "let kp: usize = 0;\n";
1446
+ if (multi)
1447
+ DESERIALIZE_FAST += i2 + "let seenAny = false;\n";
1448
+ for (let i = 0; i < this.schema.members.length; i++) {
1449
+ const member = this.schema.members[i];
1450
+ const key = JSON.stringify(member.alias || member.name);
1451
+ const keyBytes = key.length << 1;
1452
+ DESERIALIZE_FAST += "\n";
1453
+ DESERIALIZE_FAST +=
1454
+ i2 + "kp = JSON.Util.skipWhitespace(srcStart, srcEnd);\n";
1455
+ if (multi && i > 0) {
1456
+ DESERIALIZE_FAST +=
1457
+ i2 +
1458
+ "if (seenAny && load<u16>(kp) == 0x2c) kp = JSON.Util.skipWhitespace(kp + 2, srcEnd);\n";
1459
+ }
1460
+ DESERIALIZE_FAST +=
1461
+ i2 +
1462
+ `if ( // ${key}\n${i2} ` +
1463
+ getComparisions(key, "kp", "==").join("\n" + i2 + " && ") +
1464
+ `\n${i2}) {\n`;
1465
+ DESERIALIZE_FAST += i3 + `kp += ${keyBytes};\n`;
1466
+ DESERIALIZE_FAST += i3 + "kp = JSON.Util.skipWhitespace(kp, srcEnd);\n";
1467
+ DESERIALIZE_FAST += i3 + "if (load<u16>(kp) != 0x3a) break; // :\n";
1468
+ DESERIALIZE_FAST +=
1469
+ i3 + "srcStart = JSON.Util.skipWhitespace(kp + 2, srcEnd);\n";
1470
+ DESERIALIZE_FAST += i3 + tier2Desers[i].join("\n" + i3) + "\n";
1471
+ if (multi)
1472
+ DESERIALIZE_FAST += i3 + "seenAny = true;\n";
1473
+ DESERIALIZE_FAST += i2 + "}\n";
1474
+ }
1475
+ DESERIALIZE_FAST += "\n";
1476
+ DESERIALIZE_FAST +=
1477
+ i2 + "srcStart = JSON.Util.skipWhitespace(srcStart, srcEnd);\n";
1478
+ DESERIALIZE_FAST += i2 + "if (load<u16>(srcStart) != 0x7d) break; // }\n";
1479
+ DESERIALIZE_FAST += i2 + "srcStart += 2;\n";
1480
+ DESERIALIZE_FAST += i2 + "return srcStart;\n";
1481
+ DESERIALIZE_FAST += i1 + "} while (false);\n\n";
1482
+ }
1401
1483
  if (THROW_FAST_PATH) {
1402
1484
  DESERIALIZE_FAST +=
1403
1485
  indent + "const failAt = srcStart ? srcStart : start;\n";
@@ -1462,6 +1544,10 @@ export class JSONTransform extends Visitor {
1462
1544
  DESERIALIZE += indent + " lastIndex = srcStart + 2;\n";
1463
1545
  DESERIALIZE += indent + " }\n";
1464
1546
  DESERIALIZE += indent + " }\n";
1547
+ if (STRICT)
1548
+ DESERIALIZE +=
1549
+ indent +
1550
+ ' else if (!isKey && code != 44 && code != 125) throw new Error("Expected \'\\"\' to start key in JSON object at position " + (srcEnd - srcStart).toString());\n';
1465
1551
  DESERIALIZE += indent + " srcStart += 2;\n";
1466
1552
  DESERIALIZE += indent + " } else {\n";
1467
1553
  const groupMembers = (members) => {
@@ -2294,48 +2380,11 @@ export class JSONTransform extends Visitor {
2294
2380
  const bsImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "bs" || d.name.text == "bs"));
2295
2381
  const jsonImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "JSON" || d.name.text == "JSON"));
2296
2382
  const atoiImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "atoi" || d.name.text == "atoi"));
2297
- const deserializeIntegerFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeIntegerField" ||
2298
- d.name.text == "deserializeIntegerField"));
2299
- const deserializeUnsignedFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeUnsignedField" ||
2300
- d.name.text == "deserializeUnsignedField"));
2301
- const deserializeFloatFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeFloatField" ||
2302
- d.name.text == "deserializeFloatField"));
2303
2383
  const scanValueEndImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "scanValueEnd" || d.name.text == "scanValueEnd"));
2304
- const deserializeArrayField_SWARImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeArrayField_SWAR" ||
2305
- d.name.text == "deserializeArrayField_SWAR"));
2306
- const deserializeArrayInto_SWARImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeArrayInto_SWAR" ||
2307
- d.name.text == "deserializeArrayInto_SWAR"));
2308
- const deserializeMapFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeMapField" ||
2309
- d.name.text == "deserializeMapField"));
2310
- const deserializeMapIntoImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeMapInto" ||
2311
- d.name.text == "deserializeMapInto"));
2312
- const deserializeSetFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeSetField" ||
2313
- d.name.text == "deserializeSetField"));
2314
- const deserializeSetIntoImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeSetInto" ||
2315
- d.name.text == "deserializeSetInto"));
2316
- const deserializeStaticArrayFieldImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeStaticArrayField" ||
2317
- d.name.text == "deserializeStaticArrayField"));
2318
- const deserializeStringFieldSWARImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeStringField_SWAR" ||
2319
- d.name.text == "deserializeStringField_SWAR"));
2320
- const deserializeStringFieldSIMDImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "deserializeStringField_SIMD" ||
2321
- d.name.text == "deserializeStringField_SIMD"));
2322
- const sourceText = readFileSync(fromPath).toString();
2323
- const hasLocalDeserializeIntegerField = /\bdeserializeIntegerField\b/.test(sourceText);
2324
- const hasLocalDeserializeUnsignedField = /\bdeserializeUnsignedField\b/.test(sourceText);
2325
- const hasLocalDeserializeFloatField = /\bdeserializeFloatField\b/.test(sourceText);
2384
+ const fieldHelpersImport = this.imports.find((i) => i.declarations?.find((d) => d.name.text == "__deserializeStringField"));
2385
+ const sourceText = node.text;
2326
2386
  const hasLocalScanValueEnd = /\bscanValueEnd\b/.test(sourceText);
2327
- const hasLocaldeserializeArrayField_SWAR = /\bdeserializeArrayField_SWAR\b/.test(sourceText);
2328
- const hasLocaldeserializeArrayInto_SWAR = /\bdeserializeArrayInto_SWAR\b/.test(sourceText);
2329
- const hasLocaldeserializeMapField = /\bdeserializeMapField\b/.test(sourceText);
2330
- const hasLocaldeserializeMapInto = /\bdeserializeMapInto\b/.test(sourceText);
2331
- const hasLocaldeserializeSetField = /\bdeserializeSetField\b/.test(sourceText);
2332
- const hasLocaldeserializeSetInto = /\bdeserializeSetInto\b/.test(sourceText);
2333
- const hasLocaldeserializeStaticArrayField = /\bdeserializeStaticArrayField\b/.test(sourceText);
2334
- const hasLocalDeserializeStringFieldSWAR = /\bdeserializeStringField_SWAR\b/.test(sourceText);
2335
- const hasLocalDeserializeStringFieldSIMD = /\bdeserializeStringField_SIMD\b/.test(sourceText);
2336
- const baseRel = normalizeJsonAsBaseRel(path.posix.join(...path
2337
- .relative(path.dirname(fromPath), path.join(baseDir))
2338
- .split(path.sep)));
2387
+ const baseRel = computeImportBaseRel(path.dirname(fromPath), path.join(baseDir));
2339
2388
  if (!bsImport) {
2340
2389
  const replaceNode = Node.createImportStatement([
2341
2390
  Node.createImportDeclaration(Node.createIdentifierExpression("bs", node.range, false), null, node.range),
@@ -2372,42 +2421,6 @@ export class JSONTransform extends Visitor {
2372
2421
  node.range.source.normalizedPath +
2373
2422
  "\n");
2374
2423
  }
2375
- if (!deserializeIntegerFieldImport && !hasLocalDeserializeIntegerField) {
2376
- const replaceNode = Node.createImportStatement([
2377
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeIntegerField", node.range, false), null, node.range),
2378
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "index", "integer"), node.range), node.range);
2379
- node.range.source.statements.unshift(replaceNode);
2380
- if (DEBUG > 0)
2381
- console.log("Added import: " +
2382
- toString(replaceNode) +
2383
- " to " +
2384
- node.range.source.normalizedPath +
2385
- "\n");
2386
- }
2387
- if (!deserializeUnsignedFieldImport && !hasLocalDeserializeUnsignedField) {
2388
- const replaceNode = Node.createImportStatement([
2389
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeUnsignedField", node.range, false), null, node.range),
2390
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "index", "unsigned"), node.range), node.range);
2391
- node.range.source.statements.unshift(replaceNode);
2392
- if (DEBUG > 0)
2393
- console.log("Added import: " +
2394
- toString(replaceNode) +
2395
- " to " +
2396
- node.range.source.normalizedPath +
2397
- "\n");
2398
- }
2399
- if (!deserializeFloatFieldImport && !hasLocalDeserializeFloatField) {
2400
- const replaceNode = Node.createImportStatement([
2401
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeFloatField", node.range, false), null, node.range),
2402
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "float"), node.range), node.range);
2403
- node.range.source.statements.unshift(replaceNode);
2404
- if (DEBUG > 0)
2405
- console.log("Added import: " +
2406
- toString(replaceNode) +
2407
- " to " +
2408
- node.range.source.normalizedPath +
2409
- "\n");
2410
- }
2411
2424
  if (!scanValueEndImport && !hasLocalScanValueEnd) {
2412
2425
  const replaceNode = Node.createImportStatement([
2413
2426
  Node.createImportDeclaration(Node.createIdentifierExpression("scanValueEnd", node.range, false), null, node.range),
@@ -2420,114 +2433,18 @@ export class JSONTransform extends Visitor {
2420
2433
  node.range.source.normalizedPath +
2421
2434
  "\n");
2422
2435
  }
2423
- if (!deserializeArrayField_SWARImport &&
2424
- !hasLocaldeserializeArrayField_SWAR) {
2425
- const replaceNode = Node.createImportStatement([
2426
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeArrayField_SWAR", node.range, false), null, node.range),
2427
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "array"), node.range), node.range);
2428
- node.range.source.statements.unshift(replaceNode);
2429
- if (DEBUG > 0)
2430
- console.log("Added import: " +
2431
- toString(replaceNode) +
2432
- " to " +
2433
- node.range.source.normalizedPath +
2434
- "\n");
2435
- }
2436
- if (!deserializeArrayInto_SWARImport &&
2437
- !hasLocaldeserializeArrayInto_SWAR) {
2438
- const replaceNode = Node.createImportStatement([
2439
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeArrayInto_SWAR", node.range, false), null, node.range),
2440
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "swar", "array"), node.range), node.range);
2441
- node.range.source.statements.unshift(replaceNode);
2442
- if (DEBUG > 0)
2443
- console.log("Added import: " +
2444
- toString(replaceNode) +
2445
- " to " +
2446
- node.range.source.normalizedPath +
2447
- "\n");
2448
- }
2449
- if (!deserializeMapFieldImport && !hasLocaldeserializeMapField) {
2450
- const replaceNode = Node.createImportStatement([
2451
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeMapField", node.range, false), null, node.range),
2452
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "map"), node.range), node.range);
2453
- node.range.source.statements.unshift(replaceNode);
2454
- if (DEBUG > 0)
2455
- console.log("Added import: " +
2456
- toString(replaceNode) +
2457
- " to " +
2458
- node.range.source.normalizedPath +
2459
- "\n");
2460
- }
2461
- if (!deserializeMapIntoImport && !hasLocaldeserializeMapInto) {
2462
- const replaceNode = Node.createImportStatement([
2463
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeMapInto", node.range, false), null, node.range),
2464
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "map"), node.range), node.range);
2465
- node.range.source.statements.unshift(replaceNode);
2466
- if (DEBUG > 0)
2467
- console.log("Added import: " +
2468
- toString(replaceNode) +
2469
- " to " +
2470
- node.range.source.normalizedPath +
2471
- "\n");
2472
- }
2473
- if (!deserializeSetFieldImport && !hasLocaldeserializeSetField) {
2474
- const replaceNode = Node.createImportStatement([
2475
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeSetField", node.range, false), null, node.range),
2476
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "set"), node.range), node.range);
2477
- node.range.source.statements.unshift(replaceNode);
2478
- if (DEBUG > 0)
2479
- console.log("Added import: " +
2480
- toString(replaceNode) +
2481
- " to " +
2482
- node.range.source.normalizedPath +
2483
- "\n");
2484
- }
2485
- if (!deserializeSetIntoImport && !hasLocaldeserializeSetInto) {
2486
- const replaceNode = Node.createImportStatement([
2487
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeSetInto", node.range, false), null, node.range),
2488
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "set"), node.range), node.range);
2489
- node.range.source.statements.unshift(replaceNode);
2490
- if (DEBUG > 0)
2491
- console.log("Added import: " +
2492
- toString(replaceNode) +
2493
- " to " +
2494
- node.range.source.normalizedPath +
2495
- "\n");
2496
- }
2497
- if (!deserializeStaticArrayFieldImport &&
2498
- !hasLocaldeserializeStaticArrayField) {
2499
- const replaceNode = Node.createImportStatement([
2500
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeStaticArrayField", node.range, false), null, node.range),
2501
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simple", "staticarray"), node.range), node.range);
2502
- node.range.source.statements.unshift(replaceNode);
2503
- if (DEBUG > 0)
2504
- console.log("Added import: " +
2505
- toString(replaceNode) +
2506
- " to " +
2507
- node.range.source.normalizedPath +
2508
- "\n");
2509
- }
2510
- const codegenMode = getCodegenMode(this.program);
2511
- if (codegenMode !== JSONMode.SIMD &&
2512
- !deserializeStringFieldSWARImport &&
2513
- !hasLocalDeserializeStringFieldSWAR) {
2514
- const replaceNode = Node.createImportStatement([
2515
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeStringField_SWAR", node.range, false), null, node.range),
2516
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "swar", "string"), node.range), node.range);
2517
- node.range.source.statements.unshift(replaceNode);
2518
- if (DEBUG > 0)
2519
- console.log("Added import: " +
2520
- toString(replaceNode) +
2521
- " to " +
2522
- node.range.source.normalizedPath +
2523
- "\n");
2524
- }
2525
- if (codegenMode === JSONMode.SIMD &&
2526
- !deserializeStringFieldSIMDImport &&
2527
- !hasLocalDeserializeStringFieldSIMD) {
2436
+ if (!fieldHelpersImport) {
2437
+ const fieldHelper = (real, alias) => Node.createImportDeclaration(Node.createIdentifierExpression(real, node.range, false), Node.createIdentifierExpression(alias, node.range, false), node.range);
2528
2438
  const replaceNode = Node.createImportStatement([
2529
- Node.createImportDeclaration(Node.createIdentifierExpression("deserializeStringField_SIMD", node.range, false), null, node.range),
2530
- ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize", "simd", "string"), node.range), node.range);
2439
+ fieldHelper("deserializeIntegerField", "__deserializeIntegerField"),
2440
+ fieldHelper("deserializeUnsignedField", "__deserializeUnsignedField"),
2441
+ fieldHelper("deserializeFloatField", "__deserializeFloatField"),
2442
+ fieldHelper("deserializeStringField", "__deserializeStringField"),
2443
+ fieldHelper("deserializeArrayField_SWAR", "__deserializeArrayField_SWAR"),
2444
+ fieldHelper("deserializeMapField", "__deserializeMapField"),
2445
+ fieldHelper("deserializeSetField", "__deserializeSetField"),
2446
+ fieldHelper("deserializeStaticArrayField", "__deserializeStaticArrayField"),
2447
+ ], Node.createStringLiteralExpression(path.posix.join(baseRel, "assembly", "deserialize"), node.range), node.range);
2531
2448
  node.range.source.statements.unshift(replaceNode);
2532
2449
  if (DEBUG > 0)
2533
2450
  console.log("Added import: " +