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.
Files changed (321) hide show
  1. package/.as-test/coverage/naive/coverage.arbitrary.spec.ts.log.json +5628 -0
  2. package/.as-test/coverage/naive/coverage.array.spec.ts.log.json +5187 -0
  3. package/.as-test/coverage/naive/coverage.bool.spec.ts.log.json +5187 -0
  4. package/.as-test/coverage/naive/coverage.box.spec.ts.log.json +5187 -0
  5. package/.as-test/coverage/naive/coverage.custom.spec.ts.log.json +5187 -0
  6. package/.as-test/coverage/naive/coverage.date.spec.ts.log.json +5187 -0
  7. package/.as-test/coverage/naive/coverage.enum.spec.ts.log.json +5187 -0
  8. package/.as-test/coverage/naive/coverage.float.spec.ts.log.json +5187 -0
  9. package/.as-test/coverage/naive/coverage.generics.spec.ts.log.json +5187 -0
  10. package/.as-test/coverage/naive/coverage.hierarchy.spec.ts.log.json +5187 -0
  11. package/.as-test/coverage/naive/coverage.integer.spec.ts.log.json +5187 -0
  12. package/.as-test/coverage/naive/coverage.map.spec.ts.log.json +5187 -0
  13. package/.as-test/coverage/naive/coverage.namespace.spec.ts.log.json +5187 -0
  14. package/.as-test/coverage/naive/coverage.null.spec.ts.log.json +5187 -0
  15. package/.as-test/coverage/naive/coverage.raw.spec.ts.log.json +5187 -0
  16. package/.as-test/coverage/naive/coverage.resolving.spec.ts.log.json +5628 -0
  17. package/.as-test/coverage/naive/coverage.set.spec.ts.log.json +5187 -0
  18. package/.as-test/coverage/naive/coverage.staticarray.spec.ts.log.json +5187 -0
  19. package/.as-test/coverage/naive/coverage.string.spec.ts.log.json +5187 -0
  20. package/.as-test/coverage/naive/coverage.struct.spec.ts.log.json +5187 -0
  21. package/.as-test/coverage/naive/coverage.types.spec.ts.log.json +5187 -0
  22. package/.as-test/coverage/simd/coverage.arbitrary.spec.ts.log.json +5628 -0
  23. package/.as-test/coverage/simd/coverage.array.spec.ts.log.json +5187 -0
  24. package/.as-test/coverage/simd/coverage.bool.spec.ts.log.json +5187 -0
  25. package/.as-test/coverage/simd/coverage.box.spec.ts.log.json +5187 -0
  26. package/.as-test/coverage/simd/coverage.custom.spec.ts.log.json +5187 -0
  27. package/.as-test/coverage/simd/coverage.date.spec.ts.log.json +5187 -0
  28. package/.as-test/coverage/simd/coverage.enum.spec.ts.log.json +5187 -0
  29. package/.as-test/coverage/simd/coverage.float.spec.ts.log.json +5187 -0
  30. package/.as-test/coverage/simd/coverage.generics.spec.ts.log.json +5187 -0
  31. package/.as-test/coverage/simd/coverage.hierarchy.spec.ts.log.json +5187 -0
  32. package/.as-test/coverage/simd/coverage.integer.spec.ts.log.json +5187 -0
  33. package/.as-test/coverage/simd/coverage.map.spec.ts.log.json +5187 -0
  34. package/.as-test/coverage/simd/coverage.namespace.spec.ts.log.json +5187 -0
  35. package/.as-test/coverage/simd/coverage.null.spec.ts.log.json +5187 -0
  36. package/.as-test/coverage/simd/coverage.raw.spec.ts.log.json +5187 -0
  37. package/.as-test/coverage/simd/coverage.resolving.spec.ts.log.json +5628 -0
  38. package/.as-test/coverage/simd/coverage.set.spec.ts.log.json +5187 -0
  39. package/.as-test/coverage/simd/coverage.staticarray.spec.ts.log.json +5187 -0
  40. package/.as-test/coverage/simd/coverage.string.spec.ts.log.json +5187 -0
  41. package/.as-test/coverage/simd/coverage.struct.spec.ts.log.json +5187 -0
  42. package/.as-test/coverage/simd/coverage.types.spec.ts.log.json +5187 -0
  43. package/.as-test/coverage/swar/coverage.arbitrary.spec.ts.log.json +5628 -0
  44. package/.as-test/coverage/swar/coverage.array.spec.ts.log.json +5187 -0
  45. package/.as-test/coverage/swar/coverage.bool.spec.ts.log.json +5187 -0
  46. package/.as-test/coverage/swar/coverage.box.spec.ts.log.json +5187 -0
  47. package/.as-test/coverage/swar/coverage.custom.spec.ts.log.json +5187 -0
  48. package/.as-test/coverage/swar/coverage.date.spec.ts.log.json +5187 -0
  49. package/.as-test/coverage/swar/coverage.enum.spec.ts.log.json +5187 -0
  50. package/.as-test/coverage/swar/coverage.float.spec.ts.log.json +5187 -0
  51. package/.as-test/coverage/swar/coverage.generics.spec.ts.log.json +5187 -0
  52. package/.as-test/coverage/swar/coverage.hierarchy.spec.ts.log.json +5187 -0
  53. package/.as-test/coverage/swar/coverage.integer.spec.ts.log.json +5187 -0
  54. package/.as-test/coverage/swar/coverage.map.spec.ts.log.json +5187 -0
  55. package/.as-test/coverage/swar/coverage.namespace.spec.ts.log.json +5187 -0
  56. package/.as-test/coverage/swar/coverage.null.spec.ts.log.json +5187 -0
  57. package/.as-test/coverage/swar/coverage.raw.spec.ts.log.json +5187 -0
  58. package/.as-test/coverage/swar/coverage.resolving.spec.ts.log.json +5628 -0
  59. package/.as-test/coverage/swar/coverage.set.spec.ts.log.json +5187 -0
  60. package/.as-test/coverage/swar/coverage.staticarray.spec.ts.log.json +5187 -0
  61. package/.as-test/coverage/swar/coverage.string.spec.ts.log.json +5187 -0
  62. package/.as-test/coverage/swar/coverage.struct.spec.ts.log.json +5187 -0
  63. package/.as-test/coverage/swar/coverage.types.spec.ts.log.json +5187 -0
  64. package/.as-test/logs/naive/run.arbitrary.spec.ts.log.json +943 -0
  65. package/.as-test/logs/naive/run.array.spec.ts.log.json +1053 -0
  66. package/.as-test/logs/naive/run.bool.spec.ts.log.json +257 -0
  67. package/.as-test/logs/naive/run.box.spec.ts.log.json +353 -0
  68. package/.as-test/logs/naive/run.custom.spec.ts.log.json +309 -0
  69. package/.as-test/logs/naive/run.date.spec.ts.log.json +397 -0
  70. package/.as-test/logs/naive/run.enum.spec.ts.log.json +343 -0
  71. package/.as-test/logs/naive/run.float.spec.ts.log.json +453 -0
  72. package/.as-test/logs/naive/run.generics.spec.ts.log.json +393 -0
  73. package/.as-test/logs/naive/run.hierarchy.spec.ts.log.json +325 -0
  74. package/.as-test/logs/naive/run.integer.spec.ts.log.json +373 -0
  75. package/.as-test/logs/naive/run.map.spec.ts.log.json +247 -0
  76. package/.as-test/logs/naive/run.namespace.spec.ts.log.json +361 -0
  77. package/.as-test/logs/naive/run.null.spec.ts.log.json +273 -0
  78. package/.as-test/logs/naive/run.raw.spec.ts.log.json +309 -0
  79. package/.as-test/logs/naive/run.resolving.spec.ts.log.json +273 -0
  80. package/.as-test/logs/naive/run.set.spec.ts.log.json +733 -0
  81. package/.as-test/logs/naive/run.staticarray.spec.ts.log.json +931 -0
  82. package/.as-test/logs/naive/run.string.spec.ts.log.json +2289 -0
  83. package/.as-test/logs/naive/run.struct.spec.ts.log.json +523 -0
  84. package/.as-test/logs/naive/run.types.spec.ts.log.json +273 -0
  85. package/.as-test/logs/naive/test.arbitrary.spec.ts.log.json +943 -0
  86. package/.as-test/logs/naive/test.array.spec.ts.log.json +1053 -0
  87. package/.as-test/logs/naive/test.bool.spec.ts.log.json +257 -0
  88. package/.as-test/logs/naive/test.box.spec.ts.log.json +353 -0
  89. package/.as-test/logs/naive/test.custom.spec.ts.log.json +309 -0
  90. package/.as-test/logs/naive/test.date.spec.ts.log.json +397 -0
  91. package/.as-test/logs/naive/test.enum.spec.ts.log.json +343 -0
  92. package/.as-test/logs/naive/test.float.spec.ts.log.json +453 -0
  93. package/.as-test/logs/naive/test.generics.spec.ts.log.json +393 -0
  94. package/.as-test/logs/naive/test.hierarchy.spec.ts.log.json +325 -0
  95. package/.as-test/logs/naive/test.integer.spec.ts.log.json +373 -0
  96. package/.as-test/logs/naive/test.log.json +2289 -0
  97. package/.as-test/logs/naive/test.map.spec.ts.log.json +247 -0
  98. package/.as-test/logs/naive/test.namespace.spec.ts.log.json +361 -0
  99. package/.as-test/logs/naive/test.null.spec.ts.log.json +273 -0
  100. package/.as-test/logs/naive/test.raw.spec.ts.log.json +309 -0
  101. package/.as-test/logs/naive/test.resolving.spec.ts.log.json +273 -0
  102. package/.as-test/logs/naive/test.set.spec.ts.log.json +733 -0
  103. package/.as-test/logs/naive/test.staticarray.spec.ts.log.json +931 -0
  104. package/.as-test/logs/naive/test.string.spec.ts.log.json +2345 -0
  105. package/.as-test/logs/naive/test.struct.spec.ts.log.json +523 -0
  106. package/.as-test/logs/naive/test.types.spec.ts.log.json +273 -0
  107. package/.as-test/logs/simd/run.arbitrary.spec.ts.log.json +943 -0
  108. package/.as-test/logs/simd/run.array.spec.ts.log.json +1053 -0
  109. package/.as-test/logs/simd/run.bool.spec.ts.log.json +257 -0
  110. package/.as-test/logs/simd/run.box.spec.ts.log.json +353 -0
  111. package/.as-test/logs/simd/run.custom.spec.ts.log.json +309 -0
  112. package/.as-test/logs/simd/run.date.spec.ts.log.json +397 -0
  113. package/.as-test/logs/simd/run.enum.spec.ts.log.json +343 -0
  114. package/.as-test/logs/simd/run.float.spec.ts.log.json +453 -0
  115. package/.as-test/logs/simd/run.generics.spec.ts.log.json +393 -0
  116. package/.as-test/logs/simd/run.hierarchy.spec.ts.log.json +325 -0
  117. package/.as-test/logs/simd/run.integer.spec.ts.log.json +373 -0
  118. package/.as-test/logs/simd/run.map.spec.ts.log.json +247 -0
  119. package/.as-test/logs/simd/run.namespace.spec.ts.log.json +361 -0
  120. package/.as-test/logs/simd/run.null.spec.ts.log.json +273 -0
  121. package/.as-test/logs/simd/run.raw.spec.ts.log.json +309 -0
  122. package/.as-test/logs/simd/run.resolving.spec.ts.log.json +273 -0
  123. package/.as-test/logs/simd/run.set.spec.ts.log.json +733 -0
  124. package/.as-test/logs/simd/run.staticarray.spec.ts.log.json +931 -0
  125. package/.as-test/logs/simd/run.string.spec.ts.log.json +2289 -0
  126. package/.as-test/logs/simd/run.struct.spec.ts.log.json +523 -0
  127. package/.as-test/logs/simd/run.types.spec.ts.log.json +273 -0
  128. package/.as-test/logs/simd/test.arbitrary.spec.ts.log.json +943 -0
  129. package/.as-test/logs/simd/test.array.spec.ts.log.json +1053 -0
  130. package/.as-test/logs/simd/test.bool.spec.ts.log.json +257 -0
  131. package/.as-test/logs/simd/test.box.spec.ts.log.json +353 -0
  132. package/.as-test/logs/simd/test.custom.spec.ts.log.json +309 -0
  133. package/.as-test/logs/simd/test.date.spec.ts.log.json +397 -0
  134. package/.as-test/logs/simd/test.enum.spec.ts.log.json +343 -0
  135. package/.as-test/logs/simd/test.float.spec.ts.log.json +453 -0
  136. package/.as-test/logs/simd/test.generics.spec.ts.log.json +393 -0
  137. package/.as-test/logs/simd/test.hierarchy.spec.ts.log.json +325 -0
  138. package/.as-test/logs/simd/test.integer.spec.ts.log.json +373 -0
  139. package/.as-test/logs/simd/test.log.json +11371 -0
  140. package/.as-test/logs/simd/test.map.spec.ts.log.json +247 -0
  141. package/.as-test/logs/simd/test.namespace.spec.ts.log.json +361 -0
  142. package/.as-test/logs/simd/test.null.spec.ts.log.json +273 -0
  143. package/.as-test/logs/simd/test.raw.spec.ts.log.json +309 -0
  144. package/.as-test/logs/simd/test.resolving.spec.ts.log.json +273 -0
  145. package/.as-test/logs/simd/test.set.spec.ts.log.json +733 -0
  146. package/.as-test/logs/simd/test.staticarray.spec.ts.log.json +931 -0
  147. package/.as-test/logs/simd/test.string.spec.ts.log.json +2345 -0
  148. package/.as-test/logs/simd/test.struct.spec.ts.log.json +523 -0
  149. package/.as-test/logs/simd/test.types.spec.ts.log.json +273 -0
  150. package/.as-test/logs/swar/run.arbitrary.spec.ts.log.json +943 -0
  151. package/.as-test/logs/swar/run.array.spec.ts.log.json +1053 -0
  152. package/.as-test/logs/swar/run.bool.spec.ts.log.json +257 -0
  153. package/.as-test/logs/swar/run.box.spec.ts.log.json +353 -0
  154. package/.as-test/logs/swar/run.custom.spec.ts.log.json +309 -0
  155. package/.as-test/logs/swar/run.date.spec.ts.log.json +397 -0
  156. package/.as-test/logs/swar/run.enum.spec.ts.log.json +343 -0
  157. package/.as-test/logs/swar/run.float.spec.ts.log.json +453 -0
  158. package/.as-test/logs/swar/run.generics.spec.ts.log.json +393 -0
  159. package/.as-test/logs/swar/run.hierarchy.spec.ts.log.json +325 -0
  160. package/.as-test/logs/swar/run.integer.spec.ts.log.json +373 -0
  161. package/.as-test/logs/swar/run.map.spec.ts.log.json +247 -0
  162. package/.as-test/logs/swar/run.namespace.spec.ts.log.json +361 -0
  163. package/.as-test/logs/swar/run.null.spec.ts.log.json +273 -0
  164. package/.as-test/logs/swar/run.raw.spec.ts.log.json +309 -0
  165. package/.as-test/logs/swar/run.resolving.spec.ts.log.json +273 -0
  166. package/.as-test/logs/swar/run.set.spec.ts.log.json +733 -0
  167. package/.as-test/logs/swar/run.staticarray.spec.ts.log.json +931 -0
  168. package/.as-test/logs/swar/run.string.spec.ts.log.json +2289 -0
  169. package/.as-test/logs/swar/run.struct.spec.ts.log.json +523 -0
  170. package/.as-test/logs/swar/run.types.spec.ts.log.json +273 -0
  171. package/.as-test/logs/swar/test.arbitrary.spec.ts.log.json +943 -0
  172. package/.as-test/logs/swar/test.array.spec.ts.log.json +1053 -0
  173. package/.as-test/logs/swar/test.bool.spec.ts.log.json +257 -0
  174. package/.as-test/logs/swar/test.box.spec.ts.log.json +353 -0
  175. package/.as-test/logs/swar/test.custom.spec.ts.log.json +309 -0
  176. package/.as-test/logs/swar/test.date.spec.ts.log.json +397 -0
  177. package/.as-test/logs/swar/test.enum.spec.ts.log.json +343 -0
  178. package/.as-test/logs/swar/test.float.spec.ts.log.json +453 -0
  179. package/.as-test/logs/swar/test.generics.spec.ts.log.json +393 -0
  180. package/.as-test/logs/swar/test.hierarchy.spec.ts.log.json +325 -0
  181. package/.as-test/logs/swar/test.integer.spec.ts.log.json +373 -0
  182. package/.as-test/logs/swar/test.log.json +11371 -0
  183. package/.as-test/logs/swar/test.map.spec.ts.log.json +247 -0
  184. package/.as-test/logs/swar/test.namespace.spec.ts.log.json +361 -0
  185. package/.as-test/logs/swar/test.null.spec.ts.log.json +273 -0
  186. package/.as-test/logs/swar/test.raw.spec.ts.log.json +309 -0
  187. package/.as-test/logs/swar/test.resolving.spec.ts.log.json +273 -0
  188. package/.as-test/logs/swar/test.set.spec.ts.log.json +733 -0
  189. package/.as-test/logs/swar/test.staticarray.spec.ts.log.json +931 -0
  190. package/.as-test/logs/swar/test.string.spec.ts.log.json +2345 -0
  191. package/.as-test/logs/swar/test.struct.spec.ts.log.json +523 -0
  192. package/.as-test/logs/swar/test.types.spec.ts.log.json +273 -0
  193. package/.as-test/logs/test.arbitrary.spec.ts.log.json +943 -0
  194. package/.as-test/logs/test.array.spec.ts.log.json +1053 -0
  195. package/.as-test/logs/test.bool.spec.ts.log.json +257 -0
  196. package/.as-test/logs/test.box.spec.ts.log.json +353 -0
  197. package/.as-test/logs/test.custom.spec.ts.log.json +309 -0
  198. package/.as-test/logs/test.date.spec.ts.log.json +397 -0
  199. package/.as-test/logs/test.enum.spec.ts.log.json +343 -0
  200. package/.as-test/logs/test.float.spec.ts.log.json +453 -0
  201. package/.as-test/logs/test.generics.spec.ts.log.json +393 -0
  202. package/.as-test/logs/test.hierarchy.spec.ts.log.json +325 -0
  203. package/.as-test/logs/test.integer.spec.ts.log.json +373 -0
  204. package/.as-test/logs/test.log.json +11371 -0
  205. package/.as-test/logs/test.map.spec.ts.log.json +247 -0
  206. package/.as-test/logs/test.namespace.spec.ts.log.json +361 -0
  207. package/.as-test/logs/test.null.spec.ts.log.json +273 -0
  208. package/.as-test/logs/test.raw.spec.ts.log.json +309 -0
  209. package/.as-test/logs/test.resolving.spec.ts.log.json +273 -0
  210. package/.as-test/logs/test.set.spec.ts.log.json +733 -0
  211. package/.as-test/logs/test.staticarray.spec.ts.log.json +931 -0
  212. package/.as-test/logs/test.string.spec.ts.log.json +2289 -0
  213. package/.as-test/logs/test.struct.spec.ts.log.json +523 -0
  214. package/.as-test/logs/test.types.spec.ts.log.json +273 -0
  215. package/.as-test/runners/default.bindings.js +68 -0
  216. package/.as-test/runners/default.wasi.js +38 -0
  217. package/ARCHITECTURE.md +6 -3
  218. package/CONTRIBUTING.md +9 -3
  219. package/README.md +40 -21
  220. package/as-test.config.json +40 -0
  221. package/assembly/deserialize/float.ts +181 -0
  222. package/assembly/deserialize/helpers/uint.ts +12 -0
  223. package/assembly/deserialize/index/arbitrary.ts +25 -0
  224. package/assembly/deserialize/index/array.ts +61 -0
  225. package/assembly/deserialize/index/bool.ts +1 -0
  226. package/assembly/deserialize/index/date.ts +1 -0
  227. package/assembly/deserialize/index/float.ts +1 -0
  228. package/assembly/deserialize/index/integer.ts +1 -0
  229. package/assembly/deserialize/index/map.ts +1 -0
  230. package/assembly/deserialize/index/object.ts +1 -0
  231. package/assembly/deserialize/index/raw.ts +1 -0
  232. package/assembly/deserialize/index/set.ts +1 -0
  233. package/assembly/deserialize/index/staticarray.ts +1 -0
  234. package/assembly/deserialize/index/string.ts +15 -0
  235. package/assembly/deserialize/index/struct.ts +1 -0
  236. package/assembly/deserialize/index/typedarray.ts +1 -0
  237. package/assembly/deserialize/index/unsigned.ts +1 -0
  238. package/assembly/deserialize/index.ts +14 -0
  239. package/assembly/deserialize/integer.ts +42 -0
  240. package/assembly/deserialize/simd/array/integer.ts +307 -0
  241. package/assembly/deserialize/simd/string.ts +131 -10
  242. package/assembly/deserialize/simple/arbitrary.ts +2 -2
  243. package/assembly/deserialize/simple/array/arbitrary.ts +13 -20
  244. package/assembly/deserialize/simple/array/raw.ts +14 -21
  245. package/assembly/deserialize/simple/array/string.ts +3 -2
  246. package/assembly/deserialize/simple/array.ts +1 -0
  247. package/assembly/deserialize/simple/map.ts +14 -19
  248. package/assembly/deserialize/simple/object.ts +14 -19
  249. package/assembly/deserialize/simple/set.ts +9 -9
  250. package/assembly/deserialize/simple/staticarray/array.ts +12 -3
  251. package/assembly/deserialize/simple/staticarray/bool.ts +6 -2
  252. package/assembly/deserialize/simple/staticarray/float.ts +12 -3
  253. package/assembly/deserialize/simple/staticarray/integer.ts +6 -2
  254. package/assembly/deserialize/simple/staticarray/string.ts +5 -4
  255. package/assembly/deserialize/simple/staticarray/struct.ts +30 -7
  256. package/assembly/deserialize/simple/staticarray.ts +56 -12
  257. package/assembly/deserialize/simple/string.ts +1 -1
  258. package/assembly/deserialize/simple/struct.ts +12 -20
  259. package/assembly/deserialize/simple/typedarray.ts +94 -0
  260. package/assembly/deserialize/swar/array/arbitrary.ts +8 -0
  261. package/assembly/deserialize/swar/array/array.ts +39 -0
  262. package/assembly/deserialize/swar/array/bool.ts +47 -0
  263. package/assembly/deserialize/swar/array/box.ts +8 -0
  264. package/assembly/deserialize/swar/array/float.ts +39 -0
  265. package/assembly/deserialize/swar/array/integer.ts +461 -0
  266. package/assembly/deserialize/swar/array/map.ts +7 -0
  267. package/assembly/deserialize/swar/array/object.ts +44 -0
  268. package/assembly/deserialize/swar/array/raw.ts +8 -0
  269. package/assembly/deserialize/swar/array/shared.ts +96 -0
  270. package/assembly/deserialize/swar/array/string.ts +39 -0
  271. package/assembly/deserialize/swar/array/struct.ts +44 -0
  272. package/assembly/deserialize/swar/array.ts +49 -0
  273. package/assembly/deserialize/swar/string.ts +653 -14
  274. package/assembly/deserialize/unsigned.ts +75 -0
  275. package/assembly/index.d.ts +2 -2
  276. package/assembly/index.ts +214 -132
  277. package/assembly/serialize/index/arbitrary.ts +70 -0
  278. package/assembly/serialize/index/array.ts +1 -0
  279. package/assembly/serialize/index/bool.ts +1 -0
  280. package/assembly/serialize/index/date.ts +1 -0
  281. package/assembly/serialize/index/float.ts +1 -0
  282. package/assembly/serialize/index/integer.ts +1 -0
  283. package/assembly/serialize/index/map.ts +1 -0
  284. package/assembly/serialize/index/object.ts +46 -0
  285. package/assembly/serialize/index/raw.ts +1 -0
  286. package/assembly/serialize/index/set.ts +1 -0
  287. package/assembly/serialize/index/staticarray.ts +1 -0
  288. package/assembly/serialize/index/string.ts +15 -0
  289. package/assembly/serialize/index/struct.ts +1 -0
  290. package/assembly/serialize/index/typedarray.ts +1 -0
  291. package/assembly/serialize/index.ts +13 -0
  292. package/assembly/serialize/simd/string.ts +68 -68
  293. package/assembly/serialize/simple/string.ts +9 -10
  294. package/assembly/serialize/simple/typedarray.ts +63 -0
  295. package/assembly/serialize/swar/string.ts +26 -32
  296. package/assembly/test.ts +20 -20
  297. package/assembly/tsconfig.json +16 -1
  298. package/assembly/util/index.ts +1 -0
  299. package/assembly/util/masks.ts +17 -24
  300. package/assembly/util/memory.ts +0 -0
  301. package/assembly/util/stringScan.ts +24 -0
  302. package/assembly/util/swar.ts +2 -9
  303. package/eslint.config.js +43 -52
  304. package/lib/as-bs.ts +72 -77
  305. package/package.json +13 -9
  306. package/test.ts +99 -0
  307. package/tools/assemblyscript-eslint-local.js +6 -0
  308. package/tools/assemblyscript-eslint.js +53 -0
  309. package/tools/assemblyscript-prettier-plugin.js +33 -0
  310. package/tools/replacer.js +63 -0
  311. package/transform/lib/index.d.ts.map +1 -1
  312. package/transform/lib/index.js +397 -64
  313. package/transform/lib/index.js.map +1 -1
  314. package/transform/lib/types.d.ts +4 -0
  315. package/transform/lib/types.d.ts.map +1 -1
  316. package/transform/lib/types.js +62 -0
  317. package/transform/lib/types.js.map +1 -1
  318. package/transform/tsconfig.json +2 -6
  319. package/.claude/settings.local.json +0 -9
  320. package/assembly/deserialize/simple/float.ts +0 -11
  321. package/assembly/deserialize/simple/integer.ts +0 -6
@@ -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 = "__DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): __JSON_T {\n";
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): __JSON_T {\n";
281
- DESERIALIZE_CUSTOM += " return inline.always(this." + deserializer.name.text + "(JSON.Util.ptrToStr(srcStart, srcEnd)));\n";
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 (member.value) {
364
- if (member.value != "null" && member.value != "0" && member.value != "0.0" && member.value != "false") {
365
- INITIALIZE += ` store<${member.type}>(changetype<usize>(this), ${member.value}, offsetof<this>(${JSON.stringify(member.name)}));\n`;
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.type.startsWith("StaticArray<")) {
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 == "string" || member.type == "String") {
390
- INITIALIZE += ` store<${member.type}>(changetype<usize>(this), "", offsetof<this>(${JSON.stringify(member.name)}));\n`;
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 + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
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 + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
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 + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
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
- SERIALIZE += indent + `if (${toString(member.flags.get(PropertyFlags.OmitIf))}) {\n`;
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 + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
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
- indent = "";
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 += " if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
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 out;\n}\n`;
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
- INITIALIZE += " return this;\n";
962
- INITIALIZE += "}";
1212
+ if (!useFastPath) {
1213
+ INITIALIZE += " return this;\n";
1214
+ INITIALIZE += "}";
1215
+ }
963
1216
  if (DEBUG > 0) {
964
1217
  console.log(SERIALIZE_CUSTOM || SERIALIZE);
965
- console.log(INITIALIZE);
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 || DESERIALIZE, node);
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): __JSON_T {\n return out;\n}";
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
- console.log(INITIALIZE_EMPTY);
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 && !this.simdStatements.includes(`const ${name} = ${num};`))
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).toString();
1528
+ return data.charCodeAt(offset + 0);
1196
1529
  }
1197
1530
  function toU32(data, offset = 0) {
1198
- return ((data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0)).toString();
1531
+ return (data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0);
1199
1532
  }
1200
1533
  function toU48(data, offset = 0) {
1201
- return ((BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0))).toString();
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 ((BigInt(data.charCodeAt(offset + 3)) << 48n) | (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0))).toString();
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 = "";