@scriptc/compiler 0.2.6 → 0.2.7

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 (368) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +5 -18
  2. package/dist/backend/cycle-analysis.d.ts +21 -9
  3. package/dist/backend/cycle-analysis.js +139 -67
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +283 -3
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +39 -0
  8. package/dist/backend/cycle-mutability.js +205 -0
  9. package/dist/backend/cycle-mutability.js.map +1 -0
  10. package/dist/backend/link-plan-core.d.ts +2 -1
  11. package/dist/backend/link-plan-core.js +15 -3
  12. package/dist/backend/link-plan-core.js.map +1 -1
  13. package/dist/backend/link-plan.d.ts +2 -1
  14. package/dist/backend/link-plan.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +40 -0
  16. package/dist/backend/llvm/alloc.js +205 -0
  17. package/dist/backend/llvm/alloc.js.map +1 -0
  18. package/dist/backend/llvm/alloc.test.d.ts +1 -0
  19. package/dist/backend/llvm/alloc.test.js +102 -0
  20. package/dist/backend/llvm/alloc.test.js.map +1 -0
  21. package/dist/backend/llvm/call-lifetimes.d.ts +15 -3
  22. package/dist/backend/llvm/call-lifetimes.js +42 -18
  23. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  24. package/dist/backend/llvm/call-lifetimes.test.js +170 -0
  25. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  26. package/dist/backend/llvm/classes.d.ts +4 -1
  27. package/dist/backend/llvm/classes.js +35 -32
  28. package/dist/backend/llvm/classes.js.map +1 -1
  29. package/dist/backend/llvm/classes.test.js +36 -3
  30. package/dist/backend/llvm/classes.test.js.map +1 -1
  31. package/dist/backend/llvm/common.d.ts +13 -0
  32. package/dist/backend/llvm/common.js +30 -0
  33. package/dist/backend/llvm/common.js.map +1 -1
  34. package/dist/backend/llvm/constant-callbacks.d.ts +19 -3
  35. package/dist/backend/llvm/constant-callbacks.js +289 -52
  36. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  37. package/dist/backend/llvm/constant-callbacks.test.js +140 -3
  38. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  39. package/dist/backend/llvm/dense-array-access.d.ts +29 -0
  40. package/dist/backend/llvm/dense-array-access.js +335 -0
  41. package/dist/backend/llvm/dense-array-access.js.map +1 -0
  42. package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
  43. package/dist/backend/llvm/dense-array-access.test.js +149 -0
  44. package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
  45. package/dist/backend/llvm/dyn.d.ts +34 -0
  46. package/dist/backend/llvm/dyn.js +189 -1
  47. package/dist/backend/llvm/dyn.js.map +1 -1
  48. package/dist/backend/llvm/emitter.d.ts +124 -4
  49. package/dist/backend/llvm/emitter.js +623 -105
  50. package/dist/backend/llvm/emitter.js.map +1 -1
  51. package/dist/backend/llvm/emitter.test.js +68 -6
  52. package/dist/backend/llvm/emitter.test.js.map +1 -1
  53. package/dist/backend/llvm/expr-async.js +58 -4
  54. package/dist/backend/llvm/expr-async.js.map +1 -1
  55. package/dist/backend/llvm/expr-async.test.d.ts +1 -0
  56. package/dist/backend/llvm/expr-async.test.js +62 -0
  57. package/dist/backend/llvm/expr-async.test.js.map +1 -0
  58. package/dist/backend/llvm/expr-calls.js +64 -6
  59. package/dist/backend/llvm/expr-calls.js.map +1 -1
  60. package/dist/backend/llvm/expr-containers.js +16 -5
  61. package/dist/backend/llvm/expr-containers.js.map +1 -1
  62. package/dist/backend/llvm/expr-control.js +92 -2
  63. package/dist/backend/llvm/expr-control.js.map +1 -1
  64. package/dist/backend/llvm/expr-dispatch.js +2 -0
  65. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  66. package/dist/backend/llvm/expr-dynamic.js +174 -25
  67. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  68. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  69. package/dist/backend/llvm/expr-primitives.js +52 -24
  70. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  71. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  72. package/dist/backend/llvm/expr-records.js +3 -3
  73. package/dist/backend/llvm/expr-records.js.map +1 -1
  74. package/dist/backend/llvm/expr-stream-bridges.js +59 -2
  75. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  76. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  77. package/dist/backend/llvm/integer-remainder.d.ts +11 -0
  78. package/dist/backend/llvm/integer-remainder.js +91 -0
  79. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  80. package/dist/backend/llvm/layouts.d.ts +2 -1
  81. package/dist/backend/llvm/layouts.js +3 -2
  82. package/dist/backend/llvm/layouts.js.map +1 -1
  83. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  84. package/dist/backend/llvm/lazy-captures.js +96 -0
  85. package/dist/backend/llvm/lazy-captures.js.map +1 -0
  86. package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
  87. package/dist/backend/llvm/lazy-captures.test.js +78 -0
  88. package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
  89. package/dist/backend/llvm/lib-filesystem.js +3 -4
  90. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  91. package/dist/backend/llvm/local-array-reads.d.ts +5 -1
  92. package/dist/backend/llvm/local-array-reads.js +78 -17
  93. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  94. package/dist/backend/llvm/local-array-reads.test.js +78 -1
  95. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  96. package/dist/backend/llvm/local-union-storage.d.ts +5 -1
  97. package/dist/backend/llvm/local-union-storage.js +48 -6
  98. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  99. package/dist/backend/llvm/local-union-storage.test.js +91 -4
  100. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  101. package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
  102. package/dist/backend/llvm/nullable-fields.d.ts +28 -0
  103. package/dist/backend/llvm/nullable-fields.js +45 -0
  104. package/dist/backend/llvm/nullable-fields.js.map +1 -0
  105. package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
  106. package/dist/backend/llvm/nullable-fields.test.js +48 -0
  107. package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
  108. package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
  109. package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
  110. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
  111. package/dist/backend/llvm/shapes.d.ts +69 -2
  112. package/dist/backend/llvm/shapes.js +259 -27
  113. package/dist/backend/llvm/shapes.js.map +1 -1
  114. package/dist/backend/llvm/shapes.test.js +114 -5
  115. package/dist/backend/llvm/shapes.test.js.map +1 -1
  116. package/dist/backend/llvm/stack-callbacks.js +2 -3
  117. package/dist/backend/llvm/stack-callbacks.js.map +1 -1
  118. package/dist/backend/llvm/stack-captures.d.ts +3 -1
  119. package/dist/backend/llvm/stack-captures.js +5 -3
  120. package/dist/backend/llvm/stack-captures.js.map +1 -1
  121. package/dist/backend/llvm/stack-unions.test.js +38 -1
  122. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  123. package/dist/backend/llvm/string-construction.test.js +1 -1
  124. package/dist/backend/llvm/string-key-hash.d.ts +8 -0
  125. package/dist/backend/llvm/string-key-hash.js +59 -0
  126. package/dist/backend/llvm/string-key-hash.js.map +1 -0
  127. package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
  128. package/dist/backend/llvm/string-key-hash.test.js +34 -0
  129. package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
  130. package/dist/backend/llvm/string-lifetimes.test.js +41 -4
  131. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  132. package/dist/backend/llvm/switch-dispatch.js +1 -1
  133. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  134. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  135. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  136. package/dist/backend/may-throw.js +3 -0
  137. package/dist/backend/may-throw.js.map +1 -1
  138. package/dist/backend/may-throw.test.js +1 -1
  139. package/dist/backend/native/cache-warm.d.ts +2 -1
  140. package/dist/backend/native/cache-warm.js.map +1 -1
  141. package/dist/backend/native/contracts.d.ts +3 -2
  142. package/dist/backend/native/contracts.js.map +1 -1
  143. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  144. package/dist/backend/native/runtime-inputs.js +1 -0
  145. package/dist/backend/native/runtime-inputs.js.map +1 -1
  146. package/dist/backend/native-codegen-core.d.ts +2 -1
  147. package/dist/backend/native-codegen-core.js.map +1 -1
  148. package/dist/backend/native-codegen.d.ts +5 -0
  149. package/dist/backend/native-codegen.js +4 -0
  150. package/dist/backend/native-codegen.js.map +1 -1
  151. package/dist/backend/native-codegen.test.js +23 -0
  152. package/dist/backend/native-codegen.test.js.map +1 -1
  153. package/dist/backend/native-link-info-core.d.ts +3 -2
  154. package/dist/backend/native-link-info-core.js.map +1 -1
  155. package/dist/backend/native-link-info.d.ts +2 -1
  156. package/dist/backend/native-link-info.js.map +1 -1
  157. package/dist/backend/native-link-info.test.js +2 -2
  158. package/dist/backend/native-link-info.test.js.map +1 -1
  159. package/dist/backend/native-tools.d.ts +3 -1
  160. package/dist/backend/native-tools.js +0 -1
  161. package/dist/backend/native-tools.js.map +1 -1
  162. package/dist/backend/optimization.d.ts +25 -0
  163. package/dist/backend/optimization.js +21 -0
  164. package/dist/backend/optimization.js.map +1 -0
  165. package/dist/backend/optimization.test.d.ts +1 -0
  166. package/dist/backend/optimization.test.js +24 -0
  167. package/dist/backend/optimization.test.js.map +1 -0
  168. package/dist/backend/runtime-abi.d.ts +2 -2
  169. package/dist/backend/runtime-abi.js +2 -2
  170. package/dist/backend/runtime-pack-core.d.ts +15 -4
  171. package/dist/backend/runtime-pack-core.js +23 -12
  172. package/dist/backend/runtime-pack-core.js.map +1 -1
  173. package/dist/backend/runtime-pack-native.d.ts +7 -3
  174. package/dist/backend/runtime-pack-native.js +0 -3
  175. package/dist/backend/runtime-pack-native.js.map +1 -1
  176. package/dist/backend/runtime-pack-targets.test.js +1 -1
  177. package/dist/backend/runtime-pack.d.ts +20 -2
  178. package/dist/backend/runtime-pack.js +23 -0
  179. package/dist/backend/runtime-pack.js.map +1 -1
  180. package/dist/backend/runtime-pack.test.js +115 -2
  181. package/dist/backend/runtime-pack.test.js.map +1 -1
  182. package/dist/backend/target-diagnostics.test.js +1 -1
  183. package/dist/backend/targets.d.ts +2 -1
  184. package/dist/backend/targets.js +1 -1
  185. package/dist/backend/targets.js.map +1 -1
  186. package/dist/cli/command.js +5 -4
  187. package/dist/cli/command.js.map +1 -1
  188. package/dist/cli/host.d.ts +2 -1
  189. package/dist/cli/usage.d.ts +1 -1
  190. package/dist/cli/usage.js +5 -2
  191. package/dist/cli/usage.js.map +1 -1
  192. package/dist/compile-types.d.ts +5 -2
  193. package/dist/diagnostics/diagnostic.js +10 -8
  194. package/dist/diagnostics/diagnostic.js.map +1 -1
  195. package/dist/executable/executable-cache.d.ts +2 -2
  196. package/dist/executable/executable-cache.js +7 -4
  197. package/dist/executable/executable-cache.js.map +1 -1
  198. package/dist/executable/executable-cache.test.js +20 -0
  199. package/dist/executable/executable-cache.test.js.map +1 -1
  200. package/dist/frontend/lowering/abstract-equality.js +5 -49
  201. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  202. package/dist/frontend/lowering/array-values.d.ts +23 -0
  203. package/dist/frontend/lowering/array-values.js +129 -0
  204. package/dist/frontend/lowering/array-values.js.map +1 -1
  205. package/dist/frontend/lowering/builtins/errors.js +17 -2
  206. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/process.d.ts +6 -17
  208. package/dist/frontend/lowering/builtins/process.js +56 -29
  209. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  210. package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
  211. package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
  212. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
  213. package/dist/frontend/lowering/class-assertions.d.ts +4 -0
  214. package/dist/frontend/lowering/class-assertions.js +12 -4
  215. package/dist/frontend/lowering/class-assertions.js.map +1 -1
  216. package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
  217. package/dist/frontend/lowering/class-callbacks.js +18 -5
  218. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  219. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
  220. package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
  221. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  222. package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
  223. package/dist/frontend/lowering/class-method-mutations.js +472 -0
  224. package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
  225. package/dist/frontend/lowering/class-method-values.js +25 -5
  226. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  227. package/dist/frontend/lowering/class-prototypes.js +8 -2
  228. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  229. package/dist/frontend/lowering/class-unions.d.ts +16 -0
  230. package/dist/frontend/lowering/class-unions.js +127 -0
  231. package/dist/frontend/lowering/class-unions.js.map +1 -0
  232. package/dist/frontend/lowering/coercions/builders.js +8 -1
  233. package/dist/frontend/lowering/coercions/builders.js.map +1 -1
  234. package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
  235. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  236. package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
  237. package/dist/frontend/lowering/coercions/identity.js +26 -0
  238. package/dist/frontend/lowering/coercions/identity.js.map +1 -0
  239. package/dist/frontend/lowering/coercions/structural.js +9 -6
  240. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  241. package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
  242. package/dist/frontend/lowering/collection-narrowing.js +31 -0
  243. package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
  244. package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
  245. package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
  246. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
  247. package/dist/frontend/lowering/containers/array-callbacks.d.ts +1 -1
  248. package/dist/frontend/lowering/containers/array-callbacks.js +363 -49
  249. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  250. package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
  251. package/dist/frontend/lowering/containers/array-concat.js +130 -0
  252. package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
  253. package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
  254. package/dist/frontend/lowering/containers/array-construction.js +95 -3
  255. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  256. package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
  257. package/dist/frontend/lowering/containers/array-methods.js +43 -132
  258. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  259. package/dist/frontend/lowering/containers/collection-methods.js +10 -1
  260. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  261. package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
  262. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  263. package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
  264. package/dist/frontend/lowering/cycle-initialization.js +277 -0
  265. package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
  266. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
  267. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  268. package/dist/frontend/lowering/expressions/object-literals.js +138 -32
  269. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  270. package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
  271. package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
  272. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  273. package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
  274. package/dist/frontend/lowering/iterator-adapters.js +605 -0
  275. package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
  276. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  277. package/dist/frontend/lowering/lower-array-sort.js +44 -5
  278. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  279. package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
  280. package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
  281. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
  282. package/dist/frontend/lowering/lower-assert.js +7 -0
  283. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  284. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  285. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  286. package/dist/frontend/lowering/lower-calls.d.ts +3 -3
  287. package/dist/frontend/lowering/lower-calls.js +162 -121
  288. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  289. package/dist/frontend/lowering/lower-classes.d.ts +2 -0
  290. package/dist/frontend/lowering/lower-classes.js +45 -43
  291. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  292. package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
  293. package/dist/frontend/lowering/lower-exprs.js +390 -157
  294. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  295. package/dist/frontend/lowering/lower-functions.js +32 -19
  296. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  297. package/dist/frontend/lowering/lower-inspect.js +26 -2
  298. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  299. package/dist/frontend/lowering/lower-modules.js +10 -2
  300. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  301. package/dist/frontend/lowering/lower-stmts.js +46 -58
  302. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  303. package/dist/frontend/lowering/lowerer.d.ts +37 -0
  304. package/dist/frontend/lowering/lowerer.js +283 -18
  305. package/dist/frontend/lowering/lowerer.js.map +1 -1
  306. package/dist/frontend/lowering/native-ffi.js +3 -1
  307. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  308. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
  309. package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
  310. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
  311. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  312. package/dist/frontend/lowering/strict-equality.d.ts +9 -0
  313. package/dist/frontend/lowering/strict-equality.js +116 -0
  314. package/dist/frontend/lowering/strict-equality.js.map +1 -0
  315. package/dist/frontend/lowering/surfaces.js +3 -0
  316. package/dist/frontend/lowering/surfaces.js.map +1 -1
  317. package/dist/frontend/lowering/union-comparison.d.ts +5 -0
  318. package/dist/frontend/lowering/union-comparison.js +47 -0
  319. package/dist/frontend/lowering/union-comparison.js.map +1 -0
  320. package/dist/frontend/program.d.ts +38 -2
  321. package/dist/frontend/program.js +440 -59
  322. package/dist/frontend/program.js.map +1 -1
  323. package/dist/frontend/program.test.js +59 -6
  324. package/dist/frontend/program.test.js.map +1 -1
  325. package/dist/frontend/type-mapper.d.ts +1 -1
  326. package/dist/frontend/type-mapper.js +89 -14
  327. package/dist/frontend/type-mapper.js.map +1 -1
  328. package/dist/frontend/type-mapper.test.js +15 -3
  329. package/dist/frontend/type-mapper.test.js.map +1 -1
  330. package/dist/index.js +25 -9
  331. package/dist/index.js.map +1 -1
  332. package/dist/ir/analysis.d.ts +3 -1
  333. package/dist/ir/analysis.js +4 -0
  334. package/dist/ir/analysis.js.map +1 -1
  335. package/dist/ir/builtin-signatures.js +2 -3
  336. package/dist/ir/builtin-signatures.js.map +1 -1
  337. package/dist/ir/constant-tables.test.js +1 -1
  338. package/dist/ir/initializer-bindings.test.js +1 -1
  339. package/dist/ir/ir.d.ts +78 -15
  340. package/dist/ir/ir.js +20 -6
  341. package/dist/ir/ir.js.map +1 -1
  342. package/dist/ir/scalar-records.test.js +1 -1
  343. package/dist/ir/serialize.d.ts +1 -1
  344. package/dist/ir/serialize.js +3 -3
  345. package/dist/ir/serialize.js.map +1 -1
  346. package/dist/ir/traverse.js +8 -0
  347. package/dist/ir/traverse.js.map +1 -1
  348. package/dist/ir/validate.js +118 -20
  349. package/dist/ir/validate.js.map +1 -1
  350. package/dist/ir/validate.test.js +269 -8
  351. package/dist/ir/validate.test.js.map +1 -1
  352. package/dist/library/fence-eval.test.js +1 -1
  353. package/dist/library/int-infer.test.js +4 -4
  354. package/dist/library/library-cache.test.js +5 -5
  355. package/dist/library/library-profile.d.ts +2 -1
  356. package/dist/library/library-profile.js +4 -3
  357. package/dist/library/library-profile.js.map +1 -1
  358. package/dist/native/compiler.js.map +1 -1
  359. package/dist/native/compiler.test.js +2 -2
  360. package/dist/native/library.d.ts +2 -1
  361. package/dist/native/library.js.map +1 -1
  362. package/dist/native/prepare.js +27 -3
  363. package/dist/native/prepare.js.map +1 -1
  364. package/dist/native/sanitizer.d.ts +3 -2
  365. package/dist/native/sanitizer.js +3 -13
  366. package/dist/native/sanitizer.js.map +1 -1
  367. package/package.json +20 -20
  368. package/surface-manifest.json +8 -2
@@ -22,6 +22,8 @@ export declare const DYN_KIND: {
22
22
  * unit instances (undefined-armed dynCheck targets build them). */
23
23
  export interface DynHost extends WalkerHost {
24
24
  unitInstanceRef(unionId: string, tag: number): string;
25
+ /** The immortal ABSENT field-slot state of an undefined-armed union. */
26
+ absentInstanceRef(unionId: string): string;
25
27
  liveDynRefAdapter(t: IrType): {
26
28
  snapshot: string;
27
29
  commit: string;
@@ -82,6 +84,19 @@ export declare class LlDyn {
82
84
  private undef;
83
85
  /** scr_dyn_obj_get with a compile-time key: borrowed member or null. */
84
86
  private objGetLit;
87
+ /** Branches past the caller's next emission when an undefined-armed
88
+ * field value is the ABSENT state. Returns the label the caller must branch
89
+ * to and start after its emission, or null when the type has no
90
+ * undefined arm. */
91
+ private skipIfAbsent;
92
+ /** A checked undefined-armed field value, or the field's ABSENT state
93
+ * when the value is undefined because the source object has no own
94
+ * property of that name (a missing JSON key stays missing; an explicit
95
+ * undefined stays present). Proxy sources answer through their reads, so
96
+ * they count as present. The checked value is a +1 union; replacing it
97
+ * with the immortal absent instance releases nothing (unit instances are
98
+ * immortal too). */
99
+ private presenceOf;
85
100
  /** Ordinary property lookup, including inherited data and accessors (+1). */
86
101
  private objReadLit;
87
102
  /** Appends a borrowed string, preserving its full byte length. */
@@ -99,6 +114,25 @@ export declare class LlDyn {
99
114
  private typedRefMatches;
100
115
  /** `sc_dm_<n>(ptr d) -> i1` — does this dyn fit T? Never throws. */
101
116
  dynMatchHelper(t: IrType, preserveRefs?: boolean): string;
117
+ private readonly jsonSchemas;
118
+ private readonly jsonParsers;
119
+ /** Targets the one-pass parser (scr_json_parse_schema) can build
120
+ * directly: number, boolean and string leaves inside arrays and plain
121
+ * records (no tuple, index signature, internal '%' slot or `__proto__`
122
+ * member; 1..64 fields). Everything else keeps the checked-dynamic
123
+ * route alone. */
124
+ private jsonSchemaSupported;
125
+ /** The ScrJsonSchema constant for t (scr_runtime.h layout). Records list
126
+ * fields in declaration order — the order JSON.stringify writes — so the
127
+ * runtime's next-field guess usually matches without a scan. */
128
+ private jsonSchema;
129
+ /** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
130
+ * is not a schema target. Tries the one-pass schema parser; when it
131
+ * declines (any input the checked route might reject or read
132
+ * differently), runs the checked-dynamic route — scr_json_parse plus the
133
+ * dynCheck builder — which reports the exact error. Returns +1, or null
134
+ * with the pending flag set. */
135
+ jsonParseHelper(t: IrType): string | null;
102
136
  /** `sc_dc_<n>(ptr d, ptr path) -> T` — validate the checked-dynamic tree against T and
103
137
  * BUILD the typed value (+1), or throw the catchable path-annotated
104
138
  * TypeError and return a dummy with the pending flag set. */
@@ -1,5 +1,5 @@
1
1
  import { typedRefConstructor } from "./shapes.js";
2
- import { BYTES_ELEM_NUM, f64Lit } from "./common.js";
2
+ import { BYTES_ELEM_NUM, emitFieldAbsentTest, f64Lit } from "./common.js";
3
3
  import { InternalCompilerError } from "../../errors.js";
4
4
  import { DYN_HANDLE_KINDS, isDynTypedRefType, isRefCounted, typeKey } from "../../ir/ir.js";
5
5
  import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
@@ -254,6 +254,64 @@ export class LlDyn {
254
254
  B.line(`${t} = call ptr @scr_dyn_obj_get(ptr ${d}, ptr ${this.host.cstr(key)}, ${this.S} ${len}) ; .${llvmCommentText(key)}`);
255
255
  return t;
256
256
  }
257
+ /** Branches past the caller's next emission when an undefined-armed
258
+ * field value is the ABSENT state. Returns the label the caller must branch
259
+ * to and start after its emission, or null when the type has no
260
+ * undefined arm. */
261
+ skipIfAbsent(B, value, t) {
262
+ const def = this.host.unionsById.get(t.unionId);
263
+ const utag = def ? def.arms.findIndex((arm) => arm.kind === "undefinedT") : -1;
264
+ if (utag < 0)
265
+ return null;
266
+ const absent = emitFieldAbsentTest(B, value, utag);
267
+ const lSkip = B.newLabel("tdr.absent");
268
+ const lSet = B.newLabel("tdr.set");
269
+ B.condBr(absent, lSkip, lSet);
270
+ B.startBlock(lSet);
271
+ return lSkip;
272
+ }
273
+ /** A checked undefined-armed field value, or the field's ABSENT state
274
+ * when the value is undefined because the source object has no own
275
+ * property of that name (a missing JSON key stays missing; an explicit
276
+ * undefined stays present). Proxy sources answer through their reads, so
277
+ * they count as present. The checked value is a +1 union; replacing it
278
+ * with the immortal absent instance releases nothing (unit instances are
279
+ * immortal too). */
280
+ presenceOf(B, d, key, t, value) {
281
+ const def = this.host.unionsById.get(t.unionId);
282
+ const utag = def ? def.arms.findIndex((arm) => arm.kind === "undefinedT") : -1;
283
+ if (utag < 0)
284
+ return value;
285
+ const tp = B.tmp();
286
+ const tag = B.tmp();
287
+ const isUndef = B.tmp();
288
+ B.line(`${tp} = getelementptr inbounds %ScrUnion, ptr ${value}, i64 0, i32 1`);
289
+ B.line(`${tag} = load i32, ptr ${tp}`);
290
+ B.line(`${isUndef} = icmp eq i32 ${tag}, ${utag}`);
291
+ const kind = this.kindOf(B, d);
292
+ const isObj = B.tmp();
293
+ B.line(`${isObj} = icmp eq i32 ${kind}, ${DYN_KIND.OBJ}`);
294
+ const probe = B.tmp();
295
+ B.line(`${probe} = and i1 ${isUndef}, ${isObj}`);
296
+ const slot = B.slot();
297
+ B.entryAllocas.push(`${slot} = alloca ptr`);
298
+ B.line(`store ptr ${value}, ptr ${slot}`);
299
+ const lProbe = B.newLabel("dcr.has");
300
+ const lJoin = B.newLabel("dcr.hasj");
301
+ B.condBr(probe, lProbe, lJoin);
302
+ B.startBlock(lProbe);
303
+ const own = this.objGetLit(B, d, key);
304
+ const missing = B.tmp();
305
+ const chosen = B.tmp();
306
+ B.line(`${missing} = icmp eq ptr ${own}, null`);
307
+ B.line(`${chosen} = select i1 ${missing}, ptr ${this.host.absentInstanceRef(t.unionId)}, ptr ${value}`);
308
+ B.line(`store ptr ${chosen}, ptr ${slot}`);
309
+ B.br(lJoin);
310
+ B.startBlock(lJoin);
311
+ const out = B.tmp();
312
+ B.line(`${out} = load ptr, ptr ${slot}`);
313
+ return out;
314
+ }
257
315
  /** Ordinary property lookup, including inherited data and accessors (+1). */
258
316
  objReadLit(B, d, key) {
259
317
  this.host.declare(`declare ptr @scr_dyn_obj_read(ptr, ptr, ${this.S})`);
@@ -676,6 +734,121 @@ export class LlDyn {
676
734
  this.defs.push(`define internal zeroext i1 @${name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
677
735
  return name;
678
736
  }
737
+ /* ── schema-directed JSON.parse ───────────────────────────────── */
738
+ jsonSchemas = new Map();
739
+ jsonParsers = new Map();
740
+ /** Targets the one-pass parser (scr_json_parse_schema) can build
741
+ * directly: number, boolean and string leaves inside arrays and plain
742
+ * records (no tuple, index signature, internal '%' slot or `__proto__`
743
+ * member; 1..64 fields). Everything else keeps the checked-dynamic
744
+ * route alone. */
745
+ jsonSchemaSupported(t, visiting) {
746
+ switch (t.kind) {
747
+ case "f64":
748
+ case "bool":
749
+ case "string":
750
+ return true;
751
+ case "array":
752
+ return this.jsonSchemaSupported(t.elem, visiting);
753
+ case "record": {
754
+ if (visiting.has(t.shapeId))
755
+ return true;
756
+ const shape = this.host.recordsById.get(t.shapeId);
757
+ if (!shape || shape.tuple || shape.indexValue)
758
+ return false;
759
+ if (shape.fields.length === 0 || shape.fields.length > 64)
760
+ return false;
761
+ visiting.add(t.shapeId);
762
+ return shape.fields.every((f) => !f.name.startsWith("%") &&
763
+ f.name !== "__proto__" &&
764
+ this.jsonSchemaSupported(f.type, visiting));
765
+ }
766
+ default:
767
+ return false;
768
+ }
769
+ }
770
+ /** The ScrJsonSchema constant for t (scr_runtime.h layout). Records list
771
+ * fields in declaration order — the order JSON.stringify writes — so the
772
+ * runtime's next-field guess usually matches without a scan. */
773
+ jsonSchema(t) {
774
+ const key = typeKey(t);
775
+ const existing = this.jsonSchemas.get(key);
776
+ if (existing)
777
+ return existing;
778
+ const host = this.host;
779
+ const S = host.sizeType;
780
+ const name = `sc_jsch_${this.jsonSchemas.size}`;
781
+ this.jsonSchemas.set(key, name);
782
+ let body;
783
+ switch (t.kind) {
784
+ case "f64":
785
+ case "bool":
786
+ case "string": {
787
+ const kind = t.kind === "f64" ? 0 : t.kind === "bool" ? 1 : 2;
788
+ body = `${S} ${kind}, ${S} 0, ptr null, ptr null, ptr null, ptr null, ptr null`;
789
+ break;
790
+ }
791
+ case "array": {
792
+ const elem = this.jsonSchema(t.elem);
793
+ const ctor = `${name}_new`;
794
+ this.defs.push(`define internal ptr @${ctor}(${S} %cap) ${FN_ATTRS} {`, `entry:`, ` %a = ${arrNewCall(host, t.elem, "%cap")}`, ` ret ptr %a`, `}`, ``);
795
+ body = `${S} 4, ${S} 0, ptr null, ptr @${elem}, ptr null, ptr @${ctor}, ptr ${vAdapters(host, t).release}`;
796
+ break;
797
+ }
798
+ case "record": {
799
+ const shape = host.recordsById.get(t.shapeId);
800
+ if (!shape)
801
+ throw new InternalCompilerError(`llvm emitter bug: JSON schema of unknown shape ${t.shapeId}`);
802
+ const struct = mangleRecordStruct(t.shapeId);
803
+ const index = new Map(shape.fields.map((f, i) => [f.name, i + 1]));
804
+ const order = [...(shape.declaredOrder ?? []).filter((n) => index.has(n))];
805
+ for (const f of shape.fields)
806
+ if (!order.includes(f.name))
807
+ order.push(f.name);
808
+ const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
809
+ const entries = order.map((fieldName) => {
810
+ const field = shape.fields[index.get(fieldName) - 1];
811
+ const sub = this.jsonSchema(field.type);
812
+ const offset = `ptrtoint (ptr getelementptr (%${struct}, ptr null, i64 0, i32 ${index.get(fieldName)}) to ${S})`;
813
+ return `${fieldTy} { ptr ${host.cstr(fieldName)}, ${S} ${Buffer.byteLength(fieldName, "utf8")}, ${S} ${offset}, ptr @${sub} }`;
814
+ });
815
+ const fields = `${name}_fields`;
816
+ this.defs.push(`@${fields} = internal constant [${entries.length} x ${fieldTy}] [${entries.join(", ")}]`, ``);
817
+ body = `${S} 3, ${S} ${entries.length}, ptr @${fields}, ptr null, ptr @${mangleRecordNew(t.shapeId)}, ptr null, ptr ${vAdapters(host, t).release}`;
818
+ break;
819
+ }
820
+ default:
821
+ throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
822
+ }
823
+ this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr } { ${body} }`, ``);
824
+ return name;
825
+ }
826
+ /** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
827
+ * is not a schema target. Tries the one-pass schema parser; when it
828
+ * declines (any input the checked route might reject or read
829
+ * differently), runs the checked-dynamic route — scr_json_parse plus the
830
+ * dynCheck builder — which reports the exact error. Returns +1, or null
831
+ * with the pending flag set. */
832
+ jsonParseHelper(t) {
833
+ if (t.kind !== "record" && t.kind !== "array")
834
+ return null;
835
+ const key = typeKey(t);
836
+ const existing = this.jsonParsers.get(key);
837
+ if (existing)
838
+ return existing;
839
+ if (!this.jsonSchemaSupported(t, new Set()))
840
+ return null;
841
+ const host = this.host;
842
+ const name = `sc_jp_${this.jsonParsers.size}`;
843
+ this.jsonParsers.set(key, name);
844
+ const schema = this.jsonSchema(t);
845
+ const check = this.dynCheckHelper(t);
846
+ host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
847
+ host.declare(`declare ptr @scr_json_parse(ptr)`);
848
+ host.declare(`declare void @scr_dyn_release(ptr)`);
849
+ this.defs.push(`define internal ptr @${name}(ptr %text) ${FN_ATTRS} { ; JSON.parse as ${llvmCommentText(key)}`, `entry:`, ` %fast = call ptr @scr_json_parse_schema(ptr %text, ptr @${schema})`, ` %hit = icmp ne ptr %fast, null`, ` br i1 %hit, label %done, label %slow`, `done:`, ` ret ptr %fast`, `slow:`, ` %d = call ptr @scr_json_parse(ptr %text)`, ` %bad = icmp eq ptr %d, null`, ` br i1 %bad, label %fail, label %check`, `fail:`, ` ret ptr null`, `check:`, ` %v = call ptr @${check}(ptr %d, ptr null)`, ` call void @scr_dyn_release(ptr %d)`, ` ret ptr %v`, `}`, ``);
850
+ return name;
851
+ }
679
852
  /* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
680
853
  /** `sc_dc_<n>(ptr d, ptr path) -> T` — validate the checked-dynamic tree against T and
681
854
  * BUILD the typed value (+1), or throw the catchable path-annotated
@@ -1147,6 +1320,11 @@ export class LlDyn {
1147
1320
  B.line(`call void @scr_dyn_release(ptr ${m})`);
1148
1321
  storeInto(f.name, f.type, value);
1149
1322
  this.pendingBail(B, "dcr", releaseR, "ptr null");
1323
+ if (f.type.kind === "union") {
1324
+ const stored = this.presenceOf(B, "%d", f.name, f.type, value);
1325
+ if (stored !== value)
1326
+ storeInto(f.name, f.type, stored);
1327
+ }
1150
1328
  }
1151
1329
  // Index-signature shapes CAPTURE undeclared keys into the
1152
1330
  // overflow map.
@@ -1457,6 +1635,10 @@ export class LlDyn {
1457
1635
  B.line(`store ptr ${box}, ptr ${capp}`);
1458
1636
  const rd = this.retainDyn(B, "%d");
1459
1637
  B.line(`call void @scr_box_set_ref(ptr ${box}, ptr ${rd})`);
1638
+ // The shim is the same JS function under another signature: it
1639
+ // takes the boxed closure's identity (kept alive through caps[0]).
1640
+ host.declare(`declare void @scr_dyn_adopt_identity(ptr, ptr)`);
1641
+ B.line(`call void @scr_dyn_adopt_identity(ptr ${a}, ptr %d)`);
1460
1642
  B.terminate(`ret ptr ${a}`);
1461
1643
  break;
1462
1644
  }
@@ -1695,9 +1877,15 @@ export class LlDyn {
1695
1877
  for (const f of dynFields) {
1696
1878
  const klen = Buffer.byteLength(f.name, "utf8");
1697
1879
  const fv = loadFieldOf(f.name, f.type);
1880
+ // An ABSENT optional field contributes no key.
1881
+ const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
1698
1882
  const conv = B.tmp();
1699
1883
  B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
1700
1884
  B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
1885
+ if (lSkip !== null) {
1886
+ B.br(lSkip);
1887
+ B.startBlock(lSkip);
1888
+ }
1701
1889
  }
1702
1890
  if (shape.indexValue) {
1703
1891
  const iv = shape.indexValue;