@scriptc/compiler 0.2.5 → 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 (520) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +62 -48
  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/executable-features.js +1 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/link-plan-core.d.ts +4 -1
  13. package/dist/backend/link-plan-core.js +16 -3
  14. package/dist/backend/link-plan-core.js.map +1 -1
  15. package/dist/backend/link-plan.d.ts +3 -1
  16. package/dist/backend/link-plan.js +3 -0
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/alloc.d.ts +40 -0
  19. package/dist/backend/llvm/alloc.js +205 -0
  20. package/dist/backend/llvm/alloc.js.map +1 -0
  21. package/dist/backend/llvm/alloc.test.d.ts +1 -0
  22. package/dist/backend/llvm/alloc.test.js +102 -0
  23. package/dist/backend/llvm/alloc.test.js.map +1 -0
  24. package/dist/backend/llvm/byte-numbers.js +32 -4
  25. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  26. package/dist/backend/llvm/byte-windows.d.ts +31 -0
  27. package/dist/backend/llvm/byte-windows.js +334 -0
  28. package/dist/backend/llvm/byte-windows.js.map +1 -0
  29. package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
  30. package/dist/backend/llvm/byte-windows.test.js +244 -0
  31. package/dist/backend/llvm/byte-windows.test.js.map +1 -0
  32. package/dist/backend/llvm/call-lifetimes.d.ts +17 -5
  33. package/dist/backend/llvm/call-lifetimes.js +58 -24
  34. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  35. package/dist/backend/llvm/call-lifetimes.test.js +170 -0
  36. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  37. package/dist/backend/llvm/classes.d.ts +18 -2
  38. package/dist/backend/llvm/classes.js +115 -41
  39. package/dist/backend/llvm/classes.js.map +1 -1
  40. package/dist/backend/llvm/classes.test.d.ts +1 -0
  41. package/dist/backend/llvm/classes.test.js +132 -0
  42. package/dist/backend/llvm/classes.test.js.map +1 -0
  43. package/dist/backend/llvm/common.d.ts +13 -0
  44. package/dist/backend/llvm/common.js +30 -0
  45. package/dist/backend/llvm/common.js.map +1 -1
  46. package/dist/backend/llvm/constant-callbacks.d.ts +27 -0
  47. package/dist/backend/llvm/constant-callbacks.js +450 -0
  48. package/dist/backend/llvm/constant-callbacks.js.map +1 -0
  49. package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
  50. package/dist/backend/llvm/constant-callbacks.test.js +261 -0
  51. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
  52. package/dist/backend/llvm/dense-array-access.d.ts +29 -0
  53. package/dist/backend/llvm/dense-array-access.js +335 -0
  54. package/dist/backend/llvm/dense-array-access.js.map +1 -0
  55. package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
  56. package/dist/backend/llvm/dense-array-access.test.js +149 -0
  57. package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
  58. package/dist/backend/llvm/dyn.d.ts +35 -1
  59. package/dist/backend/llvm/dyn.js +196 -35
  60. package/dist/backend/llvm/dyn.js.map +1 -1
  61. package/dist/backend/llvm/emitter.d.ts +143 -4
  62. package/dist/backend/llvm/emitter.js +882 -136
  63. package/dist/backend/llvm/emitter.js.map +1 -1
  64. package/dist/backend/llvm/emitter.test.js +82 -14
  65. package/dist/backend/llvm/emitter.test.js.map +1 -1
  66. package/dist/backend/llvm/expr-async.js +58 -4
  67. package/dist/backend/llvm/expr-async.js.map +1 -1
  68. package/dist/backend/llvm/expr-async.test.d.ts +1 -0
  69. package/dist/backend/llvm/expr-async.test.js +62 -0
  70. package/dist/backend/llvm/expr-async.test.js.map +1 -0
  71. package/dist/backend/llvm/expr-bytes.js +11 -0
  72. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  73. package/dist/backend/llvm/expr-calls.js +151 -25
  74. package/dist/backend/llvm/expr-calls.js.map +1 -1
  75. package/dist/backend/llvm/expr-containers.js +37 -14
  76. package/dist/backend/llvm/expr-containers.js.map +1 -1
  77. package/dist/backend/llvm/expr-control.js +92 -2
  78. package/dist/backend/llvm/expr-control.js.map +1 -1
  79. package/dist/backend/llvm/expr-dispatch.js +2 -0
  80. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +210 -28
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  84. package/dist/backend/llvm/expr-primitives.js +58 -23
  85. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  86. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  87. package/dist/backend/llvm/expr-records.js +3 -3
  88. package/dist/backend/llvm/expr-records.js.map +1 -1
  89. package/dist/backend/llvm/expr-stream-bridges.js +59 -2
  90. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  91. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  92. package/dist/backend/llvm/integer-remainder.d.ts +18 -0
  93. package/dist/backend/llvm/integer-remainder.js +117 -0
  94. package/dist/backend/llvm/integer-remainder.js.map +1 -0
  95. package/dist/backend/llvm/layouts.d.ts +2 -1
  96. package/dist/backend/llvm/layouts.js +4 -3
  97. package/dist/backend/llvm/layouts.js.map +1 -1
  98. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  99. package/dist/backend/llvm/lazy-captures.js +96 -0
  100. package/dist/backend/llvm/lazy-captures.js.map +1 -0
  101. package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
  102. package/dist/backend/llvm/lazy-captures.test.js +78 -0
  103. package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
  104. package/dist/backend/llvm/lib-abi.js +7 -0
  105. package/dist/backend/llvm/lib-abi.js.map +1 -1
  106. package/dist/backend/llvm/lib-dispatch.js +7 -22
  107. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  108. package/dist/backend/llvm/lib-filesystem.js +3 -4
  109. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  110. package/dist/backend/llvm/lib-shared.js +15 -0
  111. package/dist/backend/llvm/lib-shared.js.map +1 -1
  112. package/dist/backend/llvm/local-array-reads.d.ts +13 -3
  113. package/dist/backend/llvm/local-array-reads.js +159 -77
  114. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  115. package/dist/backend/llvm/local-array-reads.test.js +105 -4
  116. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  117. package/dist/backend/llvm/local-union-storage.d.ts +5 -1
  118. package/dist/backend/llvm/local-union-storage.js +48 -6
  119. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  120. package/dist/backend/llvm/local-union-storage.test.js +91 -4
  121. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  122. package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
  123. package/dist/backend/llvm/loop-array-borrows.js +70 -0
  124. package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
  125. package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
  126. package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
  127. package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
  128. package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
  129. package/dist/backend/llvm/map-read-lifetimes.js +20 -5
  130. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  131. package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
  132. package/dist/backend/llvm/nullable-fields.d.ts +28 -0
  133. package/dist/backend/llvm/nullable-fields.js +45 -0
  134. package/dist/backend/llvm/nullable-fields.js.map +1 -0
  135. package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
  136. package/dist/backend/llvm/nullable-fields.test.js +48 -0
  137. package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
  138. package/dist/backend/llvm/reference-effects.d.ts +2 -1
  139. package/dist/backend/llvm/reference-effects.js +7 -0
  140. package/dist/backend/llvm/reference-effects.js.map +1 -1
  141. package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
  142. package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
  143. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
  144. package/dist/backend/llvm/shapes.d.ts +73 -3
  145. package/dist/backend/llvm/shapes.js +281 -34
  146. package/dist/backend/llvm/shapes.js.map +1 -1
  147. package/dist/backend/llvm/shapes.test.js +114 -5
  148. package/dist/backend/llvm/shapes.test.js.map +1 -1
  149. package/dist/backend/llvm/split-loops.d.ts +48 -0
  150. package/dist/backend/llvm/split-loops.js +183 -0
  151. package/dist/backend/llvm/split-loops.js.map +1 -0
  152. package/dist/backend/llvm/split.js +0 -7
  153. package/dist/backend/llvm/split.js.map +1 -1
  154. package/dist/backend/llvm/split.test.js +66 -2
  155. package/dist/backend/llvm/split.test.js.map +1 -1
  156. package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
  157. package/dist/backend/llvm/stack-callbacks.js +72 -0
  158. package/dist/backend/llvm/stack-callbacks.js.map +1 -0
  159. package/dist/backend/llvm/stack-captures.d.ts +27 -0
  160. package/dist/backend/llvm/stack-captures.js +152 -0
  161. package/dist/backend/llvm/stack-captures.js.map +1 -0
  162. package/dist/backend/llvm/stack-unions.test.js +38 -1
  163. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  164. package/dist/backend/llvm/string-construction.test.js +1 -1
  165. package/dist/backend/llvm/string-key-hash.d.ts +8 -0
  166. package/dist/backend/llvm/string-key-hash.js +59 -0
  167. package/dist/backend/llvm/string-key-hash.js.map +1 -0
  168. package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
  169. package/dist/backend/llvm/string-key-hash.test.js +34 -0
  170. package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
  171. package/dist/backend/llvm/string-lifetimes.test.js +48 -7
  172. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  173. package/dist/backend/llvm/string-slices.d.ts +20 -0
  174. package/dist/backend/llvm/string-slices.js +87 -0
  175. package/dist/backend/llvm/string-slices.js.map +1 -0
  176. package/dist/backend/llvm/string-slices.test.d.ts +1 -0
  177. package/dist/backend/llvm/string-slices.test.js +98 -0
  178. package/dist/backend/llvm/string-slices.test.js.map +1 -0
  179. package/dist/backend/llvm/switch-dispatch.js +1 -1
  180. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  181. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  182. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  183. package/dist/backend/llvm/walkers.d.ts +4 -14
  184. package/dist/backend/llvm/walkers.js +53 -311
  185. package/dist/backend/llvm/walkers.js.map +1 -1
  186. package/dist/backend/may-throw.js +4 -1
  187. package/dist/backend/may-throw.js.map +1 -1
  188. package/dist/backend/may-throw.test.js +1 -1
  189. package/dist/backend/native/cache-warm.d.ts +2 -1
  190. package/dist/backend/native/cache-warm.js.map +1 -1
  191. package/dist/backend/native/contracts.d.ts +5 -2
  192. package/dist/backend/native/contracts.js.map +1 -1
  193. package/dist/backend/native/executable.js +12 -4
  194. package/dist/backend/native/executable.js.map +1 -1
  195. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  196. package/dist/backend/native/runtime-inputs.js +3 -0
  197. package/dist/backend/native/runtime-inputs.js.map +1 -1
  198. package/dist/backend/native-codegen-core.d.ts +7 -0
  199. package/dist/backend/native-codegen-core.js +21 -0
  200. package/dist/backend/native-codegen-core.js.map +1 -1
  201. package/dist/backend/native-codegen.d.ts +9 -0
  202. package/dist/backend/native-codegen.js +38 -18
  203. package/dist/backend/native-codegen.js.map +1 -1
  204. package/dist/backend/native-codegen.test.js +70 -2
  205. package/dist/backend/native-codegen.test.js.map +1 -1
  206. package/dist/backend/native-link-info-core.d.ts +4 -2
  207. package/dist/backend/native-link-info-core.js.map +1 -1
  208. package/dist/backend/native-link-info.d.ts +2 -1
  209. package/dist/backend/native-link-info.js.map +1 -1
  210. package/dist/backend/native-link-info.test.js +2 -2
  211. package/dist/backend/native-link-info.test.js.map +1 -1
  212. package/dist/backend/native-tools.d.ts +6 -2
  213. package/dist/backend/native-tools.js +6 -5
  214. package/dist/backend/native-tools.js.map +1 -1
  215. package/dist/backend/optimization.d.ts +25 -0
  216. package/dist/backend/optimization.js +21 -0
  217. package/dist/backend/optimization.js.map +1 -0
  218. package/dist/backend/optimization.test.d.ts +1 -0
  219. package/dist/backend/optimization.test.js +24 -0
  220. package/dist/backend/optimization.test.js.map +1 -0
  221. package/dist/backend/runtime-abi.d.ts +2 -2
  222. package/dist/backend/runtime-abi.js +2 -2
  223. package/dist/backend/runtime-pack-core.d.ts +16 -4
  224. package/dist/backend/runtime-pack-core.js +31 -13
  225. package/dist/backend/runtime-pack-core.js.map +1 -1
  226. package/dist/backend/runtime-pack-native.d.ts +7 -3
  227. package/dist/backend/runtime-pack-native.js +0 -3
  228. package/dist/backend/runtime-pack-native.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +41 -4
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.d.ts +20 -2
  232. package/dist/backend/runtime-pack.js +23 -0
  233. package/dist/backend/runtime-pack.js.map +1 -1
  234. package/dist/backend/runtime-pack.test.js +125 -2
  235. package/dist/backend/runtime-pack.test.js.map +1 -1
  236. package/dist/backend/target-diagnostics.test.js +1 -1
  237. package/dist/backend/targets.d.ts +2 -1
  238. package/dist/backend/targets.js +1 -1
  239. package/dist/backend/targets.js.map +1 -1
  240. package/dist/cli/command.js +5 -4
  241. package/dist/cli/command.js.map +1 -1
  242. package/dist/cli/host.d.ts +2 -1
  243. package/dist/cli/usage.d.ts +1 -1
  244. package/dist/cli/usage.js +5 -2
  245. package/dist/cli/usage.js.map +1 -1
  246. package/dist/compile-types.d.ts +5 -2
  247. package/dist/diagnostics/diagnostic.js +10 -8
  248. package/dist/diagnostics/diagnostic.js.map +1 -1
  249. package/dist/executable/executable-cache.d.ts +3 -2
  250. package/dist/executable/executable-cache.js +8 -4
  251. package/dist/executable/executable-cache.js.map +1 -1
  252. package/dist/executable/executable-cache.test.js +35 -0
  253. package/dist/executable/executable-cache.test.js.map +1 -1
  254. package/dist/frontend/fork-target.d.ts +5 -0
  255. package/dist/frontend/fork-target.js +40 -8
  256. package/dist/frontend/fork-target.js.map +1 -1
  257. package/dist/frontend/fork-target.test.d.ts +1 -0
  258. package/dist/frontend/fork-target.test.js +59 -0
  259. package/dist/frontend/fork-target.test.js.map +1 -0
  260. package/dist/frontend/lowering/abstract-equality.js +5 -49
  261. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  262. package/dist/frontend/lowering/array-values.d.ts +23 -0
  263. package/dist/frontend/lowering/array-values.js +129 -0
  264. package/dist/frontend/lowering/array-values.js.map +1 -1
  265. package/dist/frontend/lowering/binding-analysis.js +2 -2
  266. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/atomics.d.ts +2 -11
  268. package/dist/frontend/lowering/builtins/atomics.js +64 -28
  269. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  270. package/dist/frontend/lowering/builtins/errors.js +17 -2
  271. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +3 -0
  273. package/dist/frontend/lowering/builtins/filesystem-calls.js +51 -4
  274. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/module-calls.js +6 -1
  276. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  277. package/dist/frontend/lowering/builtins/process.d.ts +6 -17
  278. package/dist/frontend/lowering/builtins/process.js +56 -29
  279. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
  281. package/dist/frontend/lowering/builtins/workers.js +65 -0
  282. package/dist/frontend/lowering/builtins/workers.js.map +1 -0
  283. package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
  284. package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
  285. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
  286. package/dist/frontend/lowering/class-assertions.d.ts +11 -0
  287. package/dist/frontend/lowering/class-assertions.js +104 -0
  288. package/dist/frontend/lowering/class-assertions.js.map +1 -0
  289. package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
  290. package/dist/frontend/lowering/class-callbacks.js +18 -5
  291. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  292. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
  293. package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
  294. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  295. package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
  296. package/dist/frontend/lowering/class-method-mutations.js +472 -0
  297. package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
  298. package/dist/frontend/lowering/class-method-values.js +25 -5
  299. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  300. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  301. package/dist/frontend/lowering/class-protocols.js +126 -0
  302. package/dist/frontend/lowering/class-protocols.js.map +1 -0
  303. package/dist/frontend/lowering/class-prototypes.js +8 -2
  304. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  305. package/dist/frontend/lowering/class-unions.d.ts +16 -0
  306. package/dist/frontend/lowering/class-unions.js +127 -0
  307. package/dist/frontend/lowering/class-unions.js.map +1 -0
  308. package/dist/frontend/lowering/coercions/builders.js +8 -1
  309. package/dist/frontend/lowering/coercions/builders.js.map +1 -1
  310. package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
  311. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  312. package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
  313. package/dist/frontend/lowering/coercions/identity.js +26 -0
  314. package/dist/frontend/lowering/coercions/identity.js.map +1 -0
  315. package/dist/frontend/lowering/coercions/structural.js +9 -6
  316. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  317. package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
  318. package/dist/frontend/lowering/collection-narrowing.js +31 -0
  319. package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
  320. package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
  321. package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
  322. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
  323. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -12
  324. package/dist/frontend/lowering/containers/array-callbacks.js +415 -136
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
  327. package/dist/frontend/lowering/containers/array-concat.js +130 -0
  328. package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
  329. package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
  330. package/dist/frontend/lowering/containers/array-construction.js +95 -3
  331. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  332. package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
  333. package/dist/frontend/lowering/containers/array-methods.js +43 -132
  334. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  335. package/dist/frontend/lowering/containers/bytes.js +12 -34
  336. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  337. package/dist/frontend/lowering/containers/collection-methods.js +10 -1
  338. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  339. package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
  340. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  341. package/dist/frontend/lowering/containers/string-and-regexp.js +22 -3
  342. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  343. package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
  344. package/dist/frontend/lowering/cycle-initialization.js +277 -0
  345. package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
  346. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
  347. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  348. package/dist/frontend/lowering/expressions/object-literals.js +140 -38
  349. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  350. package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
  351. package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
  352. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  353. package/dist/frontend/lowering/generic-functions.d.ts +2 -5
  354. package/dist/frontend/lowering/generic-functions.js +13 -10
  355. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  356. package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
  357. package/dist/frontend/lowering/instantiation-path.js +10 -0
  358. package/dist/frontend/lowering/instantiation-path.js.map +1 -0
  359. package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
  360. package/dist/frontend/lowering/instantiation-path.test.js +23 -0
  361. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
  362. package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
  363. package/dist/frontend/lowering/iterator-adapters.js +605 -0
  364. package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
  365. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  366. package/dist/frontend/lowering/lower-array-sort.js +44 -5
  367. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  368. package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
  369. package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
  370. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
  371. package/dist/frontend/lowering/lower-assert.js +7 -0
  372. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  373. package/dist/frontend/lowering/lower-builtin-values.js +12 -7
  374. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  375. package/dist/frontend/lowering/lower-calls.d.ts +3 -3
  376. package/dist/frontend/lowering/lower-calls.js +198 -124
  377. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  378. package/dist/frontend/lowering/lower-classes.d.ts +7 -0
  379. package/dist/frontend/lowering/lower-classes.js +166 -96
  380. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  381. package/dist/frontend/lowering/lower-event-emitter.js +1 -1
  382. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  383. package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
  384. package/dist/frontend/lowering/lower-exprs.js +421 -167
  385. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  386. package/dist/frontend/lowering/lower-functions.d.ts +1 -1
  387. package/dist/frontend/lowering/lower-functions.js +33 -20
  388. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  389. package/dist/frontend/lowering/lower-inspect.js +26 -2
  390. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  391. package/dist/frontend/lowering/lower-island.js +1 -1
  392. package/dist/frontend/lowering/lower-island.js.map +1 -1
  393. package/dist/frontend/lowering/lower-modules.d.ts +1 -0
  394. package/dist/frontend/lowering/lower-modules.js +54 -11
  395. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  396. package/dist/frontend/lowering/lower-stmts.js +59 -69
  397. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  398. package/dist/frontend/lowering/lower-stream.js +1 -1
  399. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  400. package/dist/frontend/lowering/lowerer.d.ts +50 -1
  401. package/dist/frontend/lowering/lowerer.js +333 -26
  402. package/dist/frontend/lowering/lowerer.js.map +1 -1
  403. package/dist/frontend/lowering/native-ffi.js +3 -1
  404. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  405. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
  406. package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
  407. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
  408. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  409. package/dist/frontend/lowering/split-consumers.d.ts +7 -0
  410. package/dist/frontend/lowering/split-consumers.js +64 -0
  411. package/dist/frontend/lowering/split-consumers.js.map +1 -0
  412. package/dist/frontend/lowering/strict-equality.d.ts +9 -0
  413. package/dist/frontend/lowering/strict-equality.js +116 -0
  414. package/dist/frontend/lowering/strict-equality.js.map +1 -0
  415. package/dist/frontend/lowering/surfaces.d.ts +3 -4
  416. package/dist/frontend/lowering/surfaces.js +38 -7
  417. package/dist/frontend/lowering/surfaces.js.map +1 -1
  418. package/dist/frontend/lowering/union-comparison.d.ts +5 -0
  419. package/dist/frontend/lowering/union-comparison.js +47 -0
  420. package/dist/frontend/lowering/union-comparison.js.map +1 -0
  421. package/dist/frontend/module-source-candidates.d.ts +10 -0
  422. package/dist/frontend/module-source-candidates.js +40 -0
  423. package/dist/frontend/module-source-candidates.js.map +1 -0
  424. package/dist/frontend/module-source-candidates.test.d.ts +1 -0
  425. package/dist/frontend/module-source-candidates.test.js +53 -0
  426. package/dist/frontend/module-source-candidates.test.js.map +1 -0
  427. package/dist/frontend/pipeline.js +2 -2
  428. package/dist/frontend/pipeline.js.map +1 -1
  429. package/dist/frontend/program-analysis.d.ts +2 -0
  430. package/dist/frontend/program-analysis.js +2 -0
  431. package/dist/frontend/program-analysis.js.map +1 -1
  432. package/dist/frontend/program.d.ts +38 -2
  433. package/dist/frontend/program.js +457 -88
  434. package/dist/frontend/program.js.map +1 -1
  435. package/dist/frontend/program.test.js +59 -6
  436. package/dist/frontend/program.test.js.map +1 -1
  437. package/dist/frontend/ts7/ast-node.js +6 -8
  438. package/dist/frontend/ts7/ast-node.js.map +1 -1
  439. package/dist/frontend/ts7/ast-node.test.js +42 -1
  440. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  441. package/dist/frontend/ts7/ast-wire.d.ts +4 -0
  442. package/dist/frontend/ts7/ast-wire.js +28 -0
  443. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  444. package/dist/frontend/ts7/ast.d.ts +2 -1
  445. package/dist/frontend/ts7/ast.js +8 -4
  446. package/dist/frontend/ts7/ast.js.map +1 -1
  447. package/dist/frontend/ts7/checker.d.ts +8 -2
  448. package/dist/frontend/ts7/checker.js +41 -5
  449. package/dist/frontend/ts7/checker.js.map +1 -1
  450. package/dist/frontend/ts7/checker.test.js +42 -0
  451. package/dist/frontend/ts7/checker.test.js.map +1 -1
  452. package/dist/frontend/ts7/program-host.d.ts +7 -0
  453. package/dist/frontend/ts7/program-host.js +26 -2
  454. package/dist/frontend/ts7/program-host.js.map +1 -1
  455. package/dist/frontend/ts7/program-host.test.js +29 -0
  456. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  457. package/dist/frontend/type-mapper.d.ts +4 -1
  458. package/dist/frontend/type-mapper.js +133 -16
  459. package/dist/frontend/type-mapper.js.map +1 -1
  460. package/dist/frontend/type-mapper.test.js +15 -3
  461. package/dist/frontend/type-mapper.test.js.map +1 -1
  462. package/dist/frontend/worker-target.d.ts +6 -0
  463. package/dist/frontend/worker-target.js +108 -0
  464. package/dist/frontend/worker-target.js.map +1 -0
  465. package/dist/frontend/worker-target.test.d.ts +1 -0
  466. package/dist/frontend/worker-target.test.js +71 -0
  467. package/dist/frontend/worker-target.test.js.map +1 -0
  468. package/dist/index.js +47 -14
  469. package/dist/index.js.map +1 -1
  470. package/dist/ir/analysis.d.ts +3 -1
  471. package/dist/ir/analysis.js +4 -0
  472. package/dist/ir/analysis.js.map +1 -1
  473. package/dist/ir/builtin-effects.js +12 -0
  474. package/dist/ir/builtin-effects.js.map +1 -1
  475. package/dist/ir/builtin-signatures.d.ts +1 -1
  476. package/dist/ir/builtin-signatures.js +15 -15
  477. package/dist/ir/builtin-signatures.js.map +1 -1
  478. package/dist/ir/constant-tables.test.js +1 -1
  479. package/dist/ir/initializer-bindings.test.js +1 -1
  480. package/dist/ir/ir.d.ts +85 -23
  481. package/dist/ir/ir.js +20 -6
  482. package/dist/ir/ir.js.map +1 -1
  483. package/dist/ir/numeric-call-specialization.d.ts +8 -0
  484. package/dist/ir/numeric-call-specialization.js +198 -0
  485. package/dist/ir/numeric-call-specialization.js.map +1 -0
  486. package/dist/ir/runtime-features.js +4 -3
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/scalar-records.test.js +1 -1
  489. package/dist/ir/serialize.d.ts +1 -1
  490. package/dist/ir/serialize.js +3 -3
  491. package/dist/ir/serialize.js.map +1 -1
  492. package/dist/ir/traverse.js +8 -0
  493. package/dist/ir/traverse.js.map +1 -1
  494. package/dist/ir/validate.js +207 -43
  495. package/dist/ir/validate.js.map +1 -1
  496. package/dist/ir/validate.test.js +356 -8
  497. package/dist/ir/validate.test.js.map +1 -1
  498. package/dist/library/fence-eval.test.js +1 -1
  499. package/dist/library/int-infer.test.js +4 -4
  500. package/dist/library/ir-policy.js +2 -0
  501. package/dist/library/ir-policy.js.map +1 -1
  502. package/dist/library/library-cache.test.js +5 -5
  503. package/dist/library/library-profile.d.ts +2 -1
  504. package/dist/library/library-profile.js +4 -3
  505. package/dist/library/library-profile.js.map +1 -1
  506. package/dist/native/compiler.js +24 -11
  507. package/dist/native/compiler.js.map +1 -1
  508. package/dist/native/compiler.test.js +7 -3
  509. package/dist/native/compiler.test.js.map +1 -1
  510. package/dist/native/library.d.ts +2 -1
  511. package/dist/native/library.js.map +1 -1
  512. package/dist/native/prepare.js +29 -3
  513. package/dist/native/prepare.js.map +1 -1
  514. package/dist/native/sanitizer.d.ts +3 -2
  515. package/dist/native/sanitizer.js +3 -13
  516. package/dist/native/sanitizer.js.map +1 -1
  517. package/dist/native/sanitizer.test.js +1 -0
  518. package/dist/native/sanitizer.test.js.map +1 -1
  519. package/package.json +20 -20
  520. package/surface-manifest.json +37 -3
@@ -4,7 +4,7 @@
4
4
  * an ICE that points at source is a gift to whoever debugs it.
5
5
  */
6
6
  import { validByteNumberToken } from "./byte-numbers.js";
7
- import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, islandPromisePayloadTag, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, REF_TRUTHY_KINDS, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, shapeHasAccessorSlots, STRING, typeEquals, typeKey, unionContainerArmsOk, VOID, } from "./ir.js";
7
+ import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, islandPromisePayloadTag, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSortValuesElement, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, REF_TRUTHY_KINDS, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, shapeHasAccessorSlots, STRING, typeEquals, typeKey, unionContainerArmsOk, VOID, } from "./ir.js";
8
8
  import { DYN_CLASS_PROPERTIES } from "./ir.js";
9
9
  import { unionWideningTags } from "./analysis.js";
10
10
  import { alwaysReturns } from "./control-flow.js";
@@ -53,7 +53,20 @@ export function validateModule(mod) {
53
53
  const ffiByName = new Map();
54
54
  const ffiSymbols = new Set();
55
55
  const moduleLoc = { file: mod.sourceFile, start: 0, end: 0 };
56
+ if (mod.workers !== undefined && typeof mod.workers !== "boolean")
57
+ errors.push({ message: "worker execution mode must be a boolean", loc: moduleLoc });
58
+ if (mod.workers && (mod.lib !== undefined || mod.embedded !== undefined))
59
+ errors.push({
60
+ message: "worker execution requires a native static executable",
61
+ loc: moduleLoc,
62
+ });
56
63
  for (const entry of mod.ffiImports ?? []) {
64
+ if (mod.workers &&
65
+ entry.params.some((parameter) => isFfiCallbackParam(parameter) && parameter.callback.invoke === "foreign"))
66
+ errors.push({
67
+ message: "worker execution cannot install foreign-thread callbacks",
68
+ loc: moduleLoc,
69
+ });
57
70
  if (ffiByName.has(entry.name)) {
58
71
  errors.push({ message: `duplicate FFI binding "${entry.name}"`, loc: moduleLoc });
59
72
  }
@@ -473,8 +486,19 @@ export function validateModule(mod) {
473
486
  });
474
487
  }
475
488
  }
476
- // Generic-class instantiations: the named FAMILY exists and is a proper
477
- // ancestor (the class object's interval is read off it — see IrClassDef).
489
+ // Family membership is nominal; an instance may have a separately
490
+ // specialized base. The family's inherited prefix must remain valid.
491
+ const physicalRoot = (cls) => {
492
+ const seen = new Set();
493
+ let current = cls;
494
+ while (current?.base !== undefined) {
495
+ if (seen.has(current.name))
496
+ return undefined;
497
+ seen.add(current.name);
498
+ current = classesByName.get(current.base);
499
+ }
500
+ return current;
501
+ };
478
502
  for (const cls of mod.classes ?? []) {
479
503
  if (cls.genericOf === undefined)
480
504
  continue;
@@ -484,20 +508,23 @@ export function validateModule(mod) {
484
508
  message: `class ${cls.name}: undeclared generic family "${cls.genericOf}"`,
485
509
  loc: cls.loc,
486
510
  });
487
- continue;
488
511
  }
489
- let ancestor = false;
490
- const seen = new Set();
491
- for (let c = cls.base !== undefined ? classesByName.get(cls.base) : undefined; c && !seen.has(c.name); c = c.base !== undefined ? classesByName.get(c.base) : undefined) {
492
- seen.add(c.name);
493
- if (c.name === cls.genericOf) {
494
- ancestor = true;
495
- break;
496
- }
512
+ else if (family === cls || family.genericOf !== undefined) {
513
+ errors.push({
514
+ message: `class ${cls.name}: generic family "${cls.genericOf}" must name an erased declaration`,
515
+ loc: cls.loc,
516
+ });
497
517
  }
498
- if (!ancestor) {
518
+ else if (physicalRoot(cls) !== physicalRoot(family)) {
499
519
  errors.push({
500
- message: `class ${cls.name}: generic family "${cls.genericOf}" is not an ancestor`,
520
+ message: `class ${cls.name}: generic family "${cls.genericOf}" has a different storage root`,
521
+ loc: cls.loc,
522
+ });
523
+ }
524
+ else if (family.fields.some((field, index) => cls.fields[index]?.name !== field.name ||
525
+ !typeEquals(cls.fields[index].type, field.type))) {
526
+ errors.push({
527
+ message: `class ${cls.name}: generic family "${cls.genericOf}" has an incompatible prefix`,
501
528
  loc: cls.loc,
502
529
  });
503
530
  }
@@ -656,9 +683,8 @@ export function validateModule(mod) {
656
683
  }
657
684
  u.arms.forEach((arm, i) => {
658
685
  // The unit kinds (undefinedT/nullT) are valid arms — union membership
659
- // is the ONLY place they may appear. Containers are valid beside
660
- // unit arms: tag tests distinguish absence while the reference
661
- // payload preserves identity. The shared rule refuses data siblings.
686
+ // is the ONLY place they may appear. Container payloads preserve
687
+ // identity; promise data siblings retain their separate fence.
662
688
  if (arm.kind === "void" ||
663
689
  arm.kind === "union" ||
664
690
  arm.kind === "dyn" ||
@@ -667,8 +693,7 @@ export function validateModule(mod) {
667
693
  arm.kind === "generator") {
668
694
  errors.push({ message: `union ${u.id}: arm ${i} is ${arm.kind}`, loc: noLoc });
669
695
  }
670
- if ((arm.kind === "map" || arm.kind === "set" || arm.kind === "promise") &&
671
- !unionContainerArmsOk(u.arms)) {
696
+ if (arm.kind === "promise" && !unionContainerArmsOk(u.arms)) {
672
697
  errors.push({
673
698
  message: `union ${u.id}: ${arm.kind} arm ${i} beside non-unit arms`,
674
699
  loc: noLoc,
@@ -831,11 +856,11 @@ export function validateModule(mod) {
831
856
  }
832
857
  }
833
858
  for (const fn of mod.functions) {
834
- validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors);
859
+ validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors, mod.workers === true);
835
860
  }
836
861
  return errors;
837
862
  }
838
- function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors) {
863
+ function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors, workers) {
839
864
  const locals = new Map(fn.locals.map((l) => [l.id, l]));
840
865
  const err = (message, loc) => errors.push({ message: `in ${fn.name}: ${message}`, loc });
841
866
  const asyncCaches = [
@@ -868,13 +893,37 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
868
893
  if (fn.asyncCycleCacheGlobal !== undefined && fn.asyncCacheGlobal === undefined) {
869
894
  err("an asyncCycleCacheGlobal requires a module asyncCacheGlobal", fn.loc);
870
895
  }
871
- // The class graph's two questions (upcast/downcast/instanceOf/virtualCall
872
- // legality): strict-descendant tests over the base links, and hierarchy
873
- // membership (a class that extends or is extended).
896
+ // Virtual slots and constructor ABIs follow physical inheritance only.
897
+ // Erased family identity does not supply their specialized layout or ABI.
898
+ const isPhysicalSubclass = (sub, sup) => {
899
+ const seen = new Set([sub]);
900
+ for (let c = classes.get(sub)?.base; c !== undefined; c = classes.get(c)?.base) {
901
+ if (seen.has(c))
902
+ return false;
903
+ seen.add(c);
904
+ if (c === sup)
905
+ return true;
906
+ }
907
+ return false;
908
+ };
909
+ // Object casts may also recover an erased family. The module-level
910
+ // prefix check validates the fields exposed by that view.
874
911
  const isStrictSubclass = (sub, sup) => {
875
- for (let c = classes.get(sub); c?.base !== undefined; c = classes.get(c.base)) {
876
- if (c.base === sup)
912
+ const seen = new Set();
913
+ for (let c = classes.get(sub); c; c = c.base === undefined ? undefined : classes.get(c.base)) {
914
+ if (seen.has(c.name))
915
+ return false;
916
+ seen.add(c.name);
917
+ if (c.name !== sub && c.name === sup)
877
918
  return true;
919
+ const families = new Set();
920
+ for (let family = c.genericOf === undefined ? undefined : classes.get(c.genericOf); family; family = family.base === undefined ? undefined : classes.get(family.base)) {
921
+ if (families.has(family.name))
922
+ return false;
923
+ families.add(family.name);
924
+ if (family.name === sup)
925
+ return true;
926
+ }
878
927
  }
879
928
  return false;
880
929
  };
@@ -901,7 +950,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
901
950
  if (declared) {
902
951
  // Preserve class-table order when choosing an abstract slot's ABI.
903
952
  for (const c of classValidation.implementations.get(method) ?? []) {
904
- if (!isStrictSubclass(c.name, className))
953
+ if (!isPhysicalSubclass(c.name, className))
905
954
  continue;
906
955
  hasOverride = true;
907
956
  implementation ??= functions.get(`%${c.name}.${method}`);
@@ -924,16 +973,16 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
924
973
  if (isUnitType(fn.returnType)) {
925
974
  err(`return type is bare unit type ${fn.returnType.kind}`, fn.loc);
926
975
  }
927
- // Exception snapshots may be captured, but are never public parameters
928
- // or return values. Their payload crosses those boundaries explicitly.
976
+ // Exception snapshots may be captured or passed to internal conversion
977
+ // helpers. They are not source-level types and never return as values.
929
978
  if (fn.returnType.kind === "caught")
930
979
  err("return type is caught", fn.loc);
931
980
  for (const p of fn.params) {
981
+ if (p.type.kind === "caught" && fn.name !== "%caught.dynamicValue")
982
+ err(`param "${p.name}" is caught-typed`, fn.loc);
932
983
  if (!locals.has(p.localId)) {
933
984
  err(`param "${p.name}" has no local entry "${p.localId}"`, fn.loc);
934
985
  }
935
- if (p.type.kind === "caught")
936
- err(`param "${p.name}" is caught-typed`, fn.loc);
937
986
  }
938
987
  for (const c of [...(fn.captures ?? []), ...(fn.classCaptures ?? [])]) {
939
988
  const local = locals.get(c.localId);
@@ -1090,6 +1139,23 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
1090
1139
  }
1091
1140
  // Keep expression families in separate functions so native bootstrap builds
1092
1141
  // do not feed LLVM a single control-flow graph containing every IR check.
1142
+ /** fieldAbsent nodes that sit directly in a field-slot write (a
1143
+ * recordLit field, recordSet value, recordClone override, or a ternary
1144
+ * arm in one of those positions) — the only places the absent state may
1145
+ * appear. */
1146
+ const fieldSlotValues = new Set();
1147
+ function checkSlotValue(e) {
1148
+ const mark = (v) => {
1149
+ if (v.kind === "fieldAbsent")
1150
+ fieldSlotValues.add(v);
1151
+ else if (v.kind === "ternary") {
1152
+ mark(v.then);
1153
+ mark(v.else_);
1154
+ }
1155
+ };
1156
+ mark(e);
1157
+ checkExpr(e);
1158
+ }
1093
1159
  function checkExpr(e) {
1094
1160
  switch (e.kind) {
1095
1161
  case "numLit":
@@ -1162,6 +1228,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
1162
1228
  case "recordKeyGet":
1163
1229
  case "recordOvfHas":
1164
1230
  case "recordOvfKeys":
1231
+ case "recordHas":
1232
+ case "fieldAbsent":
1165
1233
  return checkRecordExpr(e);
1166
1234
  case "dynFrom":
1167
1235
  case "dynFromJsval":
@@ -1409,6 +1477,12 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
1409
1477
  allowed.add("throw");
1410
1478
  allowed.add("runtimeFence");
1411
1479
  }
1480
+ if (e.diverges) {
1481
+ const last = e.stmts[e.stmts.length - 1];
1482
+ if (last?.kind !== "runtimeFence")
1483
+ err("diverging seqExpr must end in a runtimeFence", e.loc);
1484
+ allowed.add("runtimeFence");
1485
+ }
1412
1486
  const flat = (ss) => {
1413
1487
  for (const s of ss) {
1414
1488
  if (!allowed.has(s.kind)) {
@@ -2047,7 +2121,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2047
2121
  ? { argTypes: [STRING], result: STRING }
2048
2122
  : e.method === "slice"
2049
2123
  ? { argTypes: [F64, F64], result: e.receiver.type }
2050
- : e.method === "toReversed"
2124
+ : e.method === "toReversed" ||
2125
+ e.method === "sortPrimitive" ||
2126
+ e.method === "toSortedPrimitive"
2051
2127
  ? { argTypes: [], result: e.receiver.type }
2052
2128
  : e.method === "reverse"
2053
2129
  ? { argTypes: [], result: e.receiver.type }
@@ -2071,7 +2147,27 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2071
2147
  ? { argTypes: [e.type], result: e.type }
2072
2148
  : e.method === "shift"
2073
2149
  ? { argTypes: [], result: e.type } // union-checked below
2074
- : { argTypes: [], result: F64 }; // length
2150
+ : e.method === "sortValues"
2151
+ ? { argTypes: [F64, null], result: VOID }
2152
+ : { argTypes: [], result: F64 }; // length
2153
+ if ((e.method === "sortPrimitive" || e.method === "toSortedPrimitive") &&
2154
+ elem.kind !== "string" &&
2155
+ elem.kind !== "f64" &&
2156
+ elem.kind !== "bool") {
2157
+ err(`arrIntrinsic ${e.method} requires primitive elements, got ${elem.kind}`, e.loc);
2158
+ }
2159
+ if (e.method === "sortValues") {
2160
+ const arms = elem.kind === "union" ? unions.get(elem.unionId)?.arms : undefined;
2161
+ if (!isSortValuesElement(elem, arms))
2162
+ err(`arrIntrinsic sortValues on ${elem.kind} elements`, e.loc);
2163
+ const cmp = e.args[1]?.type;
2164
+ if (!cmp ||
2165
+ cmp.kind !== "func" ||
2166
+ cmp.params.length > 2 ||
2167
+ !cmp.params.every((param) => typeEquals(param, elem)) ||
2168
+ cmp.ret.kind !== "f64")
2169
+ err("arrIntrinsic sortValues comparator must be (elem, elem) => number", e.loc);
2170
+ }
2075
2171
  if (e.method === "getNumber" && elem.kind !== "f64") {
2076
2172
  err(`arrIntrinsic getNumber requires f64 elements, got ${elem.kind}`, e.loc);
2077
2173
  }
@@ -2354,6 +2450,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2354
2450
  break;
2355
2451
  }
2356
2452
  const wantCaps = target.captures ?? [];
2453
+ if (e.adapts === true && locals.get(e.captures[0] ?? "")?.type.kind !== "func") {
2454
+ err(`closure ${e.fnName}: an adapter's first capture must be a function`, e.loc);
2455
+ }
2357
2456
  if (target.captures === undefined && e.captures.length > 0) {
2358
2457
  err(`closure over plain function "${e.fnName}" cannot capture`, e.loc);
2359
2458
  }
@@ -2503,9 +2602,23 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2503
2602
  // exactly when D strictly descends from C AND the two completed
2504
2603
  // constructor ABIs agree (what newValue completion rests on).
2505
2604
  checkExpr(e.value);
2605
+ if (e.kind === "upcast" && e.type.kind === "func" && e.value.type.kind === "func") {
2606
+ const source = e.value.type;
2607
+ const target = e.type;
2608
+ if (source.rest !== target.rest ||
2609
+ source.restAbi !== target.restAbi ||
2610
+ source.argumentsAll !== target.argumentsAll ||
2611
+ source.params.length !== target.params.length ||
2612
+ !source.params.every((param, i) => typeEquals(param, target.params[i])) ||
2613
+ source.ret.kind !== "object" ||
2614
+ target.ret.kind !== "object" ||
2615
+ !isStrictSubclass(source.ret.className, target.ret.className))
2616
+ err("function upcast requires identical parameters and a covariant class return", e.loc);
2617
+ break;
2618
+ }
2506
2619
  if (e.kind === "upcast" && e.type.kind === "classval" && e.value.type.kind === "classval") {
2507
2620
  const [sub, sup] = [e.value.type.className, e.type.className];
2508
- if (!isStrictSubclass(sub, sup)) {
2621
+ if (!isPhysicalSubclass(sub, sup)) {
2509
2622
  err(`upcast: "${sub}" does not extend "${sup}"`, e.loc);
2510
2623
  break;
2511
2624
  }
@@ -2670,7 +2783,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2670
2783
  if (p)
2671
2784
  expectType(a, p.type, `virtualCall ${e.className}.${e.method} arg ${i}`);
2672
2785
  });
2673
- if (!typeEquals(e.type, callSiteReturnType(impl))) {
2786
+ const returned = callSiteReturnType(impl);
2787
+ if (!typeEquals(e.type, returned) &&
2788
+ !(e.type.kind === "object" &&
2789
+ returned.kind === "object" &&
2790
+ isStrictSubclass(returned.className, e.type.className))) {
2674
2791
  err(`virtualCall ${e.className}.${e.method} result type mismatch`, e.loc);
2675
2792
  }
2676
2793
  break;
@@ -2696,7 +2813,10 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2696
2813
  const want = recordValidation.get(shape.id).initializationFields;
2697
2814
  const seen = new Set();
2698
2815
  for (const f of e.fields) {
2699
- checkExpr(f.value);
2816
+ if (f.drop || f.overflow)
2817
+ checkExpr(f.value);
2818
+ else
2819
+ checkSlotValue(f.value);
2700
2820
  if (seen.has(f.name))
2701
2821
  err(`recordLit initializes field "${f.name}" twice`, e.loc);
2702
2822
  seen.add(f.name);
@@ -2756,7 +2876,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2756
2876
  const want = recordValidation.get(shape.id).initializationFields;
2757
2877
  const seen = new Set();
2758
2878
  for (const f of e.overrides) {
2759
- checkExpr(f.value);
2879
+ checkSlotValue(f.value);
2760
2880
  if (seen.has(f.name))
2761
2881
  err(`recordClone overrides field "${f.name}" twice`, e.loc);
2762
2882
  seen.add(f.name);
@@ -2768,6 +2888,30 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
2768
2888
  }
2769
2889
  break;
2770
2890
  }
2891
+ case "recordHas": {
2892
+ checkExpr(e.obj);
2893
+ const shape = records.get(e.shapeId);
2894
+ if (!shape)
2895
+ err(`recordHas on undeclared shape "${e.shapeId}"`, e.loc);
2896
+ else if (!recordValidation.get(e.shapeId)?.fields.has(e.field))
2897
+ err(`shape ${e.shapeId} has no field "${e.field}"`, e.loc);
2898
+ expectType(e.obj, { kind: "record", shapeId: e.shapeId }, "recordHas receiver");
2899
+ if (e.type.kind !== "bool")
2900
+ err("recordHas must be bool", e.loc);
2901
+ break;
2902
+ }
2903
+ case "fieldAbsent": {
2904
+ const def = unions.get(e.unionId);
2905
+ if (!def)
2906
+ err(`fieldAbsent of undeclared union "${e.unionId}"`, e.loc);
2907
+ else if (!def.arms.some((arm) => arm.kind === "undefinedT"))
2908
+ err(`fieldAbsent of ${e.unionId}: the union has no undefined arm`, e.loc);
2909
+ if (e.type.kind !== "union" || e.type.unionId !== e.unionId)
2910
+ err("fieldAbsent must have its union type", e.loc);
2911
+ if (!fieldSlotValues.has(e))
2912
+ err("fieldAbsent outside a record field write", e.loc);
2913
+ break;
2914
+ }
2771
2915
  case "recordGet": {
2772
2916
  checkExpr(e.obj);
2773
2917
  const shape = records.get(e.shapeId);
@@ -3065,8 +3209,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3065
3209
  if (e.test === "instanceof") {
3066
3210
  if (!e.className)
3067
3211
  err("caughtTest instanceof without a class", e.loc);
3068
- else if (!hierarchy.has(e.className)) {
3069
- err(`caughtTest instanceof against non-hierarchy class "${e.className}"`, e.loc);
3212
+ else if (!classes.has(e.className)) {
3213
+ err(`caughtTest instanceof against undeclared class "${e.className}"`, e.loc);
3070
3214
  }
3071
3215
  }
3072
3216
  else if (e.className !== undefined) {
@@ -3102,9 +3246,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3102
3246
  const ok = t.kind === "f64" ||
3103
3247
  t.kind === "bool" ||
3104
3248
  t.kind === "string" ||
3105
- (t.kind === "object" && hierarchy.has(t.className));
3249
+ (t.kind === "object" && classes.has(t.className));
3106
3250
  if (!ok) {
3107
- err(`caughtNarrow to ${t.kind === "object" ? `non-hierarchy class "${t.className}"` : t.kind}`, e.loc);
3251
+ err(`caughtNarrow to ${t.kind === "object" ? `undeclared class "${t.className}"` : t.kind}`, e.loc);
3108
3252
  }
3109
3253
  break;
3110
3254
  }
@@ -3258,6 +3402,19 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3258
3402
  }
3259
3403
  }
3260
3404
  function checkIntrinsicExpr(e) {
3405
+ if (e.name === "module.tdzCheck") {
3406
+ const [flag, name] = e.args;
3407
+ if (e.args.length !== 2 || flag === undefined || name?.kind !== "strLit") {
3408
+ err("module.tdzCheck takes a flag and a binding-name literal", e.loc);
3409
+ return;
3410
+ }
3411
+ checkExpr(flag);
3412
+ if (flag.type.kind !== "bool")
3413
+ err("module.tdzCheck flag must be bool", e.loc);
3414
+ if (e.type.kind !== "void")
3415
+ err("module.tdzCheck must be void", e.loc);
3416
+ return;
3417
+ }
3261
3418
  if (e.name === "module.await") {
3262
3419
  if (e.args.length !== 1)
3263
3420
  err("module.await takes exactly one argument", e.loc);
@@ -3365,6 +3522,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
3365
3522
  err(`${e.name} must be void`, e.loc);
3366
3523
  }
3367
3524
  function checkLibCall(e) {
3525
+ if (e.fn === "atomics.op" &&
3526
+ (e.args[0]?.type.kind !== "bytes" ||
3527
+ !["u8", "i8", "u16", "i16", "u32", "i32"].includes(e.args[0].type.elem))) {
3528
+ errors.push({ message: "integer Atomics require an integer typed array", loc: e.loc });
3529
+ }
3530
+ if (e.fn === "worker.new" && !workers)
3531
+ errors.push({ message: "Worker construction requires worker execution mode", loc: e.loc });
3368
3532
  const sig = LIB_FN_SIGS[e.fn];
3369
3533
  if (!sig) {
3370
3534
  err(`libCall of unknown library function "${e.fn}"`, e.loc);
@@ -5226,7 +5390,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
5226
5390
  }
5227
5391
  case "assign": {
5228
5392
  const binding = locals.get(s.localId) ?? globals.get(s.localId);
5229
- if (s.initializes && !binding?.tdz) {
5393
+ if (s.initializes && !binding?.tdz && globals.get(s.localId)?.initFlag === undefined) {
5230
5394
  err(`initializing assign requires a TDZ binding "${s.localId}"`, s.loc);
5231
5395
  }
5232
5396
  if (!binding)
@@ -5364,7 +5528,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
5364
5528
  }
5365
5529
  case "recordSet": {
5366
5530
  checkExpr(s.obj);
5367
- checkExpr(s.value);
5531
+ checkSlotValue(s.value);
5368
5532
  const shape = records.get(s.shapeId);
5369
5533
  const field = recordValidation.get(s.shapeId)?.fields.get(s.field);
5370
5534
  if (!shape)