json-as 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/CHANGELOG.md +400 -0
  2. package/README.md +137 -32
  3. package/assembly/deserialize/index/arbitrary.ts +1 -1
  4. package/assembly/deserialize/index/array.ts +6 -1
  5. package/assembly/deserialize/index/float.ts +1 -1
  6. package/assembly/deserialize/index/integer.ts +1 -1
  7. package/assembly/deserialize/index/typedarray.ts +14 -0
  8. package/assembly/deserialize/index/unsigned.ts +1 -1
  9. package/assembly/deserialize/simd/string.ts +20 -16
  10. package/assembly/deserialize/simple/arbitrary.ts +1 -1
  11. package/assembly/deserialize/simple/array/generic.ts +42 -0
  12. package/assembly/deserialize/simple/array.ts +8 -1
  13. package/assembly/deserialize/{float.ts → simple/float.ts} +22 -2
  14. package/assembly/deserialize/{integer.ts → simple/integer.ts} +3 -2
  15. package/assembly/deserialize/simple/map.ts +60 -12
  16. package/assembly/deserialize/simple/object.ts +1 -1
  17. package/assembly/deserialize/simple/set.ts +119 -134
  18. package/assembly/deserialize/simple/staticarray.ts +12 -1
  19. package/assembly/deserialize/simple/string.ts +93 -2
  20. package/assembly/deserialize/simple/struct.ts +7 -157
  21. package/assembly/deserialize/simple/typedarray.ts +1 -1
  22. package/assembly/deserialize/{unsigned.ts → simple/unsigned.ts} +3 -2
  23. package/assembly/deserialize/swar/array/array.ts +42 -7
  24. package/assembly/deserialize/swar/array/bool.ts +5 -2
  25. package/assembly/deserialize/swar/array/float.ts +7 -3
  26. package/assembly/deserialize/swar/array/generic.ts +40 -0
  27. package/assembly/deserialize/swar/array/integer.ts +7 -4
  28. package/assembly/deserialize/swar/array/object.ts +20 -4
  29. package/assembly/deserialize/swar/array/shared.ts +18 -4
  30. package/assembly/deserialize/swar/array/string.ts +5 -2
  31. package/assembly/deserialize/swar/array/struct.ts +20 -4
  32. package/assembly/deserialize/swar/array.ts +56 -2
  33. package/assembly/deserialize/swar/string.ts +245 -370
  34. package/assembly/index.ts +207 -194
  35. package/assembly/serialize/index/arbitrary.ts +8 -3
  36. package/assembly/serialize/index/float.ts +1 -1
  37. package/assembly/serialize/index/object.ts +1 -5
  38. package/assembly/serialize/index/typedarray.ts +65 -0
  39. package/assembly/serialize/simd/string.ts +7 -16
  40. package/assembly/serialize/simple/arbitrary.ts +9 -3
  41. package/assembly/serialize/simple/array.ts +17 -6
  42. package/assembly/serialize/simple/float.ts +18 -4
  43. package/assembly/serialize/simple/map.ts +10 -27
  44. package/assembly/serialize/simple/object.ts +1 -5
  45. package/assembly/serialize/simple/set.ts +3 -4
  46. package/assembly/serialize/simple/staticarray.ts +4 -3
  47. package/assembly/serialize/simple/string.ts +3 -11
  48. package/assembly/serialize/simple/typedarray.ts +9 -7
  49. package/assembly/serialize/swar/string.ts +3 -12
  50. package/assembly/tsconfig.json +3 -2
  51. package/assembly/util/dragonbox-cache.ts +1322 -0
  52. package/assembly/util/dragonbox.ts +596 -0
  53. package/assembly/util/swar.ts +49 -0
  54. package/lib/as-bs.ts +92 -70
  55. package/package.json +35 -10
  56. package/transform/lib/index.d.ts +1 -0
  57. package/transform/lib/index.d.ts.map +1 -1
  58. package/transform/lib/index.js +559 -221
  59. package/transform/lib/index.js.map +1 -1
  60. package/transform/lib/linkers/custom.d.ts.map +1 -1
  61. package/transform/lib/linkers/custom.js +7 -3
  62. package/transform/lib/linkers/custom.js.map +1 -1
  63. package/transform/lib/types.d.ts +2 -0
  64. package/transform/lib/types.d.ts.map +1 -1
  65. package/transform/lib/types.js +13 -0
  66. package/transform/lib/types.js.map +1 -1
  67. package/.as-test/coverage/naive/coverage.arbitrary.spec.ts.log.json +0 -5628
  68. package/.as-test/coverage/naive/coverage.array.spec.ts.log.json +0 -5187
  69. package/.as-test/coverage/naive/coverage.bool.spec.ts.log.json +0 -5187
  70. package/.as-test/coverage/naive/coverage.box.spec.ts.log.json +0 -5187
  71. package/.as-test/coverage/naive/coverage.custom.spec.ts.log.json +0 -5187
  72. package/.as-test/coverage/naive/coverage.date.spec.ts.log.json +0 -5187
  73. package/.as-test/coverage/naive/coverage.enum.spec.ts.log.json +0 -5187
  74. package/.as-test/coverage/naive/coverage.float.spec.ts.log.json +0 -5187
  75. package/.as-test/coverage/naive/coverage.generics.spec.ts.log.json +0 -5187
  76. package/.as-test/coverage/naive/coverage.hierarchy.spec.ts.log.json +0 -5187
  77. package/.as-test/coverage/naive/coverage.integer.spec.ts.log.json +0 -5187
  78. package/.as-test/coverage/naive/coverage.map.spec.ts.log.json +0 -5187
  79. package/.as-test/coverage/naive/coverage.namespace.spec.ts.log.json +0 -5187
  80. package/.as-test/coverage/naive/coverage.null.spec.ts.log.json +0 -5187
  81. package/.as-test/coverage/naive/coverage.raw.spec.ts.log.json +0 -5187
  82. package/.as-test/coverage/naive/coverage.resolving.spec.ts.log.json +0 -5628
  83. package/.as-test/coverage/naive/coverage.set.spec.ts.log.json +0 -5187
  84. package/.as-test/coverage/naive/coverage.staticarray.spec.ts.log.json +0 -5187
  85. package/.as-test/coverage/naive/coverage.string.spec.ts.log.json +0 -5187
  86. package/.as-test/coverage/naive/coverage.struct.spec.ts.log.json +0 -5187
  87. package/.as-test/coverage/naive/coverage.types.spec.ts.log.json +0 -5187
  88. package/.as-test/coverage/simd/coverage.arbitrary.spec.ts.log.json +0 -5628
  89. package/.as-test/coverage/simd/coverage.array.spec.ts.log.json +0 -5187
  90. package/.as-test/coverage/simd/coverage.bool.spec.ts.log.json +0 -5187
  91. package/.as-test/coverage/simd/coverage.box.spec.ts.log.json +0 -5187
  92. package/.as-test/coverage/simd/coverage.custom.spec.ts.log.json +0 -5187
  93. package/.as-test/coverage/simd/coverage.date.spec.ts.log.json +0 -5187
  94. package/.as-test/coverage/simd/coverage.enum.spec.ts.log.json +0 -5187
  95. package/.as-test/coverage/simd/coverage.float.spec.ts.log.json +0 -5187
  96. package/.as-test/coverage/simd/coverage.generics.spec.ts.log.json +0 -5187
  97. package/.as-test/coverage/simd/coverage.hierarchy.spec.ts.log.json +0 -5187
  98. package/.as-test/coverage/simd/coverage.integer.spec.ts.log.json +0 -5187
  99. package/.as-test/coverage/simd/coverage.map.spec.ts.log.json +0 -5187
  100. package/.as-test/coverage/simd/coverage.namespace.spec.ts.log.json +0 -5187
  101. package/.as-test/coverage/simd/coverage.null.spec.ts.log.json +0 -5187
  102. package/.as-test/coverage/simd/coverage.raw.spec.ts.log.json +0 -5187
  103. package/.as-test/coverage/simd/coverage.resolving.spec.ts.log.json +0 -5628
  104. package/.as-test/coverage/simd/coverage.set.spec.ts.log.json +0 -5187
  105. package/.as-test/coverage/simd/coverage.staticarray.spec.ts.log.json +0 -5187
  106. package/.as-test/coverage/simd/coverage.string.spec.ts.log.json +0 -5187
  107. package/.as-test/coverage/simd/coverage.struct.spec.ts.log.json +0 -5187
  108. package/.as-test/coverage/simd/coverage.types.spec.ts.log.json +0 -5187
  109. package/.as-test/coverage/swar/coverage.arbitrary.spec.ts.log.json +0 -5628
  110. package/.as-test/coverage/swar/coverage.array.spec.ts.log.json +0 -5187
  111. package/.as-test/coverage/swar/coverage.bool.spec.ts.log.json +0 -5187
  112. package/.as-test/coverage/swar/coverage.box.spec.ts.log.json +0 -5187
  113. package/.as-test/coverage/swar/coverage.custom.spec.ts.log.json +0 -5187
  114. package/.as-test/coverage/swar/coverage.date.spec.ts.log.json +0 -5187
  115. package/.as-test/coverage/swar/coverage.enum.spec.ts.log.json +0 -5187
  116. package/.as-test/coverage/swar/coverage.float.spec.ts.log.json +0 -5187
  117. package/.as-test/coverage/swar/coverage.generics.spec.ts.log.json +0 -5187
  118. package/.as-test/coverage/swar/coverage.hierarchy.spec.ts.log.json +0 -5187
  119. package/.as-test/coverage/swar/coverage.integer.spec.ts.log.json +0 -5187
  120. package/.as-test/coverage/swar/coverage.map.spec.ts.log.json +0 -5187
  121. package/.as-test/coverage/swar/coverage.namespace.spec.ts.log.json +0 -5187
  122. package/.as-test/coverage/swar/coverage.null.spec.ts.log.json +0 -5187
  123. package/.as-test/coverage/swar/coverage.raw.spec.ts.log.json +0 -5187
  124. package/.as-test/coverage/swar/coverage.resolving.spec.ts.log.json +0 -5628
  125. package/.as-test/coverage/swar/coverage.set.spec.ts.log.json +0 -5187
  126. package/.as-test/coverage/swar/coverage.staticarray.spec.ts.log.json +0 -5187
  127. package/.as-test/coverage/swar/coverage.string.spec.ts.log.json +0 -5187
  128. package/.as-test/coverage/swar/coverage.struct.spec.ts.log.json +0 -5187
  129. package/.as-test/coverage/swar/coverage.types.spec.ts.log.json +0 -5187
  130. package/.as-test/logs/naive/run.arbitrary.spec.ts.log.json +0 -943
  131. package/.as-test/logs/naive/run.array.spec.ts.log.json +0 -1053
  132. package/.as-test/logs/naive/run.bool.spec.ts.log.json +0 -257
  133. package/.as-test/logs/naive/run.box.spec.ts.log.json +0 -353
  134. package/.as-test/logs/naive/run.custom.spec.ts.log.json +0 -309
  135. package/.as-test/logs/naive/run.date.spec.ts.log.json +0 -397
  136. package/.as-test/logs/naive/run.enum.spec.ts.log.json +0 -343
  137. package/.as-test/logs/naive/run.float.spec.ts.log.json +0 -453
  138. package/.as-test/logs/naive/run.generics.spec.ts.log.json +0 -393
  139. package/.as-test/logs/naive/run.hierarchy.spec.ts.log.json +0 -325
  140. package/.as-test/logs/naive/run.integer.spec.ts.log.json +0 -373
  141. package/.as-test/logs/naive/run.map.spec.ts.log.json +0 -247
  142. package/.as-test/logs/naive/run.namespace.spec.ts.log.json +0 -361
  143. package/.as-test/logs/naive/run.null.spec.ts.log.json +0 -273
  144. package/.as-test/logs/naive/run.raw.spec.ts.log.json +0 -309
  145. package/.as-test/logs/naive/run.resolving.spec.ts.log.json +0 -273
  146. package/.as-test/logs/naive/run.set.spec.ts.log.json +0 -733
  147. package/.as-test/logs/naive/run.staticarray.spec.ts.log.json +0 -931
  148. package/.as-test/logs/naive/run.string.spec.ts.log.json +0 -2289
  149. package/.as-test/logs/naive/run.struct.spec.ts.log.json +0 -523
  150. package/.as-test/logs/naive/run.types.spec.ts.log.json +0 -273
  151. package/.as-test/logs/naive/test.arbitrary.spec.ts.log.json +0 -943
  152. package/.as-test/logs/naive/test.array.spec.ts.log.json +0 -1053
  153. package/.as-test/logs/naive/test.bool.spec.ts.log.json +0 -257
  154. package/.as-test/logs/naive/test.box.spec.ts.log.json +0 -353
  155. package/.as-test/logs/naive/test.custom.spec.ts.log.json +0 -309
  156. package/.as-test/logs/naive/test.date.spec.ts.log.json +0 -397
  157. package/.as-test/logs/naive/test.enum.spec.ts.log.json +0 -343
  158. package/.as-test/logs/naive/test.float.spec.ts.log.json +0 -453
  159. package/.as-test/logs/naive/test.generics.spec.ts.log.json +0 -393
  160. package/.as-test/logs/naive/test.hierarchy.spec.ts.log.json +0 -325
  161. package/.as-test/logs/naive/test.integer.spec.ts.log.json +0 -373
  162. package/.as-test/logs/naive/test.log.json +0 -2289
  163. package/.as-test/logs/naive/test.map.spec.ts.log.json +0 -247
  164. package/.as-test/logs/naive/test.namespace.spec.ts.log.json +0 -361
  165. package/.as-test/logs/naive/test.null.spec.ts.log.json +0 -273
  166. package/.as-test/logs/naive/test.raw.spec.ts.log.json +0 -309
  167. package/.as-test/logs/naive/test.resolving.spec.ts.log.json +0 -273
  168. package/.as-test/logs/naive/test.set.spec.ts.log.json +0 -733
  169. package/.as-test/logs/naive/test.staticarray.spec.ts.log.json +0 -931
  170. package/.as-test/logs/naive/test.string.spec.ts.log.json +0 -2345
  171. package/.as-test/logs/naive/test.struct.spec.ts.log.json +0 -523
  172. package/.as-test/logs/naive/test.types.spec.ts.log.json +0 -273
  173. package/.as-test/logs/simd/run.arbitrary.spec.ts.log.json +0 -943
  174. package/.as-test/logs/simd/run.array.spec.ts.log.json +0 -1053
  175. package/.as-test/logs/simd/run.bool.spec.ts.log.json +0 -257
  176. package/.as-test/logs/simd/run.box.spec.ts.log.json +0 -353
  177. package/.as-test/logs/simd/run.custom.spec.ts.log.json +0 -309
  178. package/.as-test/logs/simd/run.date.spec.ts.log.json +0 -397
  179. package/.as-test/logs/simd/run.enum.spec.ts.log.json +0 -343
  180. package/.as-test/logs/simd/run.float.spec.ts.log.json +0 -453
  181. package/.as-test/logs/simd/run.generics.spec.ts.log.json +0 -393
  182. package/.as-test/logs/simd/run.hierarchy.spec.ts.log.json +0 -325
  183. package/.as-test/logs/simd/run.integer.spec.ts.log.json +0 -373
  184. package/.as-test/logs/simd/run.map.spec.ts.log.json +0 -247
  185. package/.as-test/logs/simd/run.namespace.spec.ts.log.json +0 -361
  186. package/.as-test/logs/simd/run.null.spec.ts.log.json +0 -273
  187. package/.as-test/logs/simd/run.raw.spec.ts.log.json +0 -309
  188. package/.as-test/logs/simd/run.resolving.spec.ts.log.json +0 -273
  189. package/.as-test/logs/simd/run.set.spec.ts.log.json +0 -733
  190. package/.as-test/logs/simd/run.staticarray.spec.ts.log.json +0 -931
  191. package/.as-test/logs/simd/run.string.spec.ts.log.json +0 -2289
  192. package/.as-test/logs/simd/run.struct.spec.ts.log.json +0 -523
  193. package/.as-test/logs/simd/run.types.spec.ts.log.json +0 -273
  194. package/.as-test/logs/simd/test.arbitrary.spec.ts.log.json +0 -943
  195. package/.as-test/logs/simd/test.array.spec.ts.log.json +0 -1053
  196. package/.as-test/logs/simd/test.bool.spec.ts.log.json +0 -257
  197. package/.as-test/logs/simd/test.box.spec.ts.log.json +0 -353
  198. package/.as-test/logs/simd/test.custom.spec.ts.log.json +0 -309
  199. package/.as-test/logs/simd/test.date.spec.ts.log.json +0 -397
  200. package/.as-test/logs/simd/test.enum.spec.ts.log.json +0 -343
  201. package/.as-test/logs/simd/test.float.spec.ts.log.json +0 -453
  202. package/.as-test/logs/simd/test.generics.spec.ts.log.json +0 -393
  203. package/.as-test/logs/simd/test.hierarchy.spec.ts.log.json +0 -325
  204. package/.as-test/logs/simd/test.integer.spec.ts.log.json +0 -373
  205. package/.as-test/logs/simd/test.log.json +0 -11371
  206. package/.as-test/logs/simd/test.map.spec.ts.log.json +0 -247
  207. package/.as-test/logs/simd/test.namespace.spec.ts.log.json +0 -361
  208. package/.as-test/logs/simd/test.null.spec.ts.log.json +0 -273
  209. package/.as-test/logs/simd/test.raw.spec.ts.log.json +0 -309
  210. package/.as-test/logs/simd/test.resolving.spec.ts.log.json +0 -273
  211. package/.as-test/logs/simd/test.set.spec.ts.log.json +0 -733
  212. package/.as-test/logs/simd/test.staticarray.spec.ts.log.json +0 -931
  213. package/.as-test/logs/simd/test.string.spec.ts.log.json +0 -2345
  214. package/.as-test/logs/simd/test.struct.spec.ts.log.json +0 -523
  215. package/.as-test/logs/simd/test.types.spec.ts.log.json +0 -273
  216. package/.as-test/logs/swar/run.arbitrary.spec.ts.log.json +0 -943
  217. package/.as-test/logs/swar/run.array.spec.ts.log.json +0 -1053
  218. package/.as-test/logs/swar/run.bool.spec.ts.log.json +0 -257
  219. package/.as-test/logs/swar/run.box.spec.ts.log.json +0 -353
  220. package/.as-test/logs/swar/run.custom.spec.ts.log.json +0 -309
  221. package/.as-test/logs/swar/run.date.spec.ts.log.json +0 -397
  222. package/.as-test/logs/swar/run.enum.spec.ts.log.json +0 -343
  223. package/.as-test/logs/swar/run.float.spec.ts.log.json +0 -453
  224. package/.as-test/logs/swar/run.generics.spec.ts.log.json +0 -393
  225. package/.as-test/logs/swar/run.hierarchy.spec.ts.log.json +0 -325
  226. package/.as-test/logs/swar/run.integer.spec.ts.log.json +0 -373
  227. package/.as-test/logs/swar/run.map.spec.ts.log.json +0 -247
  228. package/.as-test/logs/swar/run.namespace.spec.ts.log.json +0 -361
  229. package/.as-test/logs/swar/run.null.spec.ts.log.json +0 -273
  230. package/.as-test/logs/swar/run.raw.spec.ts.log.json +0 -309
  231. package/.as-test/logs/swar/run.resolving.spec.ts.log.json +0 -273
  232. package/.as-test/logs/swar/run.set.spec.ts.log.json +0 -733
  233. package/.as-test/logs/swar/run.staticarray.spec.ts.log.json +0 -931
  234. package/.as-test/logs/swar/run.string.spec.ts.log.json +0 -2289
  235. package/.as-test/logs/swar/run.struct.spec.ts.log.json +0 -523
  236. package/.as-test/logs/swar/run.types.spec.ts.log.json +0 -273
  237. package/.as-test/logs/swar/test.arbitrary.spec.ts.log.json +0 -943
  238. package/.as-test/logs/swar/test.array.spec.ts.log.json +0 -1053
  239. package/.as-test/logs/swar/test.bool.spec.ts.log.json +0 -257
  240. package/.as-test/logs/swar/test.box.spec.ts.log.json +0 -353
  241. package/.as-test/logs/swar/test.custom.spec.ts.log.json +0 -309
  242. package/.as-test/logs/swar/test.date.spec.ts.log.json +0 -397
  243. package/.as-test/logs/swar/test.enum.spec.ts.log.json +0 -343
  244. package/.as-test/logs/swar/test.float.spec.ts.log.json +0 -453
  245. package/.as-test/logs/swar/test.generics.spec.ts.log.json +0 -393
  246. package/.as-test/logs/swar/test.hierarchy.spec.ts.log.json +0 -325
  247. package/.as-test/logs/swar/test.integer.spec.ts.log.json +0 -373
  248. package/.as-test/logs/swar/test.log.json +0 -11371
  249. package/.as-test/logs/swar/test.map.spec.ts.log.json +0 -247
  250. package/.as-test/logs/swar/test.namespace.spec.ts.log.json +0 -361
  251. package/.as-test/logs/swar/test.null.spec.ts.log.json +0 -273
  252. package/.as-test/logs/swar/test.raw.spec.ts.log.json +0 -309
  253. package/.as-test/logs/swar/test.resolving.spec.ts.log.json +0 -273
  254. package/.as-test/logs/swar/test.set.spec.ts.log.json +0 -733
  255. package/.as-test/logs/swar/test.staticarray.spec.ts.log.json +0 -931
  256. package/.as-test/logs/swar/test.string.spec.ts.log.json +0 -2345
  257. package/.as-test/logs/swar/test.struct.spec.ts.log.json +0 -523
  258. package/.as-test/logs/swar/test.types.spec.ts.log.json +0 -273
  259. package/.as-test/logs/test.arbitrary.spec.ts.log.json +0 -943
  260. package/.as-test/logs/test.array.spec.ts.log.json +0 -1053
  261. package/.as-test/logs/test.bool.spec.ts.log.json +0 -257
  262. package/.as-test/logs/test.box.spec.ts.log.json +0 -353
  263. package/.as-test/logs/test.custom.spec.ts.log.json +0 -309
  264. package/.as-test/logs/test.date.spec.ts.log.json +0 -397
  265. package/.as-test/logs/test.enum.spec.ts.log.json +0 -343
  266. package/.as-test/logs/test.float.spec.ts.log.json +0 -453
  267. package/.as-test/logs/test.generics.spec.ts.log.json +0 -393
  268. package/.as-test/logs/test.hierarchy.spec.ts.log.json +0 -325
  269. package/.as-test/logs/test.integer.spec.ts.log.json +0 -373
  270. package/.as-test/logs/test.log.json +0 -11371
  271. package/.as-test/logs/test.map.spec.ts.log.json +0 -247
  272. package/.as-test/logs/test.namespace.spec.ts.log.json +0 -361
  273. package/.as-test/logs/test.null.spec.ts.log.json +0 -273
  274. package/.as-test/logs/test.raw.spec.ts.log.json +0 -309
  275. package/.as-test/logs/test.resolving.spec.ts.log.json +0 -273
  276. package/.as-test/logs/test.set.spec.ts.log.json +0 -733
  277. package/.as-test/logs/test.staticarray.spec.ts.log.json +0 -931
  278. package/.as-test/logs/test.string.spec.ts.log.json +0 -2289
  279. package/.as-test/logs/test.struct.spec.ts.log.json +0 -523
  280. package/.as-test/logs/test.types.spec.ts.log.json +0 -273
  281. package/.as-test/runners/default.bindings.js +0 -68
  282. package/.as-test/runners/default.wasi.js +0 -38
  283. package/ARCHITECTURE.md +0 -323
  284. package/CONTRIBUTING.md +0 -244
  285. package/TODO +0 -1
  286. package/as-test.config.json +0 -40
  287. package/assembly/test.ts +0 -24
  288. package/eslint.config.js +0 -68
  289. package/lib/tsconfig.json +0 -8
  290. package/test.ts +0 -99
  291. package/tools/assemblyscript-eslint-local.js +0 -6
  292. package/tools/assemblyscript-eslint.js +0 -53
  293. package/tools/assemblyscript-prettier-plugin.js +0 -33
  294. package/tools/replacer.js +0 -63
  295. package/transform/tsconfig.json +0 -35
@@ -1,5 +1,6 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
2
  import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
3
+ import { __heap_base } from "memory";
3
4
  import { BACK_SLASH, QUOTE } from "../../custom/chars";
4
5
  import { DESERIALIZE_ESCAPE_TABLE } from "../../globals/tables";
5
6
  import { hex4_to_u16_swar } from "../../util/swar";
@@ -43,7 +44,6 @@ import { hex4_to_u16_swar } from "../../util/swar";
43
44
  // @ts-expect-error: @inline is a valid decorator
44
45
  @inline function copyStringFromSource(srcStart: usize, byteLength: usize): string {
45
46
  if (byteLength == 0) return changetype<string>("");
46
- // @ts-expect-error: __new is a runtime builtin
47
47
  const out = __new(byteLength, idof<string>());
48
48
  memory.copy(out, srcStart, byteLength);
49
49
  return changetype<string>(out);
@@ -53,10 +53,10 @@ import { hex4_to_u16_swar } from "../../util/swar";
53
53
  @inline function deserializeEscapedString_SWAR(payloadStart: usize, escapeStart: usize, srcEnd: usize): string {
54
54
  const srcEnd8 = srcEnd - 8;
55
55
  const prefixLen = <u32>(escapeStart - payloadStart);
56
- bs.offset = bs.buffer;
56
+ const outStart = bs.offset - bs.buffer;
57
57
  bs.ensureSize(<u32>(srcEnd - payloadStart));
58
58
  if (prefixLen != 0) {
59
- memory.copy(bs.buffer, payloadStart, prefixLen);
59
+ memory.copy(bs.offset, payloadStart, prefixLen);
60
60
  bs.offset += prefixLen;
61
61
  }
62
62
 
@@ -141,7 +141,7 @@ import { hex4_to_u16_swar } from "../../util/swar";
141
141
 
142
142
  bs.offset += 2;
143
143
  }
144
- return bs.out<string>();
144
+ return bs.sliceOut<string>(outStart);
145
145
  }
146
146
 
147
147
  export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
@@ -185,106 +185,7 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
185
185
  return copyStringFromSource(payloadStart, srcEnd - payloadStart);
186
186
  }
187
187
 
188
- // /**
189
- // * Deserializes a quoted JSON string into a reused/renewed destination string buffer.
190
- // * @param srcStart pointer to opening quote
191
- // * @param srcEnd pointer to closing quote
192
- // * @param outPtr existing destination string pointer (or 0)
193
- // * @returns next unread source pointer
194
- // */
195
- // export function deserializeString_SWAR_TO(srcStart: usize, srcEnd: usize, outPtr: usize): usize {
196
- // srcStart += 2;
197
- // let dst = outPtr;
198
- // const srcEnd8 = srcEnd - 8;
199
- // const byteSize = srcEnd - srcStart;
200
- // if (!dst) {
201
- // dst = __new(byteSize, idof<string>());
202
- // } else if (changetype<OBJECT>(dst - TOTAL_OVERHEAD).rtSize < <u32>byteSize) {
203
- // dst = __renew(dst, byteSize);
204
- // }
205
- // let offset = dst;
206
-
207
- // while (srcStart < srcEnd8) {
208
- // const block = load<u64>(srcStart);
209
- // store<u64>(offset, block);
210
-
211
- // let mask = inline.always(backslash_mask_unsafe(block));
212
-
213
- // if (mask === 0) {
214
- // srcStart += 8;
215
- // offset += 8;
216
- // continue;
217
- // }
218
-
219
- // do {
220
- // const laneIdx = usize(ctz(mask) >> 3); // 0 2 4 6
221
- // mask &= mask - 1;
222
- // const srcIdx = srcStart + laneIdx;
223
- // const dstIdx = offset + laneIdx;
224
- // const header = load<u32>(srcIdx);
225
- // const code = <u16>(header >> 16);
226
-
227
- // if ((header & 0xffff) !== 0x5c) continue;
228
-
229
- // if (code !== 0x75) {
230
- // const escaped = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
231
- // mask &= mask - usize(escaped === 0x5c);
232
- // store<u16>(dstIdx, escaped);
233
- // const copyStart = srcIdx + 4;
234
- // if (copyStart < srcEnd) {
235
- // const copyBytes = min<usize>(4, srcEnd - copyStart);
236
- // memory.copy(dstIdx + 2, copyStart, copyBytes);
237
- // }
238
-
239
- // const l6 = usize(laneIdx === 6);
240
- // offset -= (1 - l6) << 1;
241
- // srcStart += l6 << 1;
242
- // continue;
243
- // }
244
-
245
- // const block = load<u64>(srcIdx, 4); // XXXX
246
- // const escaped = hex4_to_u16_swar(block);
247
- // store<u16>(dstIdx, escaped);
248
- // srcStart += 4 + laneIdx;
249
- // offset -= 6 - laneIdx;
250
- // } while (mask !== 0);
251
-
252
- // offset += 8;
253
- // srcStart += 8;
254
- // }
255
-
256
- // while (srcStart < srcEnd) {
257
- // const block = load<u16>(srcStart);
258
- // store<u16>(offset, block);
259
- // srcStart += 2;
260
-
261
- // if (block !== 0x5c) {
262
- // offset += 2;
263
- // continue;
264
- // }
265
-
266
- // const code = load<u16>(srcStart);
267
- // if (code !== 0x75) {
268
- // const block = load<u16>(srcStart);
269
- // const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
270
- // store<u16>(offset, escape);
271
- // srcStart += 2;
272
- // } else {
273
- // const block = load<u64>(srcStart, 2); // XXXX
274
- // const escaped = hex4_to_u16_swar(block);
275
- // store<u16>(offset, escaped);
276
- // srcStart += 10;
277
- // }
278
-
279
- // offset += 2;
280
- // }
281
- // if (offset - dst != byteSize) {
282
- // dst = __renew(dst, offset - dst);
283
- // }
284
- // return srcEnd + 2;
285
- // }
286
-
287
- // Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
188
+ // Writes into the destination field, reusing or resizing the backing string.
288
189
  // @ts-expect-error: @inline is a valid decorator
289
190
  @inline function writeStringToField(dstFieldPtr: usize, srcStart: usize, byteLength: u32): void {
290
191
  if (byteLength == 0) {
@@ -294,11 +195,13 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
294
195
 
295
196
  const current = load<usize>(dstFieldPtr);
296
197
  let stringPtr: usize;
297
- if (current != 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);
198
+ if (current >= __heap_base) {
199
+ if (changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
200
+ stringPtr = current;
201
+ } else {
202
+ stringPtr = __renew(current, byteLength);
203
+ store<usize>(dstFieldPtr, stringPtr);
204
+ }
302
205
  } else {
303
206
  stringPtr = __new(byteLength, idof<string>());
304
207
  store<usize>(dstFieldPtr, stringPtr);
@@ -306,17 +209,14 @@ export function deserializeString_SWAR(srcStart: usize, srcEnd: usize): string {
306
209
  memory.copy(stringPtr, srcStart, byteLength);
307
210
  }
308
211
 
309
- /*
310
- export function deserializeStringField_SWAR<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
311
- if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
312
212
 
313
- const payloadStart = srcStart + 2;
314
- const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
315
- srcStart = payloadStart;
213
+ // @ts-expect-error: @inline is a valid decorator
214
+ @inline function deserializeEscapedStringContinuation_SWAR(lastPtr: usize, srcStart: usize, srcEnd: usize, dstFieldPtr: usize, outStart: usize): usize {
215
+ const srcEnd8 = srcEnd - 8;
316
216
 
317
217
  while (srcStart <= srcEnd8) {
218
+ const blockStart = srcStart;
318
219
  let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
319
-
320
220
  if (mask === 0) {
321
221
  srcStart += 8;
322
222
  continue;
@@ -324,290 +224,89 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
324
224
 
325
225
  do {
326
226
  const laneIdx = usize(ctz(mask) >> 3);
327
- mask &= ~(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.
227
+ mask &= mask - 1;
329
228
  const srcIdx = srcStart + laneIdx;
330
229
  const char = load<u16>(srcIdx);
331
-
332
230
  if (char == QUOTE) {
333
- writeStringToField(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
231
+ const runLen = <u32>(srcIdx - lastPtr);
232
+ if (runLen != 0) {
233
+ memory.copy(bs.offset, lastPtr, runLen);
234
+ bs.offset += runLen;
235
+ }
236
+ bs.toField(outStart, dstFieldPtr);
334
237
  return srcIdx + 2;
335
238
  }
336
239
  if (char != BACK_SLASH) continue;
337
240
 
338
- 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;
241
+ const runLen = <u32>(srcIdx - lastPtr);
242
+ if (runLen != 0) {
243
+ memory.copy(bs.offset, lastPtr, runLen);
244
+ bs.offset += runLen;
344
245
  }
345
246
 
346
247
  const chunk = load<u32>(srcIdx);
347
248
  const code = <u16>(chunk >> 16);
348
-
349
249
  if (code !== 0x75) {
350
250
  store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
351
251
  bs.offset += 2;
352
- 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;
252
+ lastPtr = srcIdx + 4;
440
253
  } else {
441
254
  store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
442
255
  bs.offset += 2;
443
- 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;
256
+ lastPtr = srcIdx + 12;
531
257
  }
258
+ srcStart = lastPtr;
259
+ break;
532
260
  } while (mask !== 0);
261
+
262
+ if (srcStart == blockStart) srcStart += 8;
533
263
  }
534
264
 
535
265
  while (srcStart < srcEnd) {
536
266
  const char = load<u16>(srcStart);
537
267
  if (char == QUOTE) {
538
- writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
268
+ const runLen = <u32>(srcStart - lastPtr);
269
+ if (runLen != 0) {
270
+ memory.copy(bs.offset, lastPtr, runLen);
271
+ bs.offset += runLen;
272
+ }
273
+ bs.toField(outStart, dstFieldPtr);
539
274
  return srcStart + 2;
540
275
  }
541
- if (char == 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
- }
276
+ if (char != BACK_SLASH) {
277
+ srcStart += 2;
278
+ continue;
279
+ }
549
280
 
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
- }
281
+ const runLen = <u32>(srcStart - lastPtr);
282
+ if (runLen != 0) {
283
+ memory.copy(bs.offset, lastPtr, runLen);
284
+ bs.offset += runLen;
285
+ }
579
286
 
580
- 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;
287
+ const code = load<u16>(srcStart, 2);
288
+ if (code !== 0x75) {
289
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
290
+ bs.offset += 2;
291
+ srcStart += 4;
292
+ } else {
293
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
294
+ bs.offset += 2;
295
+ srcStart += 12;
599
296
  }
600
- srcStart += 2;
297
+ lastPtr = srcStart;
601
298
  }
602
299
 
300
+ bs.offset = bs.buffer + outStart;
301
+ abort("Unterminated string literal");
603
302
  return srcStart;
604
303
  }
605
- */
606
304
 
305
+ // Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
607
306
  // @ts-expect-error: @inline is a valid decorator
608
- @inline function deserializeEscapedStringScan_SWAR(payloadStart: usize, escapeStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
307
+ @inline function deserializeEscapedStringScan_SWAR_SplitTuned(payloadStart: usize, escapeStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
609
308
  const prefixLen = <u32>(escapeStart - payloadStart);
610
- const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
309
+ const srcEnd8 = srcEnd - 8;
611
310
  bs.offset = bs.buffer;
612
311
  bs.ensureSize(<u32>(srcEnd - payloadStart));
613
312
  if (prefixLen != 0) {
@@ -699,7 +398,6 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
699
398
  bs.offset += 2;
700
399
  srcStart += 12;
701
400
  }
702
-
703
401
  lastPtr = srcStart;
704
402
  }
705
403
 
@@ -708,12 +406,189 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
708
406
  return srcStart;
709
407
  }
710
408
 
711
- // Scans a quoted string value, writes into the destination field, and returns next unread src pointer.
409
+ // @ts-expect-error: @inline is a valid decorator
410
+ @inline function deserializeEscapedStringContinuation_SWAR_MergedTuned(lastPtr: usize, srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
411
+ const srcEnd8 = srcEnd - 8;
412
+
413
+ while (srcStart <= srcEnd8) {
414
+ const blockStart = srcStart;
415
+ let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
416
+ if (mask === 0) {
417
+ srcStart += 8;
418
+ continue;
419
+ }
420
+
421
+ do {
422
+ const laneIdx = usize(ctz(mask) >> 3);
423
+ mask &= mask - 1;
424
+ const srcIdx = srcStart + laneIdx;
425
+ const char = load<u16>(srcIdx);
426
+ if (char == QUOTE) {
427
+ const runLen = <u32>(srcIdx - lastPtr);
428
+ if (runLen != 0) {
429
+ memory.copy(bs.offset, lastPtr, runLen);
430
+ bs.offset += runLen;
431
+ }
432
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
433
+ bs.offset = bs.buffer;
434
+ return srcIdx + 2;
435
+ }
436
+ if (char != BACK_SLASH) continue;
437
+
438
+ const runLen = <u32>(srcIdx - lastPtr);
439
+ if (runLen != 0) {
440
+ memory.copy(bs.offset, lastPtr, runLen);
441
+ bs.offset += runLen;
442
+ }
443
+
444
+ const chunk = load<u32>(srcIdx);
445
+ const code = <u16>(chunk >> 16);
446
+ if (code !== 0x75) {
447
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
448
+ bs.offset += 2;
449
+ lastPtr = srcIdx + 4;
450
+ } else {
451
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
452
+ bs.offset += 2;
453
+ lastPtr = srcIdx + 12;
454
+ }
455
+ srcStart = lastPtr;
456
+ break;
457
+ } while (mask !== 0);
458
+
459
+ if (srcStart == blockStart) srcStart += 8;
460
+ }
461
+
462
+ while (srcStart < srcEnd) {
463
+ const tailChar = load<u16>(srcStart);
464
+ if (tailChar == QUOTE) {
465
+ const runLen = <u32>(srcStart - lastPtr);
466
+ if (runLen != 0) {
467
+ memory.copy(bs.offset, lastPtr, runLen);
468
+ bs.offset += runLen;
469
+ }
470
+ writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
471
+ bs.offset = bs.buffer;
472
+ return srcStart + 2;
473
+ }
474
+ if (tailChar != BACK_SLASH) {
475
+ srcStart += 2;
476
+ continue;
477
+ }
478
+
479
+ const runLen = <u32>(srcStart - lastPtr);
480
+ if (runLen != 0) {
481
+ memory.copy(bs.offset, lastPtr, runLen);
482
+ bs.offset += runLen;
483
+ }
484
+ const tailCode = load<u16>(srcStart, 2);
485
+ if (tailCode !== 0x75) {
486
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + tailCode));
487
+ bs.offset += 2;
488
+ srcStart += 4;
489
+ } else {
490
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
491
+ bs.offset += 2;
492
+ srcStart += 12;
493
+ }
494
+ lastPtr = srcStart;
495
+ }
496
+
497
+ bs.offset = bs.buffer;
498
+ return srcStart;
499
+ }
500
+
501
+ function deserializeStringField_SWAR_MergedTuned(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
502
+ if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
503
+
504
+ const payloadStart = srcStart + 2;
505
+ const srcEnd8 = srcEnd - 8;
506
+ srcStart = payloadStart;
507
+
508
+ while (srcStart <= srcEnd8) {
509
+ let mask = inline.always(backslash_or_quote_mask(load<u64>(srcStart)));
510
+ if (mask === 0) {
511
+ srcStart += 8;
512
+ continue;
513
+ }
514
+
515
+ do {
516
+ const laneIdx = usize(ctz(mask) >> 3);
517
+ mask &= ~(0xffff << (laneIdx << 3));
518
+ const srcIdx = srcStart + laneIdx;
519
+ const char = load<u16>(srcIdx);
520
+
521
+ if (char == QUOTE) {
522
+ writeStringToField(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
523
+ return srcIdx + 2;
524
+ }
525
+ if (char != BACK_SLASH) continue;
526
+
527
+ bs.offset = bs.buffer;
528
+ bs.ensureSize(<u32>(srcEnd - payloadStart));
529
+ const prefixLen = <u32>(srcIdx - payloadStart);
530
+ if (prefixLen != 0) {
531
+ memory.copy(bs.buffer, payloadStart, prefixLen);
532
+ bs.offset += prefixLen;
533
+ }
534
+
535
+ const chunk = load<u32>(srcIdx);
536
+ const code = <u16>(chunk >> 16);
537
+ let lastPtr: usize;
538
+ if (code !== 0x75) {
539
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
540
+ bs.offset += 2;
541
+ lastPtr = srcIdx + 4;
542
+ } else {
543
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcIdx, 4)));
544
+ bs.offset += 2;
545
+ lastPtr = srcIdx + 12;
546
+ }
547
+ return inline.always(deserializeEscapedStringContinuation_SWAR_MergedTuned(lastPtr, lastPtr, srcEnd, dstFieldPtr));
548
+ } while (mask !== 0);
549
+
550
+ srcStart += 8;
551
+ }
552
+
553
+ while (srcStart < srcEnd) {
554
+ const char = load<u16>(srcStart);
555
+ if (char == QUOTE) {
556
+ writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
557
+ return srcStart + 2;
558
+ }
559
+ if (char == BACK_SLASH) {
560
+ bs.offset = bs.buffer;
561
+ bs.ensureSize(<u32>(srcEnd - payloadStart));
562
+ const prefixLen = <u32>(srcStart - payloadStart);
563
+ if (prefixLen != 0) {
564
+ memory.copy(bs.buffer, payloadStart, prefixLen);
565
+ bs.offset += prefixLen;
566
+ }
567
+
568
+ const code = load<u16>(srcStart, 2);
569
+ let lastPtr: usize;
570
+ if (code !== 0x75) {
571
+ store<u16>(bs.offset, load<u16>(DESERIALIZE_ESCAPE_TABLE + code));
572
+ bs.offset += 2;
573
+ lastPtr = srcStart + 4;
574
+ } else {
575
+ store<u16>(bs.offset, hex4_to_u16_swar(load<u64>(srcStart, 4)));
576
+ bs.offset += 2;
577
+ lastPtr = srcStart + 12;
578
+ }
579
+ return inline.always(deserializeEscapedStringContinuation_SWAR_MergedTuned(lastPtr, lastPtr, srcEnd, dstFieldPtr));
580
+ }
581
+ srcStart += 2;
582
+ }
583
+
584
+ return srcStart;
585
+ }
586
+
712
587
  export function deserializeStringField_SWAR<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
713
588
  if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
714
589
 
715
590
  const payloadStart = srcStart + 2;
716
- const srcEnd8 = srcEnd >= 8 ? srcEnd - 8 : 0;
591
+ const srcEnd8 = srcEnd - 8;
717
592
  srcStart = payloadStart;
718
593
 
719
594
  while (srcStart <= srcEnd8) {
@@ -733,8 +608,7 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
733
608
  return srcIdx + 2;
734
609
  }
735
610
  if (char != BACK_SLASH) continue;
736
-
737
- return deserializeEscapedStringScan_SWAR(payloadStart, srcIdx, srcEnd, dstFieldPtr);
611
+ return inline.always(deserializeEscapedStringScan_SWAR_SplitTuned(payloadStart, srcIdx, srcEnd, dstFieldPtr));
738
612
  } while (mask !== 0);
739
613
 
740
614
  srcStart += 8;
@@ -747,7 +621,7 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
747
621
  return srcStart + 2;
748
622
  }
749
623
  if (char == BACK_SLASH) {
750
- return deserializeEscapedStringScan_SWAR(payloadStart, srcStart, srcEnd, dstFieldPtr);
624
+ return inline.always(deserializeEscapedStringScan_SWAR_SplitTuned(payloadStart, srcStart, srcEnd, dstFieldPtr));
751
625
  }
752
626
  srcStart += 2;
753
627
  }
@@ -756,6 +630,7 @@ export function deserializeStringField_SWAR<T extends string | null>(srcStart: u
756
630
  return srcStart;
757
631
  }
758
632
 
633
+
759
634
  /**
760
635
  * Computes a per-byte mask identifying ASCII backslash or quote bytes.
761
636
  *