@scriptc/compiler 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +346 -17
  2. package/dist/backend/executable-features.js +1 -0
  3. package/dist/backend/executable-features.js.map +1 -1
  4. package/dist/backend/literals.d.ts +7 -0
  5. package/dist/backend/literals.js +32 -0
  6. package/dist/backend/literals.js.map +1 -1
  7. package/dist/backend/literals.test.js +17 -1
  8. package/dist/backend/literals.test.js.map +1 -1
  9. package/dist/backend/llvm/alloc.d.ts +15 -4
  10. package/dist/backend/llvm/alloc.js +39 -15
  11. package/dist/backend/llvm/alloc.js.map +1 -1
  12. package/dist/backend/llvm/alloc.test.js +15 -1
  13. package/dist/backend/llvm/alloc.test.js.map +1 -1
  14. package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
  15. package/dist/backend/llvm/appended-array-literals.js +109 -0
  16. package/dist/backend/llvm/appended-array-literals.js.map +1 -0
  17. package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
  18. package/dist/backend/llvm/appended-array-literals.test.js +90 -0
  19. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
  20. package/dist/backend/llvm/bigint-wrap.d.ts +4 -0
  21. package/dist/backend/llvm/bigint-wrap.js +590 -0
  22. package/dist/backend/llvm/bigint-wrap.js.map +1 -0
  23. package/dist/backend/llvm/blocks.d.ts +2 -0
  24. package/dist/backend/llvm/blocks.js +4 -0
  25. package/dist/backend/llvm/blocks.js.map +1 -1
  26. package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
  27. package/dist/backend/llvm/call-lifetimes.js +66 -7
  28. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  29. package/dist/backend/llvm/call-lifetimes.test.js +14 -3
  30. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  31. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  32. package/dist/backend/llvm/checked-narrows.test.js.map +1 -1
  33. package/dist/backend/llvm/classes.js +67 -14
  34. package/dist/backend/llvm/classes.js.map +1 -1
  35. package/dist/backend/llvm/classes.test.js +6 -6
  36. package/dist/backend/llvm/classes.test.js.map +1 -1
  37. package/dist/backend/llvm/common.d.ts +7 -5
  38. package/dist/backend/llvm/common.js +7 -5
  39. package/dist/backend/llvm/common.js.map +1 -1
  40. package/dist/backend/llvm/constant-callbacks.js +10 -28
  41. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  42. package/dist/backend/llvm/dense-array-access.js +146 -53
  43. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  44. package/dist/backend/llvm/dense-array-access.test.js +68 -3
  45. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  46. package/dist/backend/llvm/dyn.d.ts +4 -0
  47. package/dist/backend/llvm/dyn.js +15 -2
  48. package/dist/backend/llvm/dyn.js.map +1 -1
  49. package/dist/backend/llvm/emitter.d.ts +163 -8
  50. package/dist/backend/llvm/emitter.js +973 -100
  51. package/dist/backend/llvm/emitter.js.map +1 -1
  52. package/dist/backend/llvm/emitter.test.js +14 -7
  53. package/dist/backend/llvm/emitter.test.js.map +1 -1
  54. package/dist/backend/llvm/expr-async.js +242 -49
  55. package/dist/backend/llvm/expr-async.js.map +1 -1
  56. package/dist/backend/llvm/expr-async.test.js +1 -1
  57. package/dist/backend/llvm/expr-async.test.js.map +1 -1
  58. package/dist/backend/llvm/expr-bytes.js +51 -36
  59. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  60. package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
  61. package/dist/backend/llvm/expr-callbacks.js +153 -4
  62. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  63. package/dist/backend/llvm/expr-calls.d.ts +12 -1
  64. package/dist/backend/llvm/expr-calls.js +279 -78
  65. package/dist/backend/llvm/expr-calls.js.map +1 -1
  66. package/dist/backend/llvm/expr-calls.test.d.ts +1 -0
  67. package/dist/backend/llvm/expr-calls.test.js +132 -0
  68. package/dist/backend/llvm/expr-calls.test.js.map +1 -0
  69. package/dist/backend/llvm/expr-containers.d.ts +7 -0
  70. package/dist/backend/llvm/expr-containers.js +49 -5
  71. package/dist/backend/llvm/expr-containers.js.map +1 -1
  72. package/dist/backend/llvm/expr-context.d.ts +4 -0
  73. package/dist/backend/llvm/expr-control.d.ts +8 -0
  74. package/dist/backend/llvm/expr-control.js +103 -69
  75. package/dist/backend/llvm/expr-control.js.map +1 -1
  76. package/dist/backend/llvm/expr-dispatch.js +3 -0
  77. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  78. package/dist/backend/llvm/expr-dynamic.js +28 -6
  79. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  80. package/dist/backend/llvm/expr-primitives.d.ts +14 -0
  81. package/dist/backend/llvm/expr-primitives.js +110 -48
  82. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.test.js +95 -5
  84. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  85. package/dist/backend/llvm/expr-records.d.ts +9 -0
  86. package/dist/backend/llvm/expr-records.js +144 -16
  87. package/dist/backend/llvm/expr-records.js.map +1 -1
  88. package/dist/backend/llvm/expr-stream-bridges.d.ts +9 -1
  89. package/dist/backend/llvm/expr-stream-bridges.js +152 -4
  90. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  91. package/dist/backend/llvm/expr-stream-bridges.test.js +98 -1
  92. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  93. package/dist/backend/llvm/int32-abi.d.ts +47 -0
  94. package/dist/backend/llvm/int32-abi.js +83 -0
  95. package/dist/backend/llvm/int32-abi.js.map +1 -0
  96. package/dist/backend/llvm/int32-abi.test.d.ts +1 -0
  97. package/dist/backend/llvm/int32-abi.test.js +181 -0
  98. package/dist/backend/llvm/int32-abi.test.js.map +1 -0
  99. package/dist/backend/llvm/int32-locals.d.ts +30 -0
  100. package/dist/backend/llvm/int32-locals.js +95 -0
  101. package/dist/backend/llvm/int32-locals.js.map +1 -0
  102. package/dist/backend/llvm/integer-values.d.ts +4 -0
  103. package/dist/backend/llvm/integer-values.js +30 -1
  104. package/dist/backend/llvm/integer-values.js.map +1 -1
  105. package/dist/backend/llvm/integer-views.d.ts +8 -1
  106. package/dist/backend/llvm/integer-views.js +47 -2
  107. package/dist/backend/llvm/integer-views.js.map +1 -1
  108. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  109. package/dist/backend/llvm/lazy-captures.js +88 -2
  110. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  111. package/dist/backend/llvm/lazy-captures.test.js +48 -0
  112. package/dist/backend/llvm/lazy-captures.test.js.map +1 -1
  113. package/dist/backend/llvm/lib-dispatch.js +21 -0
  114. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  115. package/dist/backend/llvm/lib-filesystem.js +61 -0
  116. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  117. package/dist/backend/llvm/lib-shared.js +83 -9
  118. package/dist/backend/llvm/lib-shared.js.map +1 -1
  119. package/dist/backend/llvm/local-array-reads.js +26 -5
  120. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  121. package/dist/backend/llvm/local-array-reads.test.js +3 -2
  122. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  123. package/dist/backend/llvm/local-union-storage.d.ts +24 -2
  124. package/dist/backend/llvm/local-union-storage.js +127 -12
  125. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  126. package/dist/backend/llvm/local-union-storage.test.js +108 -3
  127. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  128. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  129. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  130. package/dist/backend/llvm/record-results.d.ts +26 -0
  131. package/dist/backend/llvm/record-results.js +252 -0
  132. package/dist/backend/llvm/record-results.js.map +1 -0
  133. package/dist/backend/llvm/reference-effects.js +4 -0
  134. package/dist/backend/llvm/reference-effects.js.map +1 -1
  135. package/dist/backend/llvm/reference-writes.d.ts +3 -0
  136. package/dist/backend/llvm/reference-writes.js +25 -11
  137. package/dist/backend/llvm/reference-writes.js.map +1 -1
  138. package/dist/backend/llvm/regex-matchers.d.ts +39 -0
  139. package/dist/backend/llvm/regex-matchers.js +1649 -0
  140. package/dist/backend/llvm/regex-matchers.js.map +1 -0
  141. package/dist/backend/llvm/regex-matchers.test.d.ts +1 -0
  142. package/dist/backend/llvm/regex-matchers.test.js +96 -0
  143. package/dist/backend/llvm/regex-matchers.test.js.map +1 -0
  144. package/dist/backend/llvm/regions.d.ts +67 -0
  145. package/dist/backend/llvm/regions.js +309 -0
  146. package/dist/backend/llvm/regions.js.map +1 -0
  147. package/dist/backend/llvm/regions.test.d.ts +1 -0
  148. package/dist/backend/llvm/regions.test.js +173 -0
  149. package/dist/backend/llvm/regions.test.js.map +1 -0
  150. package/dist/backend/llvm/shapes.d.ts +70 -8
  151. package/dist/backend/llvm/shapes.js +157 -29
  152. package/dist/backend/llvm/shapes.js.map +1 -1
  153. package/dist/backend/llvm/shapes.test.js +7 -6
  154. package/dist/backend/llvm/shapes.test.js.map +1 -1
  155. package/dist/backend/llvm/split-loops.js +1 -1
  156. package/dist/backend/llvm/split-loops.js.map +1 -1
  157. package/dist/backend/llvm/stack-objects.d.ts +29 -0
  158. package/dist/backend/llvm/stack-objects.js +130 -0
  159. package/dist/backend/llvm/stack-objects.js.map +1 -0
  160. package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
  161. package/dist/backend/llvm/stack-objects.test.js +252 -0
  162. package/dist/backend/llvm/stack-objects.test.js.map +1 -0
  163. package/dist/backend/llvm/stack-unions.test.js +1 -1
  164. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  165. package/dist/backend/llvm/string-construction.test.js +2 -2
  166. package/dist/backend/llvm/string-construction.test.js.map +1 -1
  167. package/dist/backend/llvm/string-lifetimes.test.js +5 -5
  168. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  169. package/dist/backend/llvm/string-literal-equality.d.ts +22 -0
  170. package/dist/backend/llvm/string-literal-equality.js +78 -0
  171. package/dist/backend/llvm/string-literal-equality.js.map +1 -0
  172. package/dist/backend/llvm/string-reads.d.ts +4 -1
  173. package/dist/backend/llvm/string-reads.js +89 -9
  174. package/dist/backend/llvm/string-reads.js.map +1 -1
  175. package/dist/backend/llvm/switch-dispatch.js +60 -13
  176. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  177. package/dist/backend/llvm/switch-dispatch.test.js +71 -6
  178. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  179. package/dist/backend/llvm/union-retype.test.d.ts +1 -0
  180. package/dist/backend/llvm/union-retype.test.js +229 -0
  181. package/dist/backend/llvm/union-retype.test.js.map +1 -0
  182. package/dist/backend/llvm/walkers.d.ts +2 -0
  183. package/dist/backend/llvm/walkers.js +4 -2
  184. package/dist/backend/llvm/walkers.js.map +1 -1
  185. package/dist/backend/llvm/wrapping-sums.d.ts +17 -0
  186. package/dist/backend/llvm/wrapping-sums.js +113 -0
  187. package/dist/backend/llvm/wrapping-sums.js.map +1 -0
  188. package/dist/backend/loop-polls.js +1 -0
  189. package/dist/backend/loop-polls.js.map +1 -1
  190. package/dist/backend/mangle.d.ts +9 -0
  191. package/dist/backend/mangle.js +15 -0
  192. package/dist/backend/mangle.js.map +1 -1
  193. package/dist/backend/may-throw.js +7 -3
  194. package/dist/backend/may-throw.js.map +1 -1
  195. package/dist/backend/native/contracts.d.ts +5 -0
  196. package/dist/backend/native/executable.js +16 -1
  197. package/dist/backend/native/executable.js.map +1 -1
  198. package/dist/backend/native/library.js +1 -1
  199. package/dist/backend/native/library.js.map +1 -1
  200. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  201. package/dist/backend/native/runtime-inputs.js +2 -0
  202. package/dist/backend/native/runtime-inputs.js.map +1 -1
  203. package/dist/backend/native-link-info-core.d.ts +1 -0
  204. package/dist/backend/native-link-info-core.js.map +1 -1
  205. package/dist/backend/runtime-abi.d.ts +2 -2
  206. package/dist/backend/runtime-abi.js +2 -2
  207. package/dist/backend/runtime-pack-core.d.ts +1 -0
  208. package/dist/backend/runtime-pack-core.js +1 -0
  209. package/dist/backend/runtime-pack-core.js.map +1 -1
  210. package/dist/backend/runtime-pack-targets.test.js +1 -1
  211. package/dist/backend/runtime-pack.test.js +1 -1
  212. package/dist/backend/target-diagnostics.js +14 -0
  213. package/dist/backend/target-diagnostics.js.map +1 -1
  214. package/dist/backend/target-diagnostics.test.js +13 -0
  215. package/dist/backend/target-diagnostics.test.js.map +1 -1
  216. package/dist/contracts/check.js +4 -0
  217. package/dist/contracts/check.js.map +1 -1
  218. package/dist/executable/executable-cache.d.ts +1 -0
  219. package/dist/executable/executable-cache.js.map +1 -1
  220. package/dist/frontend/experimental-import.d.ts +12 -0
  221. package/dist/frontend/experimental-import.js +63 -0
  222. package/dist/frontend/experimental-import.js.map +1 -0
  223. package/dist/frontend/lowering/array-values.d.ts +14 -0
  224. package/dist/frontend/lowering/array-values.js +29 -0
  225. package/dist/frontend/lowering/array-values.js.map +1 -1
  226. package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
  227. package/dist/frontend/lowering/builtin-calls.js +36 -0
  228. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/console.d.ts +16 -6
  230. package/dist/frontend/lowering/builtins/console.js +33 -9
  231. package/dist/frontend/lowering/builtins/console.js.map +1 -1
  232. package/dist/frontend/lowering/builtins/errors.js +20 -0
  233. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/json.d.ts +2 -2
  235. package/dist/frontend/lowering/builtins/json.js +13 -4
  236. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  237. package/dist/frontend/lowering/builtins/module-calls.js +16 -1
  238. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  239. package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
  240. package/dist/frontend/lowering/builtins/numbers.js +17 -0
  241. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
  243. package/dist/frontend/lowering/builtins/operating-system.js +361 -1
  244. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/process.js +15 -3
  246. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  247. package/dist/frontend/lowering/builtins/promises.js +109 -2
  248. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  249. package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
  250. package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
  251. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  252. package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
  253. package/dist/frontend/lowering/checked-promise-all.js +52 -6
  254. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  255. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -3
  256. package/dist/frontend/lowering/class-dynamic-dispatch.js +54 -31
  257. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  258. package/dist/frontend/lowering/containers/array-callbacks.js +74 -4
  259. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  260. package/dist/frontend/lowering/containers/array-construction.js +8 -4
  261. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  262. package/dist/frontend/lowering/containers/array-pipelines.d.ts +54 -0
  263. package/dist/frontend/lowering/containers/array-pipelines.js +1827 -0
  264. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -0
  265. package/dist/frontend/lowering/containers/exec-result-uses.d.ts +10 -0
  266. package/dist/frontend/lowering/containers/exec-result-uses.js +88 -0
  267. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -0
  268. package/dist/frontend/lowering/containers/string-and-regexp.js +106 -7
  269. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  270. package/dist/frontend/lowering/containers/string-replacement.d.ts +2 -1
  271. package/dist/frontend/lowering/containers/string-replacement.js +32 -136
  272. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  273. package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
  274. package/dist/frontend/lowering/cycle-initialization.js +166 -12
  275. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  276. package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
  277. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  278. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  279. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  280. package/dist/frontend/lowering/devirtualize.d.ts +33 -0
  281. package/dist/frontend/lowering/devirtualize.js +199 -0
  282. package/dist/frontend/lowering/devirtualize.js.map +1 -0
  283. package/dist/frontend/lowering/expressions/nullish-assignment.js +55 -7
  284. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  285. package/dist/frontend/lowering/expressions/object-literals.js +5 -56
  286. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  287. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  288. package/dist/frontend/lowering/generator-delegation.js +231 -10
  289. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  290. package/dist/frontend/lowering/identifier-uses.d.ts +7 -0
  291. package/dist/frontend/lowering/identifier-uses.js +23 -0
  292. package/dist/frontend/lowering/identifier-uses.js.map +1 -0
  293. package/dist/frontend/lowering/iterator-adapters.js +51 -3
  294. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  295. package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
  296. package/dist/frontend/lowering/lifetime-regions.js +216 -0
  297. package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
  298. package/dist/frontend/lowering/lower-array-sort.d.ts +28 -2
  299. package/dist/frontend/lowering/lower-array-sort.js +112 -2
  300. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  301. package/dist/frontend/lowering/lower-array-sort.test.js +99 -2
  302. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  303. package/dist/frontend/lowering/lower-calls.js +135 -131
  304. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  305. package/dist/frontend/lowering/lower-classes.d.ts +4 -3
  306. package/dist/frontend/lowering/lower-classes.js +117 -13
  307. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  308. package/dist/frontend/lowering/lower-console.d.ts +27 -0
  309. package/dist/frontend/lowering/lower-console.js +651 -0
  310. package/dist/frontend/lowering/lower-console.js.map +1 -0
  311. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
  312. package/dist/frontend/lowering/lower-event-emitter.js +124 -38
  313. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  314. package/dist/frontend/lowering/lower-exprs.js +272 -25
  315. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  316. package/dist/frontend/lowering/lower-functions.js +7 -3
  317. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  318. package/dist/frontend/lowering/lower-generators.d.ts +25 -7
  319. package/dist/frontend/lowering/lower-generators.js +264 -113
  320. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  321. package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
  322. package/dist/frontend/lowering/lower-inspect.js +119 -18
  323. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  324. package/dist/frontend/lowering/lower-modules.js +24 -14
  325. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  326. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  327. package/dist/frontend/lowering/lower-stdlib.js +35 -1
  328. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  329. package/dist/frontend/lowering/lower-stmts.js +66 -11
  330. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  331. package/dist/frontend/lowering/lower-stream.js +13 -10
  332. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  333. package/dist/frontend/lowering/lowerer.d.ts +47 -5
  334. package/dist/frontend/lowering/lowerer.js +235 -54
  335. package/dist/frontend/lowering/lowerer.js.map +1 -1
  336. package/dist/frontend/lowering/nan-coded-reads.d.ts +16 -0
  337. package/dist/frontend/lowering/nan-coded-reads.js +108 -1
  338. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  339. package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
  340. package/dist/frontend/lowering/regex-span-reads.js +164 -0
  341. package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
  342. package/dist/frontend/lowering/runtime-optional-bounds.d.ts +4 -0
  343. package/dist/frontend/lowering/runtime-optional-bounds.js +2 -0
  344. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  345. package/dist/frontend/lowering/runtime-optional-bounds.test.js +27 -0
  346. package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -1
  347. package/dist/frontend/lowering/split-consumers.js +2 -18
  348. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  349. package/dist/frontend/lowering/surfaces.js +115 -18
  350. package/dist/frontend/lowering/surfaces.js.map +1 -1
  351. package/dist/frontend/lowering/union-retag.d.ts +6 -1
  352. package/dist/frontend/lowering/union-retag.js +64 -1
  353. package/dist/frontend/lowering/union-retag.js.map +1 -1
  354. package/dist/frontend/lowering/union-retag.test.js +46 -0
  355. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  356. package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
  357. package/dist/frontend/lowering/var-hoisting.js +261 -0
  358. package/dist/frontend/lowering/var-hoisting.js.map +1 -0
  359. package/dist/frontend/pipeline.js +5 -3
  360. package/dist/frontend/pipeline.js.map +1 -1
  361. package/dist/frontend/program.d.ts +3 -2
  362. package/dist/frontend/program.js +23 -5
  363. package/dist/frontend/program.js.map +1 -1
  364. package/dist/frontend/program.test.js +13 -0
  365. package/dist/frontend/program.test.js.map +1 -1
  366. package/dist/frontend/type-mapper.d.ts +13 -1
  367. package/dist/frontend/type-mapper.js +160 -14
  368. package/dist/frontend/type-mapper.js.map +1 -1
  369. package/dist/index.js +1 -0
  370. package/dist/index.js.map +1 -1
  371. package/dist/ir/builtin-effects.js +31 -2
  372. package/dist/ir/builtin-effects.js.map +1 -1
  373. package/dist/ir/builtin-signatures.d.ts +1 -1
  374. package/dist/ir/builtin-signatures.js +157 -16
  375. package/dist/ir/builtin-signatures.js.map +1 -1
  376. package/dist/ir/function-references.d.ts +12 -0
  377. package/dist/ir/function-references.js +29 -0
  378. package/dist/ir/function-references.js.map +1 -0
  379. package/dist/ir/function-references.test.d.ts +1 -0
  380. package/dist/ir/function-references.test.js +277 -0
  381. package/dist/ir/function-references.test.js.map +1 -0
  382. package/dist/ir/int32-slots.d.ts +7 -4
  383. package/dist/ir/int32-slots.js +215 -49
  384. package/dist/ir/int32-slots.js.map +1 -1
  385. package/dist/ir/int32-slots.test.js +38 -1
  386. package/dist/ir/int32-slots.test.js.map +1 -1
  387. package/dist/ir/integer-ranges.d.ts +4 -4
  388. package/dist/ir/integer-ranges.js +89 -64
  389. package/dist/ir/integer-ranges.js.map +1 -1
  390. package/dist/ir/integer-ranges.test.js +71 -9
  391. package/dist/ir/integer-ranges.test.js.map +1 -1
  392. package/dist/ir/intrinsic-signatures.js +3 -0
  393. package/dist/ir/intrinsic-signatures.js.map +1 -1
  394. package/dist/ir/ir.d.ts +111 -20
  395. package/dist/ir/ir.js +6 -0
  396. package/dist/ir/ir.js.map +1 -1
  397. package/dist/ir/runtime-features.d.ts +1 -0
  398. package/dist/ir/runtime-features.js +38 -3
  399. package/dist/ir/runtime-features.js.map +1 -1
  400. package/dist/ir/scalar-records.js +1 -2
  401. package/dist/ir/scalar-records.js.map +1 -1
  402. package/dist/ir/traverse.js +4 -0
  403. package/dist/ir/traverse.js.map +1 -1
  404. package/dist/ir/validate.js +201 -25
  405. package/dist/ir/validate.js.map +1 -1
  406. package/dist/ir/validate.test.js +90 -7
  407. package/dist/ir/validate.test.js.map +1 -1
  408. package/dist/library/ir-policy.js +1 -0
  409. package/dist/library/ir-policy.js.map +1 -1
  410. package/dist/native/sanitizer.test.js +1 -0
  411. package/dist/native/sanitizer.test.js.map +1 -1
  412. package/package.json +20 -20
  413. package/surface-manifest.json +159 -17
@@ -1,8 +1,10 @@
1
1
  import { generatorDrain } from "./iterator-adapters.js";
2
+ import { lowerEventStaticProperty } from "./builtins/numbers.js";
2
3
  import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
3
4
  import { isOptionalProcessStreamProperty } from "./builtins/process.js";
4
5
  import { lowerWorkerMetadata } from "./builtins/workers.js";
5
6
  import { threadsImportOf } from "../threads-import.js";
7
+ import { experimentalImportOf, lifetimeRegionMemberOf } from "../experimental-import.js";
6
8
  import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../ir/build.js";
7
9
  import { InternalCompilerError } from "../../errors.js";
8
10
  import { SYMBOL_T } from "../../ir/ir.js";
@@ -31,7 +33,7 @@ import { ARRAY_METHODS, builtinConstLit, builtinFenceHintOf, builtinModuleConstO
31
33
  import { UNSUPPORTED, blockedBindingUseDiag, unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
32
34
  import { PoisonError, dynFallbackType, jsFuncNameOf, neverTaintedJsType, own } from "./lowerer.js";
33
35
  import { lowerCollectionSpread } from "./containers/collection-methods.js";
34
- import { arrayValueRead, arrayValueStore, arrayValueType, lowerSafeIndexRead, tryLowerIndexTruthiness, tryLowerNumericIndexRead, lowerSafeBytesRead, } from "./array-values.js";
36
+ import { arrayNumberRead, arrayValueRead, arrayValueStore, arrayValueType, lowerSafeIndexRead, tryLowerIndexTruthiness, tryLowerNumericIndexRead, tryLowerBytesReadNumberEquality, lowerSafeBytesRead, } from "./array-values.js";
35
37
  import { strCharsCall } from "./containers/array-construction.js";
36
38
  import { lowerOptionalStringIndex } from "./string-index.js";
37
39
  import { tryLowerIndexedComparison } from "./indexed-comparison.js";
@@ -48,8 +50,8 @@ import { funcTypeFromParamShapes } from "./call-signatures.js";
48
50
  import { implicitMonoFile, objLitGenericFnInfoOf, objLitGenericFnNodeOf, requireObjLitGenericReceiver, } from "./generic-functions.js";
49
51
  import { lowerTaggedTemplate } from "./lower-calls.js";
50
52
  import { mixinFnOfCallee } from "./lower-mixins.js";
51
- import { isConstAssertionTypeNode, isGenericCallableMemberType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
52
- import { lowerYield } from "./lower-generators.js";
53
+ import { isConstAssertionTypeNode, isGenericCallableMemberType, isOsConstantsType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
54
+ import { iteratorResultValueRead, lowerYield } from "./lower-generators.js";
53
55
  import { errorPropertyRead, errorPropertyWrite, errorToStringCall } from "./error-methods.js";
54
56
  import { lowerStreamProperty, lowerStreamStateProperty, streamSidesOf } from "./lower-stream.js";
55
57
  import { unionWideningTags } from "../../ir/analysis.js";
@@ -731,7 +733,9 @@ function lowerExprInner(lowerer, expr) {
731
733
  lowerer.unions.get(g.type.unionId)?.arms.length === 2 &&
732
734
  lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "f64") &&
733
735
  lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "string");
736
+ const symbol = lowerer.resolveValueSymbol(expr);
734
737
  if (!arithmeticUnion &&
738
+ !(symbol !== null && lowerer.earlyReadVars.has(symbol)) &&
735
739
  g.type.kind === "union" &&
736
740
  narrowed &&
737
741
  narrowed.kind !== "union" &&
@@ -849,6 +853,8 @@ function lowerExprInner(lowerer, expr) {
849
853
  return { kind: "boolLit", value: true, type: BOOL, loc };
850
854
  if (member === "publish")
851
855
  lowerer.noLowering("publish (@scriptc/threads) as a value", expr, "call publish(value) directly");
856
+ if (experimentalImportOf(lowerer.program, expr) === "LifetimeRegion")
857
+ lowerer.noLowering("LifetimeRegion (@scriptc/experimental) as a value", expr, "construct regions with new LifetimeRegion()");
852
858
  }
853
859
  {
854
860
  const bi = lowerer.builtinImportOf(expr);
@@ -872,6 +878,9 @@ function lowerExprInner(lowerer, expr) {
872
878
  if (bi.module === "http" && bi.member === "STATUS_CODES") {
873
879
  return { kind: "libCall", fn: "http.statusCodes", args: [], type: DYN, loc };
874
880
  }
881
+ if (bi.module === "os" && bi.member === "constants") {
882
+ return { kind: "libCall", fn: "os.constants", args: [], type: DYN, loc };
883
+ }
875
884
  // tls.rootCertificates: a runtime-valued module constant (the
876
885
  // cached bundled-CA array) — the one member read that lowers
877
886
  // to a libCall instead of a baked literal.
@@ -1413,6 +1422,11 @@ function lowerExprInner(lowerer, expr) {
1413
1422
  if (ts.isConditionalExpression(expr))
1414
1423
  return lowerTernary(lowerer, expr);
1415
1424
  if (ts.isPropertyAccessExpression(expr)) {
1425
+ {
1426
+ const member = lifetimeRegionMemberOf(lowerer.program, expr, lowerer.experimentalFiles);
1427
+ if (member !== null)
1428
+ lowerer.noLowering(`LifetimeRegion.${member} (@scriptc/experimental) as a value`, expr, `call region.${member}(${member === "run" ? "fn" : ""}) directly`);
1429
+ }
1416
1430
  // Expando statics may still be absent even when JS inference sees
1417
1431
  // the eventual assignment's scalar type. Preserve the checked value.
1418
1432
  const staticField = lowerStaticFieldRead(lowerer, expr);
@@ -1809,6 +1823,7 @@ function lowerExprInner(lowerer, expr) {
1809
1823
  lowerer.lowerJsonProperty(expr) ??
1810
1824
  lowerer.lowerErrorCodeProperty(expr) ??
1811
1825
  lowerer.lowerNumberStaticProperty(expr) ??
1826
+ lowerEventStaticProperty(lowerer, expr) ??
1812
1827
  lowerer.lowerMathProperty(expr) ??
1813
1828
  lowerer.lowerIntrinsicProperty(expr) ??
1814
1829
  // The _readableState/_writableState scalar READS (the suite's
@@ -1831,7 +1846,7 @@ function lowerExprInner(lowerer, expr) {
1831
1846
  // arm is real (`obj.n = bytes[i]; obj.n` is undefined in Node).
1832
1847
  if (runtimeOptionalClassField(lowerer, handled, expr))
1833
1848
  return handled;
1834
- return lowerer.maybeNarrow(handled, expr);
1849
+ return iteratorResultValueRead(lowerer, handled, expr) ?? lowerer.maybeNarrow(handled, expr);
1835
1850
  }
1836
1851
  // `globalThis.<name>` that no lowering above claimed
1837
1852
  // (globalThis.crypto, globalThis.SubtleCrypto, globalThis.localStorage
@@ -2021,14 +2036,15 @@ function lowerExprInner(lowerer, expr) {
2021
2036
  const shape = lowerer.shapes.get(recv.type.shapeId);
2022
2037
  const field = shape?.fields.find((f) => f.name === expr.name.text);
2023
2038
  if (field) {
2024
- return lowerer.maybeNarrow({
2039
+ const read = {
2025
2040
  kind: "recordGet",
2026
2041
  obj: recv,
2027
2042
  shapeId: recv.type.shapeId,
2028
2043
  field: field.name,
2029
2044
  type: field.type,
2030
2045
  loc,
2031
- }, expr);
2046
+ };
2047
+ return iteratorResultValueRead(lowerer, read, expr) ?? lowerer.maybeNarrow(read, expr);
2032
2048
  }
2033
2049
  }
2034
2050
  }
@@ -2055,9 +2071,14 @@ function lowerExprInner(lowerer, expr) {
2055
2071
  const segmentDataProperty = segmentDataSymbol?.name === "SegmentData" &&
2056
2072
  lowerer.isStdlibSymbol(segmentDataSymbol) &&
2057
2073
  ["segment", "index", "input", "isWordLike"].includes(expr.name.text);
2074
+ // os.constants members vary by platform (the declared groups list
2075
+ // every platform's names): a number member reads as `number |
2076
+ // undefined`, like an array element, and a group stays checked.
2077
+ const osConstants = isOsConstantsType(lowerer.typeOf(expr.expression), lowerer);
2058
2078
  if (isParseArgsDynProperty(lowerer, expr) ||
2059
2079
  isStatFsDynProperty(lowerer, expr) ||
2060
- segmentDataProperty) {
2080
+ segmentDataProperty ||
2081
+ osConstants) {
2061
2082
  const recv = lowerer.lowerExpr(expr.expression);
2062
2083
  if (recv.type.kind === "dyn") {
2063
2084
  const key = {
@@ -2067,14 +2088,20 @@ function lowerExprInner(lowerer, expr) {
2067
2088
  loc: locOf(expr.name),
2068
2089
  };
2069
2090
  const opt = hasOptionalChainGuard(expr.expression);
2070
- return lowerer.maybeNarrow({
2091
+ const read = {
2071
2092
  kind: "dynKeyGet",
2072
2093
  key,
2073
2094
  ...(opt ? { optional: true } : {}),
2074
2095
  value: recv,
2075
2096
  type: DYN,
2076
2097
  loc,
2077
- }, expr);
2098
+ };
2099
+ if (osConstants) {
2100
+ return lowerer.mapTypeOf(lowerer.typeOf(expr))?.kind === "f64"
2101
+ ? lowerer.coerceToExpected(read, lowerer.withUndefinedArm(F64))
2102
+ : read;
2103
+ }
2104
+ return lowerer.maybeNarrow(read, expr);
2078
2105
  }
2079
2106
  }
2080
2107
  // A member read through a NULLISH generic binding (`const i: I<A &
@@ -2772,6 +2799,9 @@ export function maybeNarrow(lowerer, expr, node) {
2772
2799
  if (symbol && lowerer.unstableSwitchBindings.has(symbol))
2773
2800
  return expr;
2774
2801
  }
2802
+ if (ts.isPropertyAccessExpression(node) &&
2803
+ getterResultHoldsUndeclaredUndefined(lowerer, node, expr))
2804
+ return expr;
2775
2805
  const narrowedTs = lowerer.typeOf(node);
2776
2806
  const narrowed = lowerer.mapTypeOf(narrowedTs);
2777
2807
  // `Array.isArray(u)` on a union with one readonly array/tuple arm: the
@@ -2880,6 +2910,27 @@ export function maybeNarrow(lowerer, expr, node) {
2880
2910
  loc: expr.loc,
2881
2911
  };
2882
2912
  }
2913
+ /** A getter read whose runtime result can be undefined (an unchecked
2914
+ * element read in its body, or in another member of its override family)
2915
+ * although its declared type cannot. The checker's type for the read is
2916
+ * then no narrowing proof, so the read keeps the getter's result. */
2917
+ function getterResultHoldsUndeclaredUndefined(lowerer, node, expr) {
2918
+ if (expr.type.kind !== "union" || lowerer.armTag(expr.type.unionId, UNDEFINED_T) < 0)
2919
+ return false;
2920
+ const getter = (expr.kind === "virtualCall" && expr.method.startsWith("get:")) ||
2921
+ (expr.kind === "call" && expr.callee.includes(".get:"));
2922
+ if (!getter)
2923
+ return false;
2924
+ const symbol = lowerer.checker.getSymbolAtLocation(node.name);
2925
+ if (!symbol || (symbol.flags & ts.SymbolFlags.GetAccessor) === 0)
2926
+ return false;
2927
+ const declared = lowerer.checker.getTypeOfSymbol(symbol);
2928
+ const holdsUndefined = (type) => (type.flags &
2929
+ (ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !==
2930
+ 0;
2931
+ return !(holdsUndefined(declared) ||
2932
+ (declared.isUnionType() && ts.constituentTypes(declared).some(holdsUndefined)));
2933
+ }
2883
2934
  /** The checked form of maybeNarrow's arm extraction for a narrowing the
2884
2935
  * checker may hold past code that replaced the value (a call clearing the
2885
2936
  * property; see NarrowingStability). Every other arm throws the TypeError
@@ -6330,7 +6381,13 @@ export function lowerElementCompound(lowerer, expr, op) {
6330
6381
  const receiverRef = () => varRef(receiverLocal.id, receiver.type, loc);
6331
6382
  const indexRef = () => varRef(indexLocal.id, F64, loc);
6332
6383
  const oldValue = receiver.type.kind === "array"
6333
- ? arrayValueRead(lowerer, receiverRef(), indexRef(), receiver.type.elem, locOf(target))
6384
+ ? receiver.type.elem.kind === "f64"
6385
+ ? // Every numeric operator applies ToNumber to the old value, so a
6386
+ // missing element is NaN without materializing `number | undefined`.
6387
+ arrayNumberRead(receiverRef(), indexRef(), locOf(target))
6388
+ : receiver.type.elem.kind === "string" && op === "+"
6389
+ ? arrayStringOperand(receiverRef(), indexRef(), locOf(target))
6390
+ : arrayValueRead(lowerer, receiverRef(), indexRef(), receiver.type.elem, locOf(target))
6334
6391
  : {
6335
6392
  // An invalid index reads undefined in Node, which every numeric
6336
6393
  // compound operator turns into NaN; the write is then ignored.
@@ -6407,6 +6464,25 @@ export function lowerElementCompound(lowerer, expr, op) {
6407
6464
  loc,
6408
6465
  };
6409
6466
  }
6467
+ /** ToString of one stabilized `string[]` element read for `+=`: a missing
6468
+ * element concatenates as "undefined". */
6469
+ function arrayStringOperand(arr, index, loc) {
6470
+ return {
6471
+ kind: "ternary",
6472
+ cond: {
6473
+ kind: "bin",
6474
+ op: "===",
6475
+ left: { kind: "arrayState", arr, index, type: F64, loc },
6476
+ right: { kind: "numLit", value: 1, type: F64, loc },
6477
+ type: BOOL,
6478
+ loc,
6479
+ },
6480
+ then: { kind: "arrayGet", arr, index, type: STRING, loc },
6481
+ else_: strLit("undefined", loc),
6482
+ type: STRING,
6483
+ loc,
6484
+ };
6485
+ }
6410
6486
  /** Checked member assignment evaluates the reference before its RHS and
6411
6487
  * yields the original assigned value, including in a chained assignment. */
6412
6488
  function lowerDynMemberAssignment(lowerer, expr, recv) {
@@ -7443,6 +7519,13 @@ export function lowerIncDec(lowerer, expr, prefix) {
7443
7519
  return varRef(local.id, value.type, loc);
7444
7520
  };
7445
7521
  const finish = (read, write) => {
7522
+ if (read.type.kind === "bigint") {
7523
+ const old = save(read, "%incrementOld");
7524
+ const next = save(bigintStep(op, old, loc), "%incrementNext");
7525
+ stmts.push(write(next));
7526
+ const result = prefix ? next : old;
7527
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
7528
+ }
7446
7529
  const old = save(read.type.kind === "f64"
7447
7530
  ? read
7448
7531
  : {
@@ -7486,7 +7569,9 @@ export function lowerIncDec(lowerer, expr, prefix) {
7486
7569
  lowerer.unsupported("SC1090", access, "incrementing non-number array keys");
7487
7570
  const type = raw.type;
7488
7571
  const read = type.kind === "array"
7489
- ? arrayValueRead(lowerer, receiver, index, type.elem, loc)
7572
+ ? type.elem.kind === "f64"
7573
+ ? arrayNumberRead(receiver, index, loc)
7574
+ : arrayValueRead(lowerer, receiver, index, type.elem, loc)
7490
7575
  : {
7491
7576
  kind: "bytesIntrinsic",
7492
7577
  method: "get",
@@ -7633,6 +7718,26 @@ export function lowerIncDecTarget(lowerer, expr, target, prefix) {
7633
7718
  };
7634
7719
  }
7635
7720
  }
7721
+ if (target.type.kind === "bigint") {
7722
+ const old = lowerer.declareHiddenLocal("%bigintOld", BIGINT_T);
7723
+ const next = lowerer.declareHiddenLocal("%bigintNext", BIGINT_T);
7724
+ return {
7725
+ kind: "seqExpr",
7726
+ stmts: [
7727
+ { kind: "varDecl", localId: old.id, init: varRef(target.id, BIGINT_T, loc), loc },
7728
+ {
7729
+ kind: "varDecl",
7730
+ localId: next.id,
7731
+ init: bigintStep(op, varRef(old.id, BIGINT_T, loc), loc),
7732
+ loc,
7733
+ },
7734
+ { kind: "assign", localId: target.id, value: varRef(next.id, BIGINT_T, loc), loc },
7735
+ ],
7736
+ result: varRef(prefix ? next.id : old.id, BIGINT_T, loc),
7737
+ type: BIGINT_T,
7738
+ loc,
7739
+ };
7740
+ }
7636
7741
  if (target.type.kind !== "f64")
7637
7742
  lowerer.unsupported("SC1043", expr);
7638
7743
  return { kind: "incDec", op, prefix, localId: target.id, type: F64, loc };
@@ -7663,6 +7768,43 @@ function seqExprSafeStmt(s) {
7663
7768
  return false;
7664
7769
  }
7665
7770
  }
7771
+ const BIGINT_COMPOUND = {
7772
+ "+": "bigint.add",
7773
+ "-": "bigint.sub",
7774
+ "*": "bigint.mul",
7775
+ "/": "bigint.div",
7776
+ "%": "bigint.mod",
7777
+ "**": "bigint.pow",
7778
+ "&": "bigint.and",
7779
+ "|": "bigint.or",
7780
+ "^": "bigint.xor",
7781
+ "<<": "bigint.shl",
7782
+ ">>": "bigint.shr",
7783
+ };
7784
+ /** `old op= rhs` over two bigints: the binary operator's libCall. Null
7785
+ * for other operand types (and `>>>`, which BigInt does not have). */
7786
+ function bigintCompoundValue(op, left, right, loc) {
7787
+ if (left.type.kind !== "bigint" || right.type.kind !== "bigint" || op === ">>>")
7788
+ return null;
7789
+ return { kind: "libCall", fn: BIGINT_COMPOUND[op], args: [left, right], type: BIGINT_T, loc };
7790
+ }
7791
+ /** `++`/`--` on a bigint value: old ± 1n. */
7792
+ function bigintStep(op, old, loc) {
7793
+ const one = {
7794
+ kind: "libCall",
7795
+ fn: "bigint.parse",
7796
+ args: [{ kind: "strLit", value: "1", type: STRING, loc }],
7797
+ type: BIGINT_T,
7798
+ loc,
7799
+ };
7800
+ return {
7801
+ kind: "libCall",
7802
+ fn: op === "+" ? "bigint.add" : "bigint.sub",
7803
+ args: [old, one],
7804
+ type: BIGINT_T,
7805
+ loc,
7806
+ };
7807
+ }
7666
7808
  export function lowerCompoundValueToTarget(lowerer, expr, compound, target) {
7667
7809
  const loc = locOf(expr);
7668
7810
  const read = {
@@ -7706,6 +7848,9 @@ export function lowerCompoundValueToTarget(lowerer, expr, compound, target) {
7706
7848
  };
7707
7849
  return lowerer.coerceInto(expr, computed, target.type);
7708
7850
  }
7851
+ const bigint = bigintCompoundValue(compound, read, rhs, loc);
7852
+ if (bigint)
7853
+ return bigint;
7709
7854
  lowerer.unsupported("SC1043", expr);
7710
7855
  }
7711
7856
  /** Equality of two NaN-coded values (nan-coded-reads.ts), each of which may
@@ -8075,6 +8220,16 @@ export function lowerBinary(lowerer, expr) {
8075
8220
  left = storedLeft;
8076
8221
  if (storedRight !== null && left.type.kind !== "union")
8077
8222
  right = storedRight;
8223
+ // A typed-array read compared with a plain number needs no
8224
+ // `number | undefined` box.
8225
+ const fusedLeft = tryLowerBytesReadNumberEquality(lowerer, left, right, expr.right);
8226
+ if (fusedLeft)
8227
+ left = fusedLeft;
8228
+ else {
8229
+ const fusedRight = tryLowerBytesReadNumberEquality(lowerer, right, left, expr.left);
8230
+ if (fusedRight)
8231
+ right = fusedRight;
8232
+ }
8078
8233
  }
8079
8234
  if (strictEquality && (left.type.kind === "caught" || right.type.kind === "caught")) {
8080
8235
  if (left.type.kind === "caught")
@@ -10012,6 +10167,14 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10012
10167
  const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10013
10168
  return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
10014
10169
  }
10170
+ {
10171
+ const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
10172
+ if (eventKind >= 0) {
10173
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10174
+ const kind = { kind: "numLit", value: eventKind, type: F64, loc };
10175
+ return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
10176
+ }
10177
+ }
10015
10178
  if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
10016
10179
  const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10017
10180
  return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
@@ -10211,7 +10374,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10211
10374
  lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
10212
10375
  if (left.kind === "varRef" &&
10213
10376
  (ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
10214
- return { kind: "boolLit", value, type: BOOL, loc };
10377
+ return readsClassAfter(lowerer, targetInfo, expr.right, [], {
10378
+ kind: "boolLit",
10379
+ value,
10380
+ type: BOOL,
10381
+ loc,
10382
+ });
10215
10383
  }
10216
10384
  lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
10217
10385
  }
@@ -10361,13 +10529,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10361
10529
  }
10362
10530
  }
10363
10531
  if (left.type.kind !== "object") {
10364
- return {
10365
- kind: "seqExpr",
10366
- stmts: [{ kind: "exprStmt", expr: left, loc }],
10367
- result: { kind: "boolLit", value: false, type: BOOL, loc },
10532
+ return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
10533
+ kind: "boolLit",
10534
+ value: false,
10368
10535
  type: BOOL,
10369
10536
  loc,
10370
- };
10537
+ });
10371
10538
  }
10372
10539
  const lhsInfo = lowerer.classes.get(left.type.className);
10373
10540
  if (!lhsInfo)
@@ -10378,10 +10545,33 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10378
10545
  const value = left.type.className === target.def.name ||
10379
10546
  lowerer.isSubclassOf(left.type.className, target.def.name);
10380
10547
  if (left.kind === "varRef") {
10381
- return { kind: "boolLit", value, type: BOOL, loc };
10548
+ return readsClassAfter(lowerer, target, expr.right, [], {
10549
+ kind: "boolLit",
10550
+ value,
10551
+ type: BOOL,
10552
+ loc,
10553
+ });
10382
10554
  }
10383
10555
  lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
10384
10556
  }
10557
+ /** A statically decided `instanceof` still reads its class after the left
10558
+ * operand: a class with an initialization flag throws there before its
10559
+ * declaration ran. */
10560
+ function readsClassAfter(lowerer, target, right, stmts, result) {
10561
+ if (!lowerer.classInitFlags.has(target.def.name)) {
10562
+ if (stmts.length === 0)
10563
+ return result;
10564
+ return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
10565
+ }
10566
+ const read = lowerer.lowerExpr(right);
10567
+ return {
10568
+ kind: "seqExpr",
10569
+ stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
10570
+ result,
10571
+ type: result.type,
10572
+ loc: result.loc,
10573
+ };
10574
+ }
10385
10575
  /** `#name in obj` — the ergonomic brand check. In this closed world a
10386
10576
  * brand is held by exactly the instances of the declaring class
10387
10577
  * (subclasses included — construction always runs the declaring class's
@@ -10535,11 +10725,27 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
10535
10725
  return { kind: "boolLit", value, type: BOOL, loc };
10536
10726
  lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
10537
10727
  }
10728
+ /** The string keys every record inherits from Object.prototype. */
10729
+ const OBJECT_PROTOTYPE_KEYS = new Set([
10730
+ "constructor",
10731
+ "__defineGetter__",
10732
+ "__defineSetter__",
10733
+ "hasOwnProperty",
10734
+ "__lookupGetter__",
10735
+ "__lookupSetter__",
10736
+ "isPrototypeOf",
10737
+ "propertyIsEnumerable",
10738
+ "toString",
10739
+ "valueOf",
10740
+ "__proto__",
10741
+ "toLocaleString",
10742
+ ]);
10538
10743
  /** `"key" in v` — the key-presence test. Three lowered receivers:
10539
10744
  * process.env (getenv(3) presence — Node-exact, an empty value still
10540
10745
  * counts as present), and monomorphic record shapes, where the answer is
10541
10746
  * type-directed: a declared non-optional field is a compile-time `true`,
10542
- * a missing field (no index signature) a compile-time `false` — both
10747
+ * a missing field (no index signature) a compile-time `false` unless
10748
+ * Object.prototype has it — both
10543
10749
  * folds limited to side-effect-free receivers, the lowerInstanceOf rule —
10544
10750
  * and an OPTIONAL field (undefined-armed union) is a runtime presence
10545
10751
  * test on the slot: an omitted or deleted property is absent, while a
@@ -10789,7 +10995,11 @@ function lowerInExpression(lowerer, expr, loc) {
10789
10995
  break;
10790
10996
  }
10791
10997
  const f = shape.fields.find((x) => x.name === key);
10792
- if (f && f.type.kind === "union" && lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
10998
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
10999
+ if (f &&
11000
+ !inherited &&
11001
+ f.type.kind === "union" &&
11002
+ lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
10793
11003
  staticAnswers = false; // an optional slot: presence is per-value
10794
11004
  break;
10795
11005
  }
@@ -10797,7 +11007,7 @@ function lowerInExpression(lowerer, expr, loc) {
10797
11007
  // true without invoking the getter) — either slot present makes
10798
11008
  // the name a member.
10799
11009
  const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
10800
- answers.push({ tag, has: f !== undefined || acc });
11010
+ answers.push({ tag, has: f !== undefined || acc || inherited });
10801
11011
  }
10802
11012
  if (staticAnswers) {
10803
11013
  const pureRecv = recv.kind === "varRef" ||
@@ -10865,7 +11075,9 @@ function lowerInExpression(lowerer, expr, loc) {
10865
11075
  throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
10866
11076
  const field = shape.fields.find((f) => f.name === key);
10867
11077
  if (field) {
10868
- if (field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
11078
+ if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
11079
+ field.type.kind === "union" &&
11080
+ lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
10869
11081
  // Optional slot: the key is present unless the field is absent
10870
11082
  // (omitted or deleted); an explicit undefined is present.
10871
11083
  return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
@@ -10893,14 +11105,16 @@ function lowerInExpression(lowerer, expr, loc) {
10893
11105
  }
10894
11106
  lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
10895
11107
  }
10896
- if (shape.indexValue) {
11108
+ // Records are ordinary objects: Object.prototype's members are in them.
11109
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
11110
+ if (shape.indexValue && !inherited) {
10897
11111
  lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
10898
11112
  }
10899
11113
  if (recv.kind === "varRef" ||
10900
11114
  recv.kind === "recordGet" ||
10901
11115
  recv.kind === "fieldGet" ||
10902
11116
  pureRecvNode) {
10903
- return { kind: "boolLit", value: false, type: BOOL, loc };
11117
+ return { kind: "boolLit", value: inherited, type: BOOL, loc };
10904
11118
  }
10905
11119
  lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
10906
11120
  }
@@ -10953,7 +11167,36 @@ function lowerRuntimeKeyIn(lowerer, expr, loc) {
10953
11167
  // Overflow keys answer through the map's hashed presence probe (a
10954
11168
  // stored undefined value is still present), not a scan over a fresh
10955
11169
  // key snapshot, which made `k in dict` loops quadratic.
10956
- body.push(ret({ kind: "recordOvfHas", obj: r, shapeId: recvT.shapeId, key: k, type: BOOL, loc }));
11170
+ const ovfHas = {
11171
+ kind: "recordOvfHas",
11172
+ obj: r,
11173
+ shapeId: recvT.shapeId,
11174
+ key: k,
11175
+ type: BOOL,
11176
+ loc,
11177
+ };
11178
+ // A miss in the record's own keys still finds Object.prototype's.
11179
+ let inherited = ovfHas;
11180
+ for (const name of OBJECT_PROTOTYPE_KEYS) {
11181
+ if (shape.fields.some((f) => f.name === name))
11182
+ continue;
11183
+ inherited = {
11184
+ kind: "logical",
11185
+ op: "||",
11186
+ left: inherited,
11187
+ right: {
11188
+ kind: "strEq",
11189
+ negated: false,
11190
+ left: k,
11191
+ right: { kind: "strLit", value: name, type: STRING, loc },
11192
+ type: BOOL,
11193
+ loc,
11194
+ },
11195
+ type: BOOL,
11196
+ loc,
11197
+ };
11198
+ }
11199
+ body.push(ret(inherited));
10957
11200
  lowerer.liftedFns.push({
10958
11201
  name: helper,
10959
11202
  params: [
@@ -12866,6 +13109,7 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
12866
13109
  : lowerOptionalNumber(lowerer, rhs, loc);
12867
13110
  let value;
12868
13111
  const numericRead = lowerOptionalNumber(lowerer, read, loc, access);
13112
+ const bigintValue = rhsNode ? bigintCompoundValue(op, read, rhs, loc) : null;
12869
13113
  if (op === "+" && read.type.kind === "string") {
12870
13114
  value = {
12871
13115
  kind: "strConcat",
@@ -12878,6 +13122,9 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
12878
13122
  else if (numericRead.type.kind === "f64" && numericRhs.type.kind === "f64") {
12879
13123
  value = { kind: "bin", op, left: numericRead, right: numericRhs, type: F64, loc };
12880
13124
  }
13125
+ else if (bigintValue) {
13126
+ value = bigintValue;
13127
+ }
12881
13128
  else if (target.fieldType.kind === "dyn" && isJsSourceFile(access.getSourceFile())) {
12882
13129
  const numeric = ["-", "*", "/", "%", "**"].includes(op);
12883
13130
  const left = lowerer.coerceToExpected(read, DYN);