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
@@ -0,0 +1,307 @@
1
+ import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars";
2
+ import { deserializeIntegerArray_SLOW } from "../../swar/array/integer";
3
+
4
+ const ASCII_LANE_MASK_4: u64 = 0x00ff00ff00ff00ff;
5
+ const ASCII_ZERO_4: u64 = 0x0030003000300030;
6
+
7
+
8
+ @lazy const SPLAT_30 = i16x8.splat(0x30);
9
+
10
+
11
+ @lazy const SPLAT_09 = i16x8.splat(9);
12
+
13
+
14
+ @lazy const ZERO_I16X8 = i16x8.splat(0);
15
+
16
+
17
+ @lazy const ZERO_I32X4 = i32x4.splat(0);
18
+
19
+
20
+ @lazy const PACK_WEIGHTS_10_1 = i8x16(10, 1, 10, 1, 10, 1, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0);
21
+
22
+
23
+ @lazy const PAIR_WEIGHTS_100_1 = i16x8(100, 1, 100, 1, 0, 0, 0, 0);
24
+
25
+
26
+ @inline function pushSignedInteger<T extends number[]>(out: T, value: i64): void {
27
+ if (sizeof<valueof<T>>() == sizeof<i8>()) {
28
+ out.push(<valueof<T>>(<i8>value));
29
+ } else if (sizeof<valueof<T>>() == sizeof<i16>()) {
30
+ out.push(<valueof<T>>(<i16>value));
31
+ } else if (sizeof<valueof<T>>() == sizeof<i32>()) {
32
+ out.push(<valueof<T>>(<i32>value));
33
+ } else if (sizeof<valueof<T>>() == sizeof<isize>()) {
34
+ out.push(<valueof<T>>(<isize>value));
35
+ } else {
36
+ out.push(<valueof<T>>value);
37
+ }
38
+ }
39
+
40
+
41
+ @inline function pushUnsignedInteger<T extends number[]>(out: T, value: u64): void {
42
+ if (sizeof<valueof<T>>() == sizeof<u8>()) {
43
+ out.push(<valueof<T>>(<u8>value));
44
+ } else if (sizeof<valueof<T>>() == sizeof<u16>()) {
45
+ out.push(<valueof<T>>(<u16>value));
46
+ } else if (sizeof<valueof<T>>() == sizeof<u32>()) {
47
+ out.push(<valueof<T>>(<u32>value));
48
+ } else if (sizeof<valueof<T>>() == sizeof<usize>()) {
49
+ out.push(<valueof<T>>(<usize>value));
50
+ } else {
51
+ out.push(<valueof<T>>value);
52
+ }
53
+ }
54
+
55
+
56
+ @inline function storeSignedInteger<T extends number[]>(slot: usize, value: i64): void {
57
+ if (sizeof<valueof<T>>() == sizeof<i8>()) {
58
+ store<i8>(slot, <i8>value);
59
+ } else if (sizeof<valueof<T>>() == sizeof<i16>()) {
60
+ store<i16>(slot, <i16>value);
61
+ } else if (sizeof<valueof<T>>() == sizeof<i32>()) {
62
+ store<i32>(slot, <i32>value);
63
+ } else if (sizeof<valueof<T>>() == sizeof<isize>()) {
64
+ store<isize>(slot, <isize>value);
65
+ } else {
66
+ store<i64>(slot, value);
67
+ }
68
+ }
69
+
70
+
71
+ @inline function storeUnsignedInteger<T extends number[]>(slot: usize, value: u64): void {
72
+ if (sizeof<valueof<T>>() == sizeof<u8>()) {
73
+ store<u8>(slot, <u8>value);
74
+ } else if (sizeof<valueof<T>>() == sizeof<u16>()) {
75
+ store<u16>(slot, <u16>value);
76
+ } else if (sizeof<valueof<T>>() == sizeof<u32>()) {
77
+ store<u32>(slot, <u32>value);
78
+ } else if (sizeof<valueof<T>>() == sizeof<usize>()) {
79
+ store<usize>(slot, <usize>value);
80
+ } else {
81
+ store<u64>(slot, value);
82
+ }
83
+ }
84
+
85
+
86
+ @inline function tryParseEightDigitsSIMD(srcStart: usize, value: u64): u64 {
87
+ const block = load<v128>(srcStart);
88
+ const digits = i16x8.sub(block, SPLAT_30);
89
+ if (v128.any_true(i16x8.gt_u(digits, SPLAT_09))) return 0;
90
+
91
+ const packed = i8x16.narrow_i16x8_u(digits, ZERO_I16X8);
92
+ const products = i16x8.extmul_low_i8x16_u(packed, PACK_WEIGHTS_10_1);
93
+ const pairs = i32x4.extadd_pairwise_i16x8_u(products);
94
+ const pairs16 = i16x8.narrow_i32x4_u(pairs, ZERO_I32X4);
95
+ const groups = i32x4.dot_i16x8_s(pairs16, PAIR_WEIGHTS_100_1);
96
+
97
+ const lo = i32x4.extract_lane(groups, 0);
98
+ const hi = i32x4.extract_lane(groups, 1);
99
+ return value * 100000000 + (<u64>lo * 10000 + <u64>hi);
100
+ }
101
+
102
+
103
+ @inline function parseSignedIntegerSIMD<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
104
+ let negative = false;
105
+ let code = load<u16>(srcStart);
106
+ if (code == 45) {
107
+ negative = true;
108
+ srcStart += 2;
109
+ if (srcStart >= srcEnd) return 0;
110
+ code = load<u16>(srcStart);
111
+ }
112
+
113
+ let digit = <u32>code - 48;
114
+ if (digit > 9) return 0;
115
+
116
+ let value: u64 = digit;
117
+ srcStart += 2;
118
+
119
+ while (srcStart + 14 < srcEnd) {
120
+ const next = tryParseEightDigitsSIMD(srcStart, value);
121
+ if (!next) break;
122
+ value = next;
123
+ srcStart += 16;
124
+ }
125
+
126
+ while (srcStart < srcEnd) {
127
+ digit = <u32>load<u16>(srcStart) - 48;
128
+ if (digit > 9) break;
129
+ value = value * 10 + digit;
130
+ srcStart += 2;
131
+ }
132
+
133
+ pushSignedInteger<T>(out, negative ? -(<i64>value) : <i64>value);
134
+ return srcStart;
135
+ }
136
+
137
+
138
+ @inline function parseUnsignedIntegerSIMD<T extends number[]>(srcStart: usize, srcEnd: usize, out: T): usize {
139
+ let digit = <u32>load<u16>(srcStart) - 48;
140
+ if (digit > 9) return 0;
141
+
142
+ let value: u64 = digit;
143
+ srcStart += 2;
144
+
145
+ while (srcStart + 14 < srcEnd) {
146
+ const next = tryParseEightDigitsSIMD(srcStart, value);
147
+ if (!next) break;
148
+ value = next;
149
+ srcStart += 16;
150
+ }
151
+
152
+ while (srcStart < srcEnd) {
153
+ digit = <u32>load<u16>(srcStart) - 48;
154
+ if (digit > 9) break;
155
+ value = value * 10 + digit;
156
+ srcStart += 2;
157
+ }
158
+
159
+ pushUnsignedInteger<T>(out, value);
160
+ return srcStart;
161
+ }
162
+
163
+ // @ts-ignore: Decorator valid here
164
+ export function deserializeIntegerArray_SIMD<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
165
+ const out = changetype<nonnull<T>>(dst || changetype<usize>(instantiate<T>()));
166
+ const originalSrcStart = srcStart;
167
+ const reusableLength = out.length;
168
+
169
+ if (reusableLength != 0) {
170
+ const dataStart = out.dataStart;
171
+ let index = 0;
172
+
173
+ do {
174
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
175
+ srcStart += 2;
176
+ if (srcStart >= srcEnd) break;
177
+ if (load<u16>(srcStart) == BRACKET_RIGHT) {
178
+ out.length = 0;
179
+ return out;
180
+ }
181
+
182
+ if (isSigned<valueof<T>>()) {
183
+ while (srcStart < srcEnd) {
184
+ let negative = false;
185
+ let code = load<u16>(srcStart);
186
+ if (code == 45) {
187
+ negative = true;
188
+ srcStart += 2;
189
+ if (srcStart >= srcEnd) break;
190
+ code = load<u16>(srcStart);
191
+ }
192
+
193
+ let digit = <u32>code - 48;
194
+ if (digit > 9) break;
195
+
196
+ let value: u64 = digit;
197
+ srcStart += 2;
198
+ while (srcStart + 14 < srcEnd) {
199
+ const next = tryParseEightDigitsSIMD(srcStart, value);
200
+ if (!next) break;
201
+ value = next;
202
+ srcStart += 16;
203
+ }
204
+ while (srcStart < srcEnd) {
205
+ digit = <u32>load<u16>(srcStart) - 48;
206
+ if (digit > 9) break;
207
+ value = value * 10 + digit;
208
+ srcStart += 2;
209
+ }
210
+
211
+ if (index >= reusableLength) break;
212
+ storeSignedInteger<T>(dataStart + <usize>index * sizeof<valueof<T>>(), negative ? -(<i64>value) : <i64>value);
213
+ index++;
214
+ if (srcStart >= srcEnd) break;
215
+
216
+ code = load<u16>(srcStart);
217
+ if (code == COMMA) {
218
+ srcStart += 2;
219
+ continue;
220
+ }
221
+ if (code == BRACKET_RIGHT) {
222
+ out.length = index;
223
+ return out;
224
+ }
225
+ break;
226
+ }
227
+ } else {
228
+ while (srcStart < srcEnd) {
229
+ let digit = <u32>load<u16>(srcStart) - 48;
230
+ if (digit > 9) break;
231
+
232
+ let value: u64 = digit;
233
+ srcStart += 2;
234
+ while (srcStart + 14 < srcEnd) {
235
+ const next = tryParseEightDigitsSIMD(srcStart, value);
236
+ if (!next) break;
237
+ value = next;
238
+ srcStart += 16;
239
+ }
240
+ while (srcStart < srcEnd) {
241
+ digit = <u32>load<u16>(srcStart) - 48;
242
+ if (digit > 9) break;
243
+ value = value * 10 + digit;
244
+ srcStart += 2;
245
+ }
246
+
247
+ if (index >= reusableLength) break;
248
+ storeUnsignedInteger<T>(dataStart + <usize>index * sizeof<valueof<T>>(), value);
249
+ index++;
250
+ if (srcStart >= srcEnd) break;
251
+
252
+ const code = load<u16>(srcStart);
253
+ if (code == COMMA) {
254
+ srcStart += 2;
255
+ continue;
256
+ }
257
+ if (code == BRACKET_RIGHT) {
258
+ out.length = index;
259
+ return out;
260
+ }
261
+ break;
262
+ }
263
+ }
264
+ } while (false);
265
+
266
+ srcStart = originalSrcStart;
267
+ }
268
+
269
+ out.length = 0;
270
+
271
+ do {
272
+ if (srcStart >= srcEnd || load<u16>(srcStart) != BRACKET_LEFT) break;
273
+ srcStart += 2;
274
+ if (srcStart >= srcEnd) break;
275
+ if (load<u16>(srcStart) == BRACKET_RIGHT) return out;
276
+
277
+ if (isSigned<valueof<T>>()) {
278
+ while (srcStart < srcEnd) {
279
+ srcStart = parseSignedIntegerSIMD<T>(srcStart, srcEnd, out);
280
+ if (!srcStart || srcStart >= srcEnd) break;
281
+
282
+ const code = load<u16>(srcStart);
283
+ if (code == COMMA) {
284
+ srcStart += 2;
285
+ continue;
286
+ }
287
+ if (code == BRACKET_RIGHT) return out;
288
+ break;
289
+ }
290
+ } else {
291
+ while (srcStart < srcEnd) {
292
+ srcStart = parseUnsignedIntegerSIMD<T>(srcStart, srcEnd, out);
293
+ if (!srcStart || srcStart >= srcEnd) break;
294
+
295
+ const code = load<u16>(srcStart);
296
+ if (code == COMMA) {
297
+ srcStart += 2;
298
+ continue;
299
+ }
300
+ if (code == BRACKET_RIGHT) return out;
301
+ break;
302
+ }
303
+ }
304
+ } while (false);
305
+
306
+ return deserializeIntegerArray_SLOW<T>(originalSrcStart, srcEnd, changetype<usize>(out));
307
+ }
@@ -1,10 +1,15 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
+ import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
3
+ import { QUOTE } from "../../custom/chars";
2
4
  import { BACK_SLASH } from "../../custom/chars";
3
5
  import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables";
4
6
  import { hex4_to_u16_swar } from "../../util/swar";
7
+ import { deserializeStringField_SWAR } from "../swar/string";
5
8
 
6
9
  // @ts-expect-error: @lazy is a valid decorator
7
- @lazy const SPLAT_5C = i16x8.splat(0x5C); // \
10
+ @lazy const SPLAT_5C = i16x8.splat(0x5c); // \
11
+ // @ts-expect-error: @lazy is a valid decorator
12
+ @lazy const SPLAT_22 = i16x8.splat(0x22); // "
8
13
 
9
14
  // Overflow Pattern for Unicode Escapes (READ)
10
15
  // \u0001 0 \u0001__| + 0
@@ -52,20 +57,54 @@ import { hex4_to_u16_swar } from "../../util/swar";
52
57
  // -------\n 14 -------*| + 0
53
58
  // Formula: overflow = lane - 14
54
59
 
55
-
56
60
  /**
57
61
  * Deserializes strings back into into their original form using SIMD operations
58
62
  * @param src string to deserialize
59
63
  * @param dst buffer to write to
60
64
  * @returns number of bytes written
61
65
  */
66
+ // @ts-expect-error: @inline is a valid decorator
67
+ @inline function copyStringFromSource_SIMD(srcStart: usize, byteLength: usize): string {
68
+ if (byteLength == 0) return changetype<string>("");
69
+ // @ts-expect-error: __new is a runtime builtin
70
+ const out = __new(byteLength, idof<string>());
71
+ memory.copy(out, srcStart, byteLength);
72
+ return changetype<string>(out);
73
+ }
74
+
75
+ // @ts-expect-error: @inline is a valid decorator
76
+ @inline function writeStringToField_SIMD(dstFieldPtr: usize, srcStart: usize, byteLength: u32): void {
77
+ if (byteLength == 0) {
78
+ store<usize>(dstFieldPtr, changetype<usize>(""));
79
+ return;
80
+ }
81
+
82
+ const current = load<usize>(dstFieldPtr);
83
+ let stringPtr: usize;
84
+ if (current != 0 && changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
85
+ stringPtr = current;
86
+ } else if (current != 0 && current != changetype<usize>("")) {
87
+ stringPtr = __renew(current, byteLength);
88
+ store<usize>(dstFieldPtr, stringPtr);
89
+ } else {
90
+ stringPtr = __new(byteLength, idof<string>());
91
+ store<usize>(dstFieldPtr, stringPtr);
92
+ }
93
+ memory.copy(stringPtr, srcStart, byteLength);
94
+ }
95
+
62
96
  // todo: optimize and stuff. it works, its not pretty. ideally, i'd like this to be (nearly) branchless
63
- export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
64
- // Strip quotes
65
- srcStart += 2;
66
- srcEnd -= 2;
97
+ // @ts-expect-error: @inline is a valid decorator
98
+ @inline function deserializeEscapedString_SIMD(payloadStart: usize, escapeStart: usize, srcEnd: usize): string {
99
+ const prefixLen = <u32>(escapeStart - payloadStart);
100
+ let srcStart = escapeStart;
67
101
  const srcEnd16 = srcEnd - 16;
68
102
  bs.ensureSize(u32(srcEnd - srcStart));
103
+ bs.offset = bs.buffer;
104
+ if (prefixLen != 0) {
105
+ memory.copy(bs.buffer, payloadStart, prefixLen);
106
+ bs.offset += prefixLen;
107
+ }
69
108
 
70
109
  while (srcStart < srcEnd16) {
71
110
  const block = load<v128>(srcStart);
@@ -96,7 +135,7 @@ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
96
135
  if (code !== 0x75) {
97
136
  // Short escapes (\n \t \" \\)
98
137
  const escaped = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
99
- mask &= mask - i32(escaped === 0x5C);
138
+ mask &= mask - i32(escaped === 0x5c);
100
139
  store<u16>(bs.offset, escaped);
101
140
  store<v128>(bs.offset, load<v128>(srcIdx, 4), 2);
102
141
 
@@ -135,7 +174,7 @@ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
135
174
  srcStart += 2;
136
175
 
137
176
  // Early exit
138
- if (block !== 0x5C) {
177
+ if (block !== 0x5c) {
139
178
  bs.offset += 2;
140
179
  continue;
141
180
  }
@@ -143,8 +182,7 @@ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
143
182
  const code = load<u16>(srcStart);
144
183
  if (code !== 0x75) {
145
184
  // Short escapes (\n \t \" \\)
146
- const block = load<u16>(srcStart);
147
- const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
185
+ const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
148
186
  store<u16>(bs.offset, escape);
149
187
  srcStart += 2;
150
188
  } else {
@@ -159,3 +197,86 @@ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
159
197
 
160
198
  return bs.out<string>();
161
199
  }
200
+
201
+ export function deserializeString_SIMD(srcStart: usize, srcEnd: usize): string {
202
+ // Strip quotes
203
+ srcStart += 2;
204
+ srcEnd -= 2;
205
+ const payloadStart = srcStart;
206
+ const srcEnd16 = srcEnd - 16;
207
+
208
+ while (srcStart < srcEnd16) {
209
+ const block = load<v128>(srcStart);
210
+ const eq5C = i16x8.eq(block, SPLAT_5C);
211
+
212
+ if (!v128.any_true(eq5C)) {
213
+ srcStart += 16;
214
+ continue;
215
+ }
216
+
217
+ const laneIdx = usize(ctz(i16x8.bitmask(eq5C)) << 1);
218
+ return inline.always(deserializeEscapedString_SIMD(payloadStart, srcStart + laneIdx, srcEnd));
219
+ }
220
+
221
+ while (srcStart < srcEnd) {
222
+ if (load<u16>(srcStart) == BACK_SLASH) {
223
+ return inline.always(deserializeEscapedString_SIMD(payloadStart, srcStart, srcEnd));
224
+ }
225
+ srcStart += 2;
226
+ }
227
+
228
+ return copyStringFromSource_SIMD(payloadStart, srcEnd - payloadStart);
229
+ }
230
+
231
+ // @ts-expect-error: @inline is a valid decorator
232
+ @inline export function deserializeStringField_SIMD<T extends string | null>(srcStart: usize, srcEnd: usize, dstFieldPtr: usize): usize {
233
+ if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
234
+
235
+ const quotedStart = srcStart;
236
+ const payloadStart = srcStart + 2;
237
+ const srcEnd16 = srcEnd >= 16 ? srcEnd - 16 : 0;
238
+ srcStart = payloadStart;
239
+
240
+ while (srcStart <= srcEnd16) {
241
+ const block = load<v128>(srcStart);
242
+ let mask = i16x8.bitmask(v128.or(i16x8.eq(block, SPLAT_5C), i16x8.eq(block, SPLAT_22)));
243
+
244
+ if (mask == 0) {
245
+ srcStart += 16;
246
+ continue;
247
+ }
248
+
249
+ do {
250
+ const laneIdx = usize(ctz(mask) << 1);
251
+ mask &= mask - 1;
252
+ const srcIdx = srcStart + laneIdx;
253
+ const char = load<u16>(srcIdx);
254
+
255
+ if (char == QUOTE) {
256
+ writeStringToField_SIMD(dstFieldPtr, payloadStart, <u32>(srcIdx - payloadStart));
257
+ return srcIdx + 2;
258
+ }
259
+
260
+ if (char == BACK_SLASH) {
261
+ return deserializeStringField_SWAR<T>(quotedStart, srcEnd, dstFieldPtr);
262
+ }
263
+ } while (mask != 0);
264
+
265
+ srcStart += 16;
266
+ }
267
+
268
+ while (srcStart < srcEnd) {
269
+ const char = load<u16>(srcStart);
270
+ if (char == QUOTE) {
271
+ writeStringToField_SIMD(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
272
+ return srcStart + 2;
273
+ }
274
+ if (char == BACK_SLASH) {
275
+ return deserializeStringField_SWAR<T>(quotedStart, srcEnd, dstFieldPtr);
276
+ }
277
+ srcStart += 2;
278
+ }
279
+
280
+ abort("Unterminated string literal");
281
+ return srcStart;
282
+ }
@@ -1,7 +1,7 @@
1
1
  import { JSON } from "../..";
2
2
  import { deserializeArray } from "./array";
3
3
  import { deserializeBoolean } from "./bool";
4
- import { deserializeFloat } from "./float";
4
+ import { deserializeFloat } from "../float";
5
5
  import { deserializeString } from "./string";
6
6
  import { deserializeObject } from "./object";
7
7
  import { BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE } from "../../custom/chars";
@@ -20,4 +20,4 @@ export function deserializeArbitrary(srcStart: usize, srcEnd: usize, dst: usize)
20
20
  return value;
21
21
  }
22
22
  return unreachable();
23
- }
23
+ }
@@ -1,6 +1,6 @@
1
1
  import { BACK_SLASH, BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT, CHAR_F, CHAR_N, CHAR_T, COMMA, QUOTE } from "../../../custom/chars";
2
2
  import { JSON } from "../../../";
3
- import { isSpace } from "util/string";
3
+ import { isSpace, scanStringEnd } from "../../../util";
4
4
  import { ptrToStr } from "../../../util/ptrToStr";
5
5
 
6
6
  export function deserializeArbitraryArray(srcStart: usize, srcEnd: usize, dst: usize): JSON.Value[] {
@@ -30,21 +30,11 @@ export function deserializeArbitraryArray(srcStart: usize, srcEnd: usize, dst: u
30
30
  }
31
31
  } else if (code == QUOTE) {
32
32
  lastIndex = srcStart;
33
+ srcStart = scanStringEnd(srcStart, srcEnd);
34
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
35
+ // @ts-ignore: exists
36
+ out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
33
37
  srcStart += 2;
34
- while (srcStart < srcEnd) {
35
- const code = load<u16>(srcStart);
36
- if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
37
- // while (isSpace(load<u16>((srcStart += 2)))) {
38
- // /* empty */
39
- // }
40
- // console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
41
- // @ts-ignore: exists
42
- out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
43
- srcStart += 2;
44
- break;
45
- }
46
- srcStart += 2;
47
- }
48
38
  // console.log("next: " + String.fromCharCode(load<u16>(srcStart)));
49
39
  } else if (code - 48 <= 9 || code == 45) {
50
40
  // console.log("trigger int")
@@ -70,8 +60,8 @@ export function deserializeArbitraryArray(srcStart: usize, srcEnd: usize, dst: u
70
60
  if (code == BRACE_RIGHT) {
71
61
  if (--depth == 0) {
72
62
  // @ts-ignore: type
73
- out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart));
74
- // console.log("Value (object): " + ptrToStr(lastIndex, srcStart));
63
+ out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
64
+ // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
75
65
  while (isSpace(load<u16>((srcStart += 2)))) {
76
66
  /* empty */
77
67
  }
@@ -86,11 +76,14 @@ export function deserializeArbitraryArray(srcStart: usize, srcEnd: usize, dst: u
86
76
  srcStart += 2;
87
77
  while (srcStart < srcEnd) {
88
78
  const code = load<u16>(srcStart);
89
- if (code == BRACKET_RIGHT) {
79
+ if (code == QUOTE) {
80
+ srcStart = scanStringEnd(srcStart, srcEnd);
81
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
82
+ } else if (code == BRACKET_RIGHT) {
90
83
  if (--depth == 0) {
91
84
  // @ts-ignore: type
92
- out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart));
93
- // console.log("Value (array): " + ptrToStr(lastIndex, srcStart));
85
+ out.push(JSON.__deserialize<JSON.Value>(lastIndex, srcStart + 2));
86
+ // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
94
87
  while (isSpace(load<u16>((srcStart += 2)))) {
95
88
  /* empty */
96
89
  }
@@ -1,4 +1,4 @@
1
- import { isSpace } from "../../../util";
1
+ import { isSpace, isUnescapedQuote, scanStringEnd } from "../../../util";
2
2
  import { COMMA, BRACKET_RIGHT, QUOTE, BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BACK_SLASH, CHAR_T, CHAR_F, CHAR_N } from "../../../custom/chars";
3
3
  import { JSON } from "../../..";
4
4
  import { ptrToStr } from "../../../util/ptrToStr";
@@ -11,22 +11,17 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
11
11
  srcStart += 2;
12
12
  while (srcStart < srcEnd) {
13
13
  let code = load<u16>(srcStart);
14
- if (code == QUOTE) {
14
+ if (code == BRACKET_RIGHT) {
15
+ break;
16
+ } else if (code == COMMA || isSpace(code)) {
17
+ srcStart += 2;
18
+ continue;
19
+ } else if (code == QUOTE) {
15
20
  lastIndex = srcStart;
21
+ srcStart = scanStringEnd(srcStart, srcEnd);
22
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
23
+ out.push(JSON.Raw.from(ptrToStr(lastIndex, srcStart + 2)));
16
24
  srcStart += 2;
17
- while (srcStart < srcEnd) {
18
- code = load<u16>(srcStart);
19
- if (code == QUOTE || isSpace(code)) {
20
- // console.log("Value (string): " + ptrToStr(lastIndex, srcStart));
21
- out.push(JSON.Raw.from(ptrToStr(lastIndex, srcStart + 2)));
22
- // while (isSpace(load<u16>((srcStart += 2)))) {
23
- // /* empty */
24
- // }
25
- srcStart += 4;
26
- break;
27
- }
28
- srcStart += 2;
29
- }
30
25
  } else if (code - 48 <= 9 || code == 45) {
31
26
  lastIndex = srcStart;
32
27
  srcStart += 2;
@@ -47,8 +42,8 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
47
42
  while (srcStart < srcEnd) {
48
43
  const code = load<u16>(srcStart);
49
44
  if (code == QUOTE) {
50
- srcStart += 2;
51
- while (!(load<u16>(srcStart) == QUOTE && load<u16>(srcStart - 2) != BACK_SLASH)) srcStart += 2;
45
+ srcStart = scanStringEnd(srcStart, srcEnd);
46
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
52
47
  } else if (code == BRACE_RIGHT) {
53
48
  if (--depth == 0) {
54
49
  // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
@@ -66,8 +61,8 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
66
61
  while (srcStart < srcEnd) {
67
62
  const code = load<u16>(srcStart);
68
63
  if (code == QUOTE) {
69
- srcStart += 2;
70
- while (!(load<u16>(srcStart) == QUOTE && load<u16>(srcStart - 2) != BACK_SLASH)) srcStart += 2;
64
+ srcStart = scanStringEnd(srcStart, srcEnd);
65
+ if (srcStart >= srcEnd) throw new Error("Unterminated string in JSON array");
71
66
  } else if (code == BRACKET_RIGHT) {
72
67
  if (--depth == 0) {
73
68
  // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
@@ -96,8 +91,6 @@ export function deserializeRawArray(srcStart: usize, srcEnd: usize, dst: usize):
96
91
  out.push(JSON.Raw.from("null"));
97
92
  srcStart += 10;
98
93
  }
99
- } else if (isSpace(code)) {
100
- srcStart += 2;
101
94
  } else {
102
95
  throw new Error("Unexpected character in JSON object '" + String.fromCharCode(code) + "' at position " + (srcEnd - srcStart).toString() + " " + ptrToStr(lastIndex, srcStart + 10));
103
96
  }
@@ -1,5 +1,6 @@
1
1
  import { JSON } from "../../..";
2
- import { BACK_SLASH, QUOTE } from "../../../custom/chars";
2
+ import { QUOTE } from "../../../custom/chars";
3
+ import { isUnescapedQuote } from "../../../util";
3
4
 
4
5
  export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usize): string[] {
5
6
  const out = changetype<string[]>(dst || changetype<usize>(instantiate<string[]>()));
@@ -11,7 +12,7 @@ export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usiz
11
12
  if (!inString) {
12
13
  inString = true;
13
14
  lastPos = srcStart;
14
- } else if (load<u16>(srcStart - 2) != BACK_SLASH) {
15
+ } else if (isUnescapedQuote(srcStart)) {
15
16
  out.push(JSON.__deserialize<string>(lastPos, srcStart + 2));
16
17
  inString = false;
17
18
  }
@@ -10,6 +10,7 @@ import { deserializeStringArray } from "./array/string";
10
10
  import { deserializeObjectArray } from "./array/object";
11
11
  import { deserializeBoxArray } from "./array/box";
12
12
  import { deserializeRawArray } from "./array/raw";
13
+ export { deserializeArrayField, deserializeArrayField as deserializeArrayField_SWAR } from "../swar/array";
13
14
 
14
15
  // @ts-ignore: Decorator valid here
15
16
  export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {