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
@@ -1,4 +1,6 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
+ import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
3
+ import { BACK_SLASH, QUOTE } from "../../custom/chars";
2
4
  import { DESERIALIZE_ESCAPE_TABLE } from "../../globals/tables";
3
5
  import { hex4_to_u16_swar } from "../../util/swar";
4
6
 
@@ -38,12 +40,27 @@ import { hex4_to_u16_swar } from "../../util/swar";
38
40
  * @param dst buffer to write to
39
41
  * @returns number of bytes written
40
42
  */
41
- export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
42
- // Strip quotes
43
- srcStart += 2;
44
- srcEnd -= 2;
43
+ // @ts-expect-error: @inline is a valid decorator
44
+ @inline function copyStringFromSource(srcStart: usize, byteLength: usize): string {
45
+ if (byteLength == 0) return changetype<string>("");
46
+ // @ts-expect-error: __new is a runtime builtin
47
+ const out = __new(byteLength, idof<string>());
48
+ memory.copy(out, srcStart, byteLength);
49
+ return changetype<string>(out);
50
+ }
51
+
52
+ // @ts-expect-error: @inline is a valid decorator
53
+ @inline function deserializeEscapedString_SWAR(payloadStart: usize, escapeStart: usize, srcEnd: usize): string {
45
54
  const srcEnd8 = srcEnd - 8;
46
- bs.ensureSize(u32(srcEnd - srcStart));
55
+ const prefixLen = <u32>(escapeStart - payloadStart);
56
+ bs.offset = bs.buffer;
57
+ bs.ensureSize(<u32>(srcEnd - payloadStart));
58
+ if (prefixLen != 0) {
59
+ memory.copy(bs.buffer, payloadStart, prefixLen);
60
+ bs.offset += prefixLen;
61
+ }
62
+
63
+ let srcStart = escapeStart;
47
64
 
48
65
  while (srcStart < srcEnd8) {
49
66
  const block = load<u64>(srcStart);
@@ -67,13 +84,13 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
67
84
  const code = <u16>(header >> 16);
68
85
 
69
86
  // Detect false positive (code unit where low byte is 0x5C)
70
- if ((header & 0xFFFF) !== 0x5C) continue;
87
+ if ((header & 0xffff) !== 0x5c) continue;
71
88
 
72
89
  // Hot path (negative bias)
73
90
  if (code !== 0x75) {
74
91
  // Short escapes (\n \t \" \\)
75
92
  const escaped = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
76
- mask &= mask - usize(escaped === 0x5C);
93
+ mask &= mask - usize(escaped === 0x5c);
77
94
  store<u16>(dstIdx, escaped);
78
95
  store<u32>(dstIdx, load<u32>(srcIdx, 4), 2);
79
96
 
@@ -90,7 +107,6 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
90
107
  // store<u64>(dstIdx, load<u32>(srcIdx, 12), 2);
91
108
  srcStart += 4 + laneIdx;
92
109
  bs.offset -= 6 - laneIdx;
93
-
94
110
  } while (mask !== 0);
95
111
 
96
112
  bs.offset += 8;
@@ -103,7 +119,7 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
103
119
  srcStart += 2;
104
120
 
105
121
  // Early exit
106
- if (block !== 0x5C) {
122
+ if (block !== 0x5c) {
107
123
  bs.offset += 2;
108
124
  continue;
109
125
  }
@@ -128,6 +144,631 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
128
144
  return bs.out<string>();
129
145
  }
130
146
 
147
+ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
148
+ // Strip quotes
149
+ srcStart += 2;
150
+ srcEnd -= 2;
151
+ const payloadStart = srcStart;
152
+ const srcEnd8 = srcEnd - 8;
153
+
154
+ while (srcStart < srcEnd8) {
155
+ const block = load<u64>(srcStart);
156
+ let mask = inline.always(backslash_mask_unsafe(block));
157
+
158
+ if (mask === 0) {
159
+ srcStart += 8;
160
+ continue;
161
+ }
162
+
163
+ do {
164
+ const laneIdx = usize(ctz(mask) >> 3);
165
+ mask &= mask - 1;
166
+ const srcIdx = srcStart + laneIdx;
167
+ const header = load<u32>(srcIdx);
168
+
169
+ // Detect false positive (code unit where low byte is 0x5C)
170
+ if ((header & 0xffff) !== 0x5c) continue;
171
+
172
+ return inline.always(deserializeEscapedString_SWAR(payloadStart, srcIdx, srcEnd));
173
+ } while (mask !== 0);
174
+
175
+ srcStart += 8;
176
+ }
177
+
178
+ while (srcStart < srcEnd) {
179
+ if (load<u16>(srcStart) == BACK_SLASH) {
180
+ return inline.always(deserializeEscapedString_SWAR(payloadStart, srcStart, srcEnd));
181
+ }
182
+ srcStart += 2;
183
+ }
184
+
185
+ return copyStringFromSource(payloadStart, srcEnd - payloadStart);
186
+ }
187
+
188
+ // /**
189
+ // * Deserializes a quoted JSON string into a reused/renewed destination string buffer.
190
+ // * @param srcStart pointer to opening quote
191
+ // * @param srcEnd pointer to closing quote
192
+ // * @param outPtr existing destination string pointer (or 0)
193
+ // * @returns next unread source pointer
194
+ // */
195
+ // export function deserializeString_SWAR_TO(srcStart: usize, srcEnd: usize, outPtr: usize): usize {
196
+ // srcStart += 2;
197
+ // let dst = outPtr;
198
+ // const srcEnd8 = srcEnd - 8;
199
+ // const byteSize = srcEnd - srcStart;
200
+ // if (!dst) {
201
+ // dst = __new(byteSize, idof<string>());
202
+ // } else if (changetype<OBJECT>(dst - TOTAL_OVERHEAD).rtSize < <u32>byteSize) {
203
+ // dst = __renew(dst, byteSize);
204
+ // }
205
+ // let offset = dst;
206
+
207
+ // while (srcStart < srcEnd8) {
208
+ // const block = load<u64>(srcStart);
209
+ // store<u64>(offset, block);
210
+
211
+ // let mask = inline.always(backslash_mask_unsafe(block));
212
+
213
+ // if (mask === 0) {
214
+ // srcStart += 8;
215
+ // offset += 8;
216
+ // continue;
217
+ // }
218
+
219
+ // do {
220
+ // const laneIdx = usize(ctz(mask) >> 3); // 0 2 4 6
221
+ // mask &= mask - 1;
222
+ // const srcIdx = srcStart + laneIdx;
223
+ // const dstIdx = offset + laneIdx;
224
+ // const header = load<u32>(srcIdx);
225
+ // const code = <u16>(header >> 16);
226
+
227
+ // if ((header & 0xffff) !== 0x5c) continue;
228
+
229
+ // if (code !== 0x75) {
230
+ // const escaped = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
231
+ // mask &= mask - usize(escaped === 0x5c);
232
+ // store<u16>(dstIdx, escaped);
233
+ // const copyStart = srcIdx + 4;
234
+ // if (copyStart < srcEnd) {
235
+ // const copyBytes = min<usize>(4, srcEnd - copyStart);
236
+ // memory.copy(dstIdx + 2, copyStart, copyBytes);
237
+ // }
238
+
239
+ // const l6 = usize(laneIdx === 6);
240
+ // offset -= (1 - l6) << 1;
241
+ // srcStart += l6 << 1;
242
+ // continue;
243
+ // }
244
+
245
+ // const block = load<u64>(srcIdx, 4); // XXXX
246
+ // const escaped = hex4_to_u16_swar(block);
247
+ // store<u16>(dstIdx, escaped);
248
+ // srcStart += 4 + laneIdx;
249
+ // offset -= 6 - laneIdx;
250
+ // } while (mask !== 0);
251
+
252
+ // offset += 8;
253
+ // srcStart += 8;
254
+ // }
255
+
256
+ // while (srcStart < srcEnd) {
257
+ // const block = load<u16>(srcStart);
258
+ // store<u16>(offset, block);
259
+ // srcStart += 2;
260
+
261
+ // if (block !== 0x5c) {
262
+ // offset += 2;
263
+ // continue;
264
+ // }
265
+
266
+ // const code = load<u16>(srcStart);
267
+ // if (code !== 0x75) {
268
+ // const block = load<u16>(srcStart);
269
+ // const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
270
+ // store<u16>(offset, escape);
271
+ // srcStart += 2;
272
+ // } else {
273
+ // const block = load<u64>(srcStart, 2); // XXXX
274
+ // const escaped = hex4_to_u16_swar(block);
275
+ // store<u16>(offset, escaped);
276
+ // srcStart += 10;
277
+ // }
278
+
279
+ // offset += 2;
280
+ // }
281
+ // if (offset - dst != byteSize) {
282
+ // dst = __renew(dst, offset - dst);
283
+ // }
284
+ // return srcEnd + 2;
285
+ // }
286
+
287
+ // Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
288
+ // @ts-expect-error: @inline is a valid decorator
289
+ @inline function writeStringToField(dstFieldPtr: usize, srcStart: usize, byteLength: u32): void {
290
+ if (byteLength == 0) {
291
+ store<usize>(dstFieldPtr, changetype<usize>(""));
292
+ return;
293
+ }
294
+
295
+ const current = load<usize>(dstFieldPtr);
296
+ let stringPtr: usize;
297
+ if (current != 0 && changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
298
+ stringPtr = current;
299
+ } else if (current != 0 && current != changetype<usize>("")) {
300
+ stringPtr = __renew(current, byteLength);
301
+ store<usize>(dstFieldPtr, stringPtr);
302
+ } else {
303
+ stringPtr = __new(byteLength, idof<string>());
304
+ store<usize>(dstFieldPtr, stringPtr);
305
+ }
306
+ memory.copy(stringPtr, srcStart, byteLength);
307
+ }
308
+
309
+ /*
310
+ export function deserializeStringField_SWAR<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
311
+ if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
312
+
313
+ const payloadStart = srcStart + 2;
314
+ const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
315
+ srcStart = payloadStart;
316
+
317
+ while (srcStart <= srcEnd8) {
318
+ let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
319
+
320
+ if (mask === 0) {
321
+ srcStart += 8;
322
+ continue;
323
+ }
324
+
325
+ do {
326
+ const laneIdx = usize(ctz(mask) >> 3);
327
+ mask &= ~(0xffff << (laneIdx << 3));
328
+ // since we clear the entire byte, we can guarentee that any discovered lane where char == QUOTE is unescaped and a terminator.
329
+ const srcIdx = srcStart + laneIdx;
330
+ const char = load<u16>(srcIdx);
331
+
332
+ if (char == QUOTE) {
333
+ writeStringToField(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
334
+ return srcIdx + 2;
335
+ }
336
+ if (char != BACK_SLASH) continue;
337
+
338
+ bs.offset = bs.buffer;
339
+ bs.ensureSize(<u32>(srcEnd - payloadStart));
340
+ const prefixLen = <u32>(srcIdx - payloadStart);
341
+ if (prefixLen != 0) {
342
+ memory.copy(bs.buffer, payloadStart, prefixLen);
343
+ bs.offset += prefixLen;
344
+ }
345
+
346
+ const chunk = load<u32>(srcIdx);
347
+ const code = <u16>(chunk >> 16);
348
+
349
+ if (code !== 0x75) {
350
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
351
+ bs.offset += 2;
352
+ let lastPtr = srcIdx + 4;
353
+ srcStart = lastPtr;
354
+ while (srcStart <= srcEnd8) {
355
+ const blockStart = srcStart;
356
+ let escapedMask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
357
+ if (escapedMask === 0) {
358
+ srcStart += 8;
359
+ continue;
360
+ }
361
+
362
+ do {
363
+ const escapedLaneIdx = usize(ctz(escapedMask) >> 3);
364
+ escapedMask &= escapedMask - 1;
365
+ const escapedIdx = srcStart + escapedLaneIdx;
366
+ const escapedChar = load<u16>(escapedIdx);
367
+
368
+ if (escapedChar == QUOTE) {
369
+ const runLen = <u32>(escapedIdx - lastPtr);
370
+ if (runLen != 0) {
371
+ memory.copy(bs.offset, lastPtr, runLen);
372
+ bs.offset += runLen;
373
+ }
374
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
375
+ bs.offset = bs.buffer;
376
+ return escapedIdx + 2;
377
+ }
378
+ if (escapedChar != BACK_SLASH) continue;
379
+
380
+ const runLen = <u32>(escapedIdx - lastPtr);
381
+ if (runLen != 0) {
382
+ memory.copy(bs.offset, lastPtr, runLen);
383
+ bs.offset += runLen;
384
+ }
385
+
386
+ const escapedChunk = load<u32>(escapedIdx);
387
+ const escapedCode = <u16>(escapedChunk >> 16);
388
+ if (escapedCode !== 0x75) {
389
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + escapedCode));
390
+ bs.offset += 2;
391
+ lastPtr = escapedIdx + 4;
392
+ } else {
393
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(escapedIdx, 4)));
394
+ bs.offset += 2;
395
+ lastPtr = escapedIdx + 12;
396
+ }
397
+ srcStart = lastPtr;
398
+ break;
399
+ } while (escapedMask !== 0);
400
+
401
+ if (srcStart == blockStart) srcStart += 8;
402
+ }
403
+
404
+ while (srcStart < srcEnd) {
405
+ const tailChar = load<u16>(srcStart);
406
+ if (tailChar == QUOTE) {
407
+ const runLen = <u32>(srcStart - lastPtr);
408
+ if (runLen != 0) {
409
+ memory.copy(bs.offset, lastPtr, runLen);
410
+ bs.offset += runLen;
411
+ }
412
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
413
+ bs.offset = bs.buffer;
414
+ return srcStart + 2;
415
+ }
416
+ if (tailChar != BACK_SLASH) {
417
+ srcStart += 2;
418
+ continue;
419
+ }
420
+
421
+ const runLen = <u32>(srcStart - lastPtr);
422
+ if (runLen != 0) {
423
+ memory.copy(bs.offset, lastPtr, runLen);
424
+ bs.offset += runLen;
425
+ }
426
+ const tailCode = load<u16>(srcStart, 2);
427
+ if (tailCode !== 0x75) {
428
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
429
+ bs.offset += 2;
430
+ srcStart += 4;
431
+ } else {
432
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
433
+ bs.offset += 2;
434
+ srcStart += 12;
435
+ }
436
+ lastPtr = srcStart;
437
+ }
438
+ bs.offset = bs.buffer;
439
+ return srcStart;
440
+ } else {
441
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
442
+ bs.offset += 2;
443
+ let lastPtr = srcIdx + 12;
444
+ srcStart = lastPtr;
445
+ while (srcStart <= srcEnd8) {
446
+ const blockStart = srcStart;
447
+ let escapedMask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
448
+ if (escapedMask === 0) {
449
+ srcStart += 8;
450
+ continue;
451
+ }
452
+
453
+ do {
454
+ const escapedLaneIdx = usize(ctz(escapedMask) >> 3);
455
+ escapedMask &= escapedMask - 1;
456
+ const escapedIdx = srcStart + escapedLaneIdx;
457
+ const escapedChar = load<u16>(escapedIdx);
458
+
459
+ if (escapedChar == QUOTE) {
460
+ const runLen = <u32>(escapedIdx - lastPtr);
461
+ if (runLen != 0) {
462
+ memory.copy(bs.offset, lastPtr, runLen);
463
+ bs.offset += runLen;
464
+ }
465
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
466
+ bs.offset = bs.buffer;
467
+ return escapedIdx + 2;
468
+ }
469
+ if (escapedChar != BACK_SLASH) continue;
470
+
471
+ const runLen = <u32>(escapedIdx - lastPtr);
472
+ if (runLen != 0) {
473
+ memory.copy(bs.offset, lastPtr, runLen);
474
+ bs.offset += runLen;
475
+ }
476
+
477
+ const escapedChunk = load<u32>(escapedIdx);
478
+ const escapedCode = <u16>(escapedChunk >> 16);
479
+ if (escapedCode !== 0x75) {
480
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + escapedCode));
481
+ bs.offset += 2;
482
+ lastPtr = escapedIdx + 4;
483
+ } else {
484
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(escapedIdx, 4)));
485
+ bs.offset += 2;
486
+ lastPtr = escapedIdx + 12;
487
+ }
488
+ srcStart = lastPtr;
489
+ break;
490
+ } while (escapedMask !== 0);
491
+
492
+ if (srcStart == blockStart) srcStart += 8;
493
+ }
494
+
495
+ while (srcStart < srcEnd) {
496
+ const tailChar = load<u16>(srcStart);
497
+ if (tailChar == QUOTE) {
498
+ const runLen = <u32>(srcStart - lastPtr);
499
+ if (runLen != 0) {
500
+ memory.copy(bs.offset, lastPtr, runLen);
501
+ bs.offset += runLen;
502
+ }
503
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
504
+ bs.offset = bs.buffer;
505
+ return srcStart + 2;
506
+ }
507
+ if (tailChar != BACK_SLASH) {
508
+ srcStart += 2;
509
+ continue;
510
+ }
511
+
512
+ const runLen = <u32>(srcStart - lastPtr);
513
+ if (runLen != 0) {
514
+ memory.copy(bs.offset, lastPtr, runLen);
515
+ bs.offset += runLen;
516
+ }
517
+ const tailCode = load<u16>(srcStart, 2);
518
+ if (tailCode !== 0x75) {
519
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
520
+ bs.offset += 2;
521
+ srcStart += 4;
522
+ } else {
523
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
524
+ bs.offset += 2;
525
+ srcStart += 12;
526
+ }
527
+ lastPtr = srcStart;
528
+ }
529
+ bs.offset = bs.buffer;
530
+ return srcStart;
531
+ }
532
+ } while (mask !== 0);
533
+ }
534
+
535
+ while (srcStart < srcEnd) {
536
+ const char = load<u16>(srcStart);
537
+ if (char == QUOTE) {
538
+ writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
539
+ return srcStart + 2;
540
+ }
541
+ if (char == BACK_SLASH) {
542
+ bs.offset = bs.buffer;
543
+ bs.ensureSize(<u32>(srcEnd - payloadStart));
544
+ const prefixLen = <u32>(srcStart - payloadStart);
545
+ if (prefixLen != 0) {
546
+ memory.copy(bs.buffer, payloadStart, prefixLen);
547
+ bs.offset += prefixLen;
548
+ }
549
+
550
+ let lastPtr = srcStart;
551
+ const code = load<u16>(srcStart, 2);
552
+ if (code !== 0x75) {
553
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
554
+ bs.offset += 2;
555
+ srcStart += 4;
556
+ } else {
557
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
558
+ bs.offset += 2;
559
+ srcStart += 12;
560
+ }
561
+ lastPtr = srcStart;
562
+
563
+ while (srcStart < srcEnd) {
564
+ const tailChar = load<u16>(srcStart);
565
+ if (tailChar == QUOTE) {
566
+ const runLen = <u32>(srcStart - lastPtr);
567
+ if (runLen != 0) {
568
+ memory.copy(bs.offset, lastPtr, runLen);
569
+ bs.offset += runLen;
570
+ }
571
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
572
+ bs.offset = bs.buffer;
573
+ return srcStart + 2;
574
+ }
575
+ if (tailChar != BACK_SLASH) {
576
+ srcStart += 2;
577
+ continue;
578
+ }
579
+
580
+ const runLen = <u32>(srcStart - lastPtr);
581
+ if (runLen != 0) {
582
+ memory.copy(bs.offset, lastPtr, runLen);
583
+ bs.offset += runLen;
584
+ }
585
+ const tailCode = load<u16>(srcStart, 2);
586
+ if (tailCode !== 0x75) {
587
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
588
+ bs.offset += 2;
589
+ srcStart += 4;
590
+ } else {
591
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
592
+ bs.offset += 2;
593
+ srcStart += 12;
594
+ }
595
+ lastPtr = srcStart;
596
+ }
597
+ bs.offset = bs.buffer;
598
+ return srcStart;
599
+ }
600
+ srcStart += 2;
601
+ }
602
+
603
+ return srcStart;
604
+ }
605
+ */
606
+
607
+ // @ts-expect-error: @inline is a valid decorator
608
+ @inline function deserializeEscapedStringScan_SWAR(payloadStart: usize, escapeStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
609
+ const prefixLen = <u32>(escapeStart - payloadStart);
610
+ const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
611
+ bs.offset = bs.buffer;
612
+ bs.ensureSize(<u32>(srcEnd - payloadStart));
613
+ if (prefixLen != 0) {
614
+ memory.copy(bs.buffer, payloadStart, prefixLen);
615
+ bs.offset += prefixLen;
616
+ }
617
+
618
+ let lastPtr = escapeStart;
619
+ let srcStart = escapeStart;
620
+
621
+ while (srcStart <= srcEnd8) {
622
+ const blockStart = srcStart;
623
+ let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
624
+ if (mask === 0) {
625
+ srcStart += 8;
626
+ continue;
627
+ }
628
+
629
+ do {
630
+ const laneIdx = usize(ctz(mask) >> 3);
631
+ mask &= mask - 1;
632
+ const srcIdx = srcStart + laneIdx;
633
+ const char = load<u16>(srcIdx);
634
+ if (char == QUOTE) {
635
+ const runLen = <u32>(srcIdx - lastPtr);
636
+ if (runLen != 0) {
637
+ memory.copy(bs.offset, lastPtr, runLen);
638
+ bs.offset += runLen;
639
+ }
640
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
641
+ bs.offset = bs.buffer;
642
+ return srcIdx + 2;
643
+ }
644
+ if (char != BACK_SLASH) continue;
645
+
646
+ const runLen = <u32>(srcIdx - lastPtr);
647
+ if (runLen != 0) {
648
+ memory.copy(bs.offset, lastPtr, runLen);
649
+ bs.offset += runLen;
650
+ }
651
+
652
+ const chunk = load<u32>(srcIdx);
653
+ const code = <u16>(chunk >> 16);
654
+ if (code !== 0x75) {
655
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
656
+ bs.offset += 2;
657
+ lastPtr = srcIdx + 4;
658
+ } else {
659
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
660
+ bs.offset += 2;
661
+ lastPtr = srcIdx + 12;
662
+ }
663
+ srcStart = lastPtr;
664
+ break;
665
+ } while (mask !== 0);
666
+ if (srcStart == blockStart) srcStart += 8;
667
+ }
668
+
669
+ while (srcStart < srcEnd) {
670
+ const char = load<u16>(srcStart);
671
+ if (char == QUOTE) {
672
+ const runLen = <u32>(srcStart - lastPtr);
673
+ if (runLen != 0) {
674
+ memory.copy(bs.offset, lastPtr, runLen);
675
+ bs.offset += runLen;
676
+ }
677
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
678
+ bs.offset = bs.buffer;
679
+ return srcStart + 2;
680
+ }
681
+ if (char != BACK_SLASH) {
682
+ srcStart += 2;
683
+ continue;
684
+ }
685
+
686
+ const runLen = <u32>(srcStart - lastPtr);
687
+ if (runLen != 0) {
688
+ memory.copy(bs.offset, lastPtr, runLen);
689
+ bs.offset += runLen;
690
+ }
691
+
692
+ const code = load<u16>(srcStart, 2);
693
+ if (code !== 0x75) {
694
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
695
+ bs.offset += 2;
696
+ srcStart += 4;
697
+ } else {
698
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
699
+ bs.offset += 2;
700
+ srcStart += 12;
701
+ }
702
+
703
+ lastPtr = srcStart;
704
+ }
705
+
706
+ bs.offset = bs.buffer;
707
+ abort("Unterminated string literal");
708
+ return srcStart;
709
+ }
710
+
711
+ // Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
712
+ export function deserializeStringField_SWAR<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
713
+ if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
714
+
715
+ const payloadStart = srcStart + 2;
716
+ const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
717
+ srcStart = payloadStart;
718
+
719
+ while (srcStart <= srcEnd8) {
720
+ let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
721
+ if (mask === 0) {
722
+ srcStart += 8;
723
+ continue;
724
+ }
725
+
726
+ do {
727
+ const laneIdx = usize(ctz(mask) >> 3);
728
+ mask &= mask - 1;
729
+ const srcIdx = srcStart + laneIdx;
730
+ const char = load<u16>(srcIdx);
731
+ if (char == QUOTE) {
732
+ writeStringToField(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
733
+ return srcIdx + 2;
734
+ }
735
+ if (char != BACK_SLASH) continue;
736
+
737
+ return deserializeEscapedStringScan_SWAR(payloadStart, srcIdx, srcEnd, dstFieldPtr);
738
+ } while (mask !== 0);
739
+
740
+ srcStart += 8;
741
+ }
742
+
743
+ while (srcStart < srcEnd) {
744
+ const char = load<u16>(srcStart);
745
+ if (char == QUOTE) {
746
+ writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
747
+ return srcStart + 2;
748
+ }
749
+ if (char == BACK_SLASH) {
750
+ return deserializeEscapedStringScan_SWAR(payloadStart, srcStart, srcEnd, dstFieldPtr);
751
+ }
752
+ srcStart += 2;
753
+ }
754
+
755
+ abort("Unterminated string literal");
756
+ return srcStart;
757
+ }
758
+
759
+ /**
760
+ * Computes a per-byte mask identifying ASCII backslash or quote bytes.
761
+ *
762
+ * WARNING: Matches in the high byte of a UTF-16 code unit are not filtered,
763
+ * so callers must confirm the hit scalarly.
764
+ * Each matching lane sets itself to 0x80.
765
+ */
766
+ // @ts-expect-error: @inline is a valid decorator
767
+ @inline function backslash_or_quote_mask(block: u64): u64 {
768
+ const b = block ^ 0x005c_005c_005c_005c;
769
+ const q = block ^ 0x0022_0022_0022_0022;
770
+ return (((q - 0x0001_0001_0001_0001) & ~q) | ((b - 0x0001_0001_0001_0001) & ~b)) & 0x0080_0080_0080_0080;
771
+ }
131
772
  /**
132
773
  * Computes a per-lane mask identifying UTF-16 code units whose **low byte**
133
774
  * is the ASCII backslash (`'\\'`, 0x5C).
@@ -141,11 +782,9 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
141
782
  */
142
783
  // @ts-expect-error: @inline is a valid decorator
143
784
  @inline function backslash_mask(block: u64): u64 {
144
- const b = block ^ 0x005C_005C_005C_005C;
785
+ const b = block ^ 0x005c_005c_005c_005c;
145
786
  const backslash_mask = (b - 0x0001_0001_0001_0001) & ~b & 0x0080_0080_0080_0080;
146
- const high_byte_mask =
147
- ~(((block - 0x0100_0100_0100_0100) & ~block & 0x8000_8000_8000_8000)
148
- ^ 0x8000_8000_8000_8000) >> 8;
787
+ const high_byte_mask = ~(((block - 0x0100_0100_0100_0100) & ~block & 0x8000_8000_8000_8000) ^ 0x8000_8000_8000_8000) >> 8;
149
788
  return backslash_mask & high_byte_mask;
150
789
  }
151
790
 
@@ -160,7 +799,7 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
160
799
  */
161
800
  // @ts-expect-error: @inline is a valid decorator
162
801
  @inline function backslash_mask_unsafe(block: u64): u64 {
163
- const b = block ^ 0x005C_005C_005C_005C;
802
+ const b = block ^ 0x005c_005c_005c_005c;
164
803
  const backslash_mask = (b - 0x0001_0001_0001_0001) & ~b & 0x0080_0080_0080_0080;
165
804
  return backslash_mask;
166
805
  }