@scriptc/compiler 0.3.1 → 0.3.3

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 (492) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +832 -55
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/executable-features.js +1 -0
  5. package/dist/backend/executable-features.js.map +1 -1
  6. package/dist/backend/literals.d.ts +7 -0
  7. package/dist/backend/literals.js +32 -0
  8. package/dist/backend/literals.js.map +1 -1
  9. package/dist/backend/literals.test.js +17 -1
  10. package/dist/backend/literals.test.js.map +1 -1
  11. package/dist/backend/llvm/alloc.d.ts +15 -4
  12. package/dist/backend/llvm/alloc.js +63 -25
  13. package/dist/backend/llvm/alloc.js.map +1 -1
  14. package/dist/backend/llvm/alloc.test.js +62 -2
  15. package/dist/backend/llvm/alloc.test.js.map +1 -1
  16. package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
  17. package/dist/backend/llvm/appended-array-literals.js +109 -0
  18. package/dist/backend/llvm/appended-array-literals.js.map +1 -0
  19. package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
  20. package/dist/backend/llvm/appended-array-literals.test.js +90 -0
  21. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
  22. package/dist/backend/llvm/array-search.d.ts +8 -0
  23. package/dist/backend/llvm/array-search.js +52 -0
  24. package/dist/backend/llvm/array-search.js.map +1 -0
  25. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  26. package/dist/backend/llvm/array-search.test.js +72 -0
  27. package/dist/backend/llvm/array-search.test.js.map +1 -0
  28. package/dist/backend/llvm/call-lifetimes.d.ts +11 -1
  29. package/dist/backend/llvm/call-lifetimes.js +74 -4
  30. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.test.js +54 -0
  32. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  33. package/dist/backend/llvm/classes.js +97 -38
  34. package/dist/backend/llvm/classes.js.map +1 -1
  35. package/dist/backend/llvm/classes.test.js +2 -2
  36. package/dist/backend/llvm/common.d.ts +1 -1
  37. package/dist/backend/llvm/common.js +1 -1
  38. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  39. package/dist/backend/llvm/dense-array-access.js +18 -13
  40. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  41. package/dist/backend/llvm/dense-array-access.test.js +15 -2
  42. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  43. package/dist/backend/llvm/dyn.d.ts +6 -0
  44. package/dist/backend/llvm/dyn.js +84 -11
  45. package/dist/backend/llvm/dyn.js.map +1 -1
  46. package/dist/backend/llvm/emitter.d.ts +108 -16
  47. package/dist/backend/llvm/emitter.js +598 -108
  48. package/dist/backend/llvm/emitter.js.map +1 -1
  49. package/dist/backend/llvm/emitter.test.js +26 -3
  50. package/dist/backend/llvm/emitter.test.js.map +1 -1
  51. package/dist/backend/llvm/expr-async.js +174 -7
  52. package/dist/backend/llvm/expr-async.js.map +1 -1
  53. package/dist/backend/llvm/expr-bytes.js +11 -0
  54. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  55. package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
  56. package/dist/backend/llvm/expr-callbacks.js +96 -2
  57. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  58. package/dist/backend/llvm/expr-calls.d.ts +12 -1
  59. package/dist/backend/llvm/expr-calls.js +133 -54
  60. package/dist/backend/llvm/expr-calls.js.map +1 -1
  61. package/dist/backend/llvm/expr-containers.d.ts +7 -0
  62. package/dist/backend/llvm/expr-containers.js +80 -22
  63. package/dist/backend/llvm/expr-containers.js.map +1 -1
  64. package/dist/backend/llvm/expr-context.d.ts +2 -0
  65. package/dist/backend/llvm/expr-control.d.ts +8 -0
  66. package/dist/backend/llvm/expr-control.js +103 -69
  67. package/dist/backend/llvm/expr-control.js.map +1 -1
  68. package/dist/backend/llvm/expr-dynamic.js +21 -10
  69. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  70. package/dist/backend/llvm/expr-primitives.d.ts +7 -0
  71. package/dist/backend/llvm/expr-primitives.js +53 -51
  72. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  73. package/dist/backend/llvm/expr-records.js +19 -5
  74. package/dist/backend/llvm/expr-records.js.map +1 -1
  75. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  76. package/dist/backend/llvm/expr-stream-bridges.js +111 -39
  77. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  78. package/dist/backend/llvm/expr-stream-bridges.test.js +49 -1
  79. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  80. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  81. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  82. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  83. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  84. package/dist/backend/llvm/inline-unions.js +134 -0
  85. package/dist/backend/llvm/inline-unions.js.map +1 -0
  86. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  87. package/dist/backend/llvm/inline-unions.test.js +124 -0
  88. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  89. package/dist/backend/llvm/int32-abi.d.ts +18 -2
  90. package/dist/backend/llvm/int32-abi.js +23 -2
  91. package/dist/backend/llvm/int32-abi.js.map +1 -1
  92. package/dist/backend/llvm/int32-abi.test.js +75 -1
  93. package/dist/backend/llvm/int32-abi.test.js.map +1 -1
  94. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  95. package/dist/backend/llvm/integer-remainder.js +80 -9
  96. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  97. package/dist/backend/llvm/lib-dispatch.js +170 -28
  98. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  99. package/dist/backend/llvm/lib-filesystem.js +181 -5
  100. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  101. package/dist/backend/llvm/lib-network.js +9 -6
  102. package/dist/backend/llvm/lib-network.js.map +1 -1
  103. package/dist/backend/llvm/lib-process.js +2 -2
  104. package/dist/backend/llvm/lib-process.js.map +1 -1
  105. package/dist/backend/llvm/lib-shared.js +208 -9
  106. package/dist/backend/llvm/lib-shared.js.map +1 -1
  107. package/dist/backend/llvm/lib-stream.js +97 -0
  108. package/dist/backend/llvm/lib-stream.js.map +1 -1
  109. package/dist/backend/llvm/local-array-reads.js +12 -6
  110. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  111. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  112. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  113. package/dist/backend/llvm/local-union-storage.d.ts +26 -2
  114. package/dist/backend/llvm/local-union-storage.js +132 -12
  115. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  116. package/dist/backend/llvm/local-union-storage.test.js +107 -1
  117. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  118. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  119. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  120. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  121. package/dist/backend/llvm/map-number-lookup.d.ts +20 -0
  122. package/dist/backend/llvm/map-number-lookup.js +66 -0
  123. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  124. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  125. package/dist/backend/llvm/map-number-lookup.test.js +102 -0
  126. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  127. package/dist/backend/llvm/map-read-lifetimes.js +1 -0
  128. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  129. package/dist/backend/llvm/publish.d.ts +4 -0
  130. package/dist/backend/llvm/publish.js +3 -1
  131. package/dist/backend/llvm/publish.js.map +1 -1
  132. package/dist/backend/llvm/record-results.d.ts +29 -0
  133. package/dist/backend/llvm/record-results.js +260 -0
  134. package/dist/backend/llvm/record-results.js.map +1 -0
  135. package/dist/backend/llvm/reference-effects.js +15 -0
  136. package/dist/backend/llvm/reference-effects.js.map +1 -1
  137. package/dist/backend/llvm/reference-writes.js +29 -9
  138. package/dist/backend/llvm/reference-writes.js.map +1 -1
  139. package/dist/backend/llvm/regions.d.ts +68 -0
  140. package/dist/backend/llvm/regions.js +314 -0
  141. package/dist/backend/llvm/regions.js.map +1 -0
  142. package/dist/backend/llvm/regions.test.d.ts +1 -0
  143. package/dist/backend/llvm/regions.test.js +173 -0
  144. package/dist/backend/llvm/regions.test.js.map +1 -0
  145. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  146. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  147. package/dist/backend/llvm/shapes.d.ts +86 -13
  148. package/dist/backend/llvm/shapes.js +208 -54
  149. package/dist/backend/llvm/shapes.js.map +1 -1
  150. package/dist/backend/llvm/shapes.test.js +68 -9
  151. package/dist/backend/llvm/shapes.test.js.map +1 -1
  152. package/dist/backend/llvm/split-loops.js +1 -1
  153. package/dist/backend/llvm/split-loops.js.map +1 -1
  154. package/dist/backend/llvm/stack-objects.d.ts +29 -0
  155. package/dist/backend/llvm/stack-objects.js +142 -0
  156. package/dist/backend/llvm/stack-objects.js.map +1 -0
  157. package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
  158. package/dist/backend/llvm/stack-objects.test.js +255 -0
  159. package/dist/backend/llvm/stack-objects.test.js.map +1 -0
  160. package/dist/backend/llvm/string-reads.d.ts +4 -1
  161. package/dist/backend/llvm/string-reads.js +89 -9
  162. package/dist/backend/llvm/string-reads.js.map +1 -1
  163. package/dist/backend/llvm/switch-dispatch.js +5 -4
  164. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  165. package/dist/backend/llvm/walkers.d.ts +13 -0
  166. package/dist/backend/llvm/walkers.js +108 -10
  167. package/dist/backend/llvm/walkers.js.map +1 -1
  168. package/dist/backend/may-throw.js +10 -4
  169. package/dist/backend/may-throw.js.map +1 -1
  170. package/dist/backend/native/contracts.d.ts +7 -2
  171. package/dist/backend/native/executable.js +28 -2
  172. package/dist/backend/native/executable.js.map +1 -1
  173. package/dist/backend/native/library.js +1 -1
  174. package/dist/backend/native/library.js.map +1 -1
  175. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  176. package/dist/backend/native/runtime-inputs.js +3 -0
  177. package/dist/backend/native/runtime-inputs.js.map +1 -1
  178. package/dist/backend/native-link-info-core.d.ts +1 -0
  179. package/dist/backend/native-link-info-core.js.map +1 -1
  180. package/dist/backend/native-toolchain.test.js +1 -1
  181. package/dist/backend/native-toolchain.test.js.map +1 -1
  182. package/dist/backend/runtime-abi.d.ts +2 -2
  183. package/dist/backend/runtime-abi.js +2 -2
  184. package/dist/backend/runtime-pack-core.d.ts +1 -0
  185. package/dist/backend/runtime-pack-core.js +1 -0
  186. package/dist/backend/runtime-pack-core.js.map +1 -1
  187. package/dist/backend/runtime-pack-targets.test.js +1 -1
  188. package/dist/backend/runtime-pack.test.js +1 -1
  189. package/dist/backend/target-diagnostics.js +17 -0
  190. package/dist/backend/target-diagnostics.js.map +1 -1
  191. package/dist/backend/target-diagnostics.test.js +16 -0
  192. package/dist/backend/target-diagnostics.test.js.map +1 -1
  193. package/dist/compat/fetch-profile.js +4 -4
  194. package/dist/compat/fetch-profile.js.map +1 -1
  195. package/dist/contracts/check.js +2 -0
  196. package/dist/contracts/check.js.map +1 -1
  197. package/dist/coverage/report.js +1 -1
  198. package/dist/coverage/report.js.map +1 -1
  199. package/dist/diagnostics/diagnostic.d.ts +6 -5
  200. package/dist/diagnostics/diagnostic.js +7 -6
  201. package/dist/diagnostics/diagnostic.js.map +1 -1
  202. package/dist/executable/executable-cache.d.ts +1 -0
  203. package/dist/executable/executable-cache.js.map +1 -1
  204. package/dist/frontend/builtin-modules.d.ts +1 -1
  205. package/dist/frontend/builtin-modules.js +1 -0
  206. package/dist/frontend/builtin-modules.js.map +1 -1
  207. package/dist/frontend/comptime-node.js +2 -2
  208. package/dist/frontend/comptime-node.js.map +1 -1
  209. package/dist/frontend/experimental-import.d.ts +12 -0
  210. package/dist/frontend/experimental-import.js +63 -0
  211. package/dist/frontend/experimental-import.js.map +1 -0
  212. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  213. package/dist/frontend/lowering/binding-analysis.js +1 -1
  214. package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
  215. package/dist/frontend/lowering/builtin-calls.js +36 -0
  216. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  218. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  219. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  221. package/dist/frontend/lowering/builtins/blob.js +167 -0
  222. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  223. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  224. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  225. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  226. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  227. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  228. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/compression.js +3 -2
  230. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/console.d.ts +16 -6
  232. package/dist/frontend/lowering/builtins/console.js +33 -9
  233. package/dist/frontend/lowering/builtins/console.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/crypto.js +415 -120
  235. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  236. package/dist/frontend/lowering/builtins/errors.js +20 -0
  237. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  238. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  239. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  240. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  241. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  242. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  243. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  244. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  245. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  246. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  247. package/dist/frontend/lowering/builtins/json.d.ts +2 -2
  248. package/dist/frontend/lowering/builtins/json.js +13 -4
  249. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  250. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  251. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  252. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  253. package/dist/frontend/lowering/builtins/module-calls.js +60 -12
  254. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  255. package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
  256. package/dist/frontend/lowering/builtins/numbers.js +17 -0
  257. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
  259. package/dist/frontend/lowering/builtins/operating-system.js +361 -1
  260. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  261. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  262. package/dist/frontend/lowering/builtins/performance.js +340 -5
  263. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  265. package/dist/frontend/lowering/builtins/process.js +122 -17
  266. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/promises.js +109 -2
  268. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  270. package/dist/frontend/lowering/builtins/properties.js +39 -11
  271. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  273. package/dist/frontend/lowering/builtins/readline.js +266 -90
  274. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
  276. package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
  277. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  278. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  279. package/dist/frontend/lowering/builtins/url.js +36 -0
  280. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  281. package/dist/frontend/lowering/call-arguments.js +1 -1
  282. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  283. package/dist/frontend/lowering/call-signatures.js +20 -2
  284. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  285. package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
  286. package/dist/frontend/lowering/checked-promise-all.js +52 -6
  287. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  288. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +8 -3
  289. package/dist/frontend/lowering/class-dynamic-dispatch.js +159 -32
  290. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  291. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  292. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  293. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  294. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  295. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  296. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  297. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  298. package/dist/frontend/lowering/coercions/structural.js +3 -3
  299. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  300. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  301. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  302. package/dist/frontend/lowering/containers/array-callbacks.js +33 -6
  303. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  304. package/dist/frontend/lowering/containers/array-construction.js +8 -4
  305. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  306. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  307. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  308. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  309. package/dist/frontend/lowering/containers/array-pipelines.js +1 -1
  310. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  311. package/dist/frontend/lowering/containers/bytes.js +38 -26
  312. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  313. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  314. package/dist/frontend/lowering/containers/for-of.js +5 -1
  315. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  316. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  317. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  318. package/dist/frontend/lowering/containers/string-and-regexp.js +91 -0
  319. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  320. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  321. package/dist/frontend/lowering/crypto-tables.js +77 -12
  322. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  323. package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
  324. package/dist/frontend/lowering/cycle-initialization.js +166 -12
  325. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  326. package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
  327. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  328. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  329. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  330. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  331. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  332. package/dist/frontend/lowering/expressions/object-literals.js +21 -68
  333. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  334. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  335. package/dist/frontend/lowering/generator-delegation.js +231 -10
  336. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  337. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  338. package/dist/frontend/lowering/generic-functions.js +2 -2
  339. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  340. package/dist/frontend/lowering/http2-constants.js +1 -1
  341. package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
  342. package/dist/frontend/lowering/lifetime-regions.js +216 -0
  343. package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
  344. package/dist/frontend/lowering/lower-array-sort.d.ts +40 -3
  345. package/dist/frontend/lowering/lower-array-sort.js +661 -194
  346. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  347. package/dist/frontend/lowering/lower-array-sort.test.js +103 -4
  348. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  349. package/dist/frontend/lowering/lower-assert.js +2 -2
  350. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  351. package/dist/frontend/lowering/lower-async-iteration.js +248 -2
  352. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  353. package/dist/frontend/lowering/lower-calls.js +173 -111
  354. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  355. package/dist/frontend/lowering/lower-classes.d.ts +12 -5
  356. package/dist/frontend/lowering/lower-classes.js +156 -11
  357. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  358. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  359. package/dist/frontend/lowering/lower-comptime.js +4 -4
  360. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  361. package/dist/frontend/lowering/lower-console.d.ts +13 -0
  362. package/dist/frontend/lowering/lower-console.js +460 -4
  363. package/dist/frontend/lowering/lower-console.js.map +1 -1
  364. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
  365. package/dist/frontend/lowering/lower-event-emitter.js +124 -38
  366. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  367. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  368. package/dist/frontend/lowering/lower-event-target.js +362 -0
  369. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  370. package/dist/frontend/lowering/lower-expando.js +2 -2
  371. package/dist/frontend/lowering/lower-exprs.js +247 -42
  372. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  373. package/dist/frontend/lowering/lower-generators.d.ts +15 -7
  374. package/dist/frontend/lowering/lower-generators.js +183 -99
  375. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  376. package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
  377. package/dist/frontend/lowering/lower-inspect.js +247 -28
  378. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  379. package/dist/frontend/lowering/lower-mixins.js +1 -1
  380. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  381. package/dist/frontend/lowering/lower-modules.js +27 -17
  382. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  383. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  384. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  385. package/dist/frontend/lowering/lower-server.js +39 -14
  386. package/dist/frontend/lowering/lower-server.js.map +1 -1
  387. package/dist/frontend/lowering/lower-stdlib.d.ts +11 -1
  388. package/dist/frontend/lowering/lower-stdlib.js +45 -4
  389. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  390. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  391. package/dist/frontend/lowering/lower-stmts.js +112 -23
  392. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  393. package/dist/frontend/lowering/lower-stream.js +234 -22
  394. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  395. package/dist/frontend/lowering/lower-timers.js +1 -1
  396. package/dist/frontend/lowering/lowerer.d.ts +45 -6
  397. package/dist/frontend/lowering/lowerer.js +360 -48
  398. package/dist/frontend/lowering/lowerer.js.map +1 -1
  399. package/dist/frontend/lowering/native-ffi.js +2 -2
  400. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  401. package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
  402. package/dist/frontend/lowering/regex-span-reads.js +164 -0
  403. package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
  404. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  405. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  406. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  407. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  408. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  409. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  410. package/dist/frontend/lowering/surfaces.d.ts +7 -3
  411. package/dist/frontend/lowering/surfaces.js +385 -32
  412. package/dist/frontend/lowering/surfaces.js.map +1 -1
  413. package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
  414. package/dist/frontend/lowering/var-hoisting.js +261 -0
  415. package/dist/frontend/lowering/var-hoisting.js.map +1 -0
  416. package/dist/frontend/module-syntax.d.ts +1 -1
  417. package/dist/frontend/module-syntax.js +1 -1
  418. package/dist/frontend/npm-static-prune.js +1 -1
  419. package/dist/frontend/npm-static-prune.js.map +1 -1
  420. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  421. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  422. package/dist/frontend/pipeline.js +6 -4
  423. package/dist/frontend/pipeline.js.map +1 -1
  424. package/dist/frontend/program.d.ts +6 -5
  425. package/dist/frontend/program.js +42 -22
  426. package/dist/frontend/program.js.map +1 -1
  427. package/dist/frontend/program.test.js +13 -0
  428. package/dist/frontend/program.test.js.map +1 -1
  429. package/dist/frontend/resolve.js +1 -1
  430. package/dist/frontend/ts7/adapter.js +1 -1
  431. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  432. package/dist/frontend/ts7/ast-bytes.js +1 -1
  433. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  434. package/dist/frontend/ts7/semantic-json.js +1 -1
  435. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  436. package/dist/frontend/ts7/world-check.js +1 -1
  437. package/dist/frontend/tsc-codes.js +2 -2
  438. package/dist/frontend/tsc-codes.js.map +1 -1
  439. package/dist/frontend/type-mapper.d.ts +28 -1
  440. package/dist/frontend/type-mapper.js +288 -30
  441. package/dist/frontend/type-mapper.js.map +1 -1
  442. package/dist/index.js +6 -4
  443. package/dist/index.js.map +1 -1
  444. package/dist/ir/analysis.d.ts +12 -6
  445. package/dist/ir/analysis.js +26 -10
  446. package/dist/ir/analysis.js.map +1 -1
  447. package/dist/ir/analysis.test.js +15 -3
  448. package/dist/ir/analysis.test.js.map +1 -1
  449. package/dist/ir/builtin-effects.js +108 -2
  450. package/dist/ir/builtin-effects.js.map +1 -1
  451. package/dist/ir/builtin-signatures.d.ts +1 -1
  452. package/dist/ir/builtin-signatures.js +436 -53
  453. package/dist/ir/builtin-signatures.js.map +1 -1
  454. package/dist/ir/function-references.test.js +1 -0
  455. package/dist/ir/function-references.test.js.map +1 -1
  456. package/dist/ir/int32-slots.js +2 -0
  457. package/dist/ir/int32-slots.js.map +1 -1
  458. package/dist/ir/intrinsic-signatures.js +2 -0
  459. package/dist/ir/intrinsic-signatures.js.map +1 -1
  460. package/dist/ir/ir.d.ts +129 -36
  461. package/dist/ir/ir.js +42 -1
  462. package/dist/ir/ir.js.map +1 -1
  463. package/dist/ir/runtime-features.d.ts +1 -0
  464. package/dist/ir/runtime-features.js +116 -5
  465. package/dist/ir/runtime-features.js.map +1 -1
  466. package/dist/ir/scalar-records.js +1 -2
  467. package/dist/ir/scalar-records.js.map +1 -1
  468. package/dist/ir/serialize.js +1 -1
  469. package/dist/ir/serialize.js.map +1 -1
  470. package/dist/ir/traverse.js +1 -0
  471. package/dist/ir/traverse.js.map +1 -1
  472. package/dist/ir/validate.js +250 -34
  473. package/dist/ir/validate.js.map +1 -1
  474. package/dist/ir/validate.test.js +125 -0
  475. package/dist/ir/validate.test.js.map +1 -1
  476. package/dist/library/fence-eval.d.ts +1 -1
  477. package/dist/library/fence-eval.js +5 -4
  478. package/dist/library/fence-eval.js.map +1 -1
  479. package/dist/library/ir-policy.js +11 -4
  480. package/dist/library/ir-policy.js.map +1 -1
  481. package/dist/library/library-profile.js +13 -13
  482. package/dist/library/library-profile.js.map +1 -1
  483. package/dist/library/prepare.js +1 -1
  484. package/dist/library/prepare.js.map +1 -1
  485. package/dist/library/sidecar.js +3 -3
  486. package/dist/library/sidecar.js.map +1 -1
  487. package/dist/native/prepare.js +3 -2
  488. package/dist/native/prepare.js.map +1 -1
  489. package/dist/native/sanitizer.test.js +1 -0
  490. package/dist/native/sanitizer.test.js.map +1 -1
  491. package/package.json +20 -20
  492. package/surface-manifest.json +537 -142
@@ -1,8 +1,15 @@
1
+ import { lowerProtocolPropertyRead } from "./class-protocol-dispatch.js";
1
2
  import { generatorDrain } from "./iterator-adapters.js";
3
+ import { lowerEventObjectProperty, lowerEventObjectPropertyWrite } from "./lower-event-target.js";
4
+ import { lowerEventStaticProperty } from "./builtins/numbers.js";
2
5
  import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
3
6
  import { isOptionalProcessStreamProperty } from "./builtins/process.js";
4
7
  import { lowerWorkerMetadata } from "./builtins/workers.js";
8
+ import { lowerBlobInstanceof } from "./builtins/blob.js";
9
+ import { lowerKeyObjectInstanceof } from "./builtins/key-object.js";
10
+ import { STATS_TYPE_TESTS } from "./builtins/filesystem.js";
5
11
  import { threadsImportOf } from "../threads-import.js";
12
+ import { experimentalImportOf, lifetimeRegionMemberOf } from "../experimental-import.js";
6
13
  import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../ir/build.js";
7
14
  import { InternalCompilerError } from "../../errors.js";
8
15
  import { SYMBOL_T } from "../../ir/ir.js";
@@ -22,7 +29,7 @@ import { checkedClassAssertion, checkedClassUnionAssertion } from "./class-asser
22
29
  import { checkedArmExtraction } from "./coercions/unions.js";
23
30
  import { narrowClassUnion, narrowStoredClassValue } from "./class-unions.js";
24
31
  import { lowerUnionFieldRead, lowerUnionFieldWrite } from "./expressions/union-fields.js";
25
- import { captureContextArguments } from "./function-context.js";
32
+ import { captureContextArguments, declareContextLocal } from "./function-context.js";
26
33
  import { OBJECT_CALLABLE_VALUES } from "./surfaces.js";
27
34
  import { wasiGuestPath } from "../../wasi-paths.js";
28
35
  import { BIGINT_T, BYTES_ELEMENT_NAME, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, REF_TRUTHY_KINDS, REGEX, RUNTIME_ERROR_CLASSES, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, canAdaptDynFuncTo, canDynCheckTo, canBoxFuncIntoDyn, funcOf, isDynTypedRefType, isSupportedArrayElem, isUnitType, shapeHasAccessorSlots, typeEquals, typeKey, unionContainerArmsOk, } from "../../ir/ir.js";
@@ -48,8 +55,8 @@ import { funcTypeFromParamShapes } from "./call-signatures.js";
48
55
  import { implicitMonoFile, objLitGenericFnInfoOf, objLitGenericFnNodeOf, requireObjLitGenericReceiver, } from "./generic-functions.js";
49
56
  import { lowerTaggedTemplate } from "./lower-calls.js";
50
57
  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";
58
+ import { isConstAssertionTypeNode, isGenericCallableMemberType, isLegacyUrlSymbol, isOsConstantsType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
59
+ import { iteratorResultValueRead, lowerYield } from "./lower-generators.js";
53
60
  import { errorPropertyRead, errorPropertyWrite, errorToStringCall } from "./error-methods.js";
54
61
  import { lowerStreamProperty, lowerStreamStateProperty, streamSidesOf } from "./lower-stream.js";
55
62
  import { unionWideningTags } from "../../ir/analysis.js";
@@ -77,6 +84,7 @@ import { lowerUrlAssignment } from "./builtins/url.js";
77
84
  import { jsBindingHasOpenWrites } from "./lower-stmts.js";
78
85
  import { checkedClassInstanceOf } from "./class-construction.js";
79
86
  import { lowerModuleNamespaceElement } from "./module-namespace-elements.js";
87
+ import { isPerfEntryType, perfEntryTag } from "./builtins/performance.js";
80
88
  /** A template piece's RAW text (String.raw's contract: escapes stay
81
89
  * characters). 7's client AST ships no rawText at runtime (the typing
82
90
  * declares it; the serialized node data omits it), so the raw span comes
@@ -731,7 +739,9 @@ function lowerExprInner(lowerer, expr) {
731
739
  lowerer.unions.get(g.type.unionId)?.arms.length === 2 &&
732
740
  lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "f64") &&
733
741
  lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "string");
742
+ const symbol = lowerer.resolveValueSymbol(expr);
734
743
  if (!arithmeticUnion &&
744
+ !(symbol !== null && lowerer.earlyReadVars.has(symbol)) &&
735
745
  g.type.kind === "union" &&
736
746
  narrowed &&
737
747
  narrowed.kind !== "union" &&
@@ -849,6 +859,8 @@ function lowerExprInner(lowerer, expr) {
849
859
  return { kind: "boolLit", value: true, type: BOOL, loc };
850
860
  if (member === "publish")
851
861
  lowerer.noLowering("publish (@scriptc/threads) as a value", expr, "call publish(value) directly");
862
+ if (experimentalImportOf(lowerer.program, expr) === "LifetimeRegion")
863
+ lowerer.noLowering("LifetimeRegion (@scriptc/experimental) as a value", expr, "construct regions with new LifetimeRegion()");
852
864
  }
853
865
  {
854
866
  const bi = lowerer.builtinImportOf(expr);
@@ -872,6 +884,9 @@ function lowerExprInner(lowerer, expr) {
872
884
  if (bi.module === "http" && bi.member === "STATUS_CODES") {
873
885
  return { kind: "libCall", fn: "http.statusCodes", args: [], type: DYN, loc };
874
886
  }
887
+ if (bi.module === "os" && bi.member === "constants") {
888
+ return { kind: "libCall", fn: "os.constants", args: [], type: DYN, loc };
889
+ }
875
890
  // tls.rootCertificates: a runtime-valued module constant (the
876
891
  // cached bundled-CA array) — the one member read that lowers
877
892
  // to a libCall instead of a baked literal.
@@ -1413,6 +1428,11 @@ function lowerExprInner(lowerer, expr) {
1413
1428
  if (ts.isConditionalExpression(expr))
1414
1429
  return lowerTernary(lowerer, expr);
1415
1430
  if (ts.isPropertyAccessExpression(expr)) {
1431
+ {
1432
+ const member = lifetimeRegionMemberOf(lowerer.program, expr, lowerer.experimentalFiles);
1433
+ if (member !== null)
1434
+ lowerer.noLowering(`LifetimeRegion.${member} (@scriptc/experimental) as a value`, expr, `call region.${member}(${member === "run" ? "fn" : ""}) directly`);
1435
+ }
1416
1436
  // Expando statics may still be absent even when JS inference sees
1417
1437
  // the eventual assignment's scalar type. Preserve the checked value.
1418
1438
  const staticField = lowerStaticFieldRead(lowerer, expr);
@@ -1772,7 +1792,7 @@ function lowerExprInner(lowerer, expr) {
1772
1792
  // attached this name to it (`exports.<name> =` nowhere in the
1773
1793
  // file), the honest answer is undefined. tsc types the read off the
1774
1794
  // REPLACEMENT (its CJS model is identity-blind), which is exactly
1775
- // the silent divergence this lowering closes. Reads in modules with
1795
+ // the undiagnosed divergence this lowering closes. Reads in modules with
1776
1796
  // real `exports.<name> =` attachments keep their fences.
1777
1797
  {
1778
1798
  const ex = lowerReplacedExportsRead(lowerer, expr);
@@ -1787,6 +1807,13 @@ function lowerExprInner(lowerer, expr) {
1787
1807
  if (tm)
1788
1808
  return tm;
1789
1809
  }
1810
+ // Property signatures of class-backed protocols read implementing
1811
+ // classes' fields directly.
1812
+ if (!hasOptionalChainGuard(expr.expression)) {
1813
+ const typed = lowerProtocolPropertyRead(lowerer, expr);
1814
+ if (typed)
1815
+ return typed;
1816
+ }
1790
1817
  const handled = lowerer.lowerProcessEnvGet(expr) ??
1791
1818
  lowerer.lowerServerProperty(expr) ??
1792
1819
  // diagnostics_channel Channel receivers — name/hasSubscribers
@@ -1809,6 +1836,7 @@ function lowerExprInner(lowerer, expr) {
1809
1836
  lowerer.lowerJsonProperty(expr) ??
1810
1837
  lowerer.lowerErrorCodeProperty(expr) ??
1811
1838
  lowerer.lowerNumberStaticProperty(expr) ??
1839
+ lowerEventStaticProperty(lowerer, expr) ??
1812
1840
  lowerer.lowerMathProperty(expr) ??
1813
1841
  lowerer.lowerIntrinsicProperty(expr) ??
1814
1842
  // The _readableState/_writableState scalar READS (the suite's
@@ -1816,6 +1844,7 @@ function lowerExprInner(lowerer, expr) {
1816
1844
  // the inner access maps no type of its own.
1817
1845
  lowerStreamStateProperty(lowerer, expr) ??
1818
1846
  lowerStreamObjectProperty(lowerer, expr) ??
1847
+ lowerEventObjectProperty(lowerer, expr) ??
1819
1848
  lowerer.lowerUnionProperty(expr) ??
1820
1849
  lowerer.lowerFieldRead(expr);
1821
1850
  // A union-typed field read narrows like an identifier when the
@@ -1831,7 +1860,7 @@ function lowerExprInner(lowerer, expr) {
1831
1860
  // arm is real (`obj.n = bytes[i]; obj.n` is undefined in Node).
1832
1861
  if (runtimeOptionalClassField(lowerer, handled, expr))
1833
1862
  return handled;
1834
- return lowerer.maybeNarrow(handled, expr);
1863
+ return iteratorResultValueRead(lowerer, handled, expr) ?? lowerer.maybeNarrow(handled, expr);
1835
1864
  }
1836
1865
  // `globalThis.<name>` that no lowering above claimed
1837
1866
  // (globalThis.crypto, globalThis.SubtleCrypto, globalThis.localStorage
@@ -2021,14 +2050,15 @@ function lowerExprInner(lowerer, expr) {
2021
2050
  const shape = lowerer.shapes.get(recv.type.shapeId);
2022
2051
  const field = shape?.fields.find((f) => f.name === expr.name.text);
2023
2052
  if (field) {
2024
- return lowerer.maybeNarrow({
2053
+ const read = {
2025
2054
  kind: "recordGet",
2026
2055
  obj: recv,
2027
2056
  shapeId: recv.type.shapeId,
2028
2057
  field: field.name,
2029
2058
  type: field.type,
2030
2059
  loc,
2031
- }, expr);
2060
+ };
2061
+ return iteratorResultValueRead(lowerer, read, expr) ?? lowerer.maybeNarrow(read, expr);
2032
2062
  }
2033
2063
  }
2034
2064
  }
@@ -2055,9 +2085,15 @@ function lowerExprInner(lowerer, expr) {
2055
2085
  const segmentDataProperty = segmentDataSymbol?.name === "SegmentData" &&
2056
2086
  lowerer.isStdlibSymbol(segmentDataSymbol) &&
2057
2087
  ["segment", "index", "input", "isWordLike"].includes(expr.name.text);
2088
+ // os.constants members vary by platform (the declared groups list
2089
+ // every platform's names): a number member reads as `number |
2090
+ // undefined`, like an array element, and a group stays checked.
2091
+ const osConstants = isOsConstantsType(lowerer.typeOf(expr.expression), lowerer);
2058
2092
  if (isParseArgsDynProperty(lowerer, expr) ||
2059
2093
  isStatFsDynProperty(lowerer, expr) ||
2060
- segmentDataProperty) {
2094
+ segmentDataProperty ||
2095
+ osConstants ||
2096
+ isLegacyUrlSymbol(lowerer.checker.getSymbolAtLocation(expr.name), lowerer)) {
2061
2097
  const recv = lowerer.lowerExpr(expr.expression);
2062
2098
  if (recv.type.kind === "dyn") {
2063
2099
  const key = {
@@ -2067,14 +2103,20 @@ function lowerExprInner(lowerer, expr) {
2067
2103
  loc: locOf(expr.name),
2068
2104
  };
2069
2105
  const opt = hasOptionalChainGuard(expr.expression);
2070
- return lowerer.maybeNarrow({
2106
+ const read = {
2071
2107
  kind: "dynKeyGet",
2072
2108
  key,
2073
2109
  ...(opt ? { optional: true } : {}),
2074
2110
  value: recv,
2075
2111
  type: DYN,
2076
2112
  loc,
2077
- }, expr);
2113
+ };
2114
+ if (osConstants) {
2115
+ return lowerer.mapTypeOf(lowerer.typeOf(expr))?.kind === "f64"
2116
+ ? lowerer.coerceToExpected(read, lowerer.withUndefinedArm(F64))
2117
+ : read;
2118
+ }
2119
+ return lowerer.maybeNarrow(read, expr);
2078
2120
  }
2079
2121
  }
2080
2122
  // A member read through a NULLISH generic binding (`const i: I<A &
@@ -4286,10 +4328,10 @@ export function lowerIntrinsicProperty(lowerer, expr) {
4286
4328
  const receiver = lowerer.lowerExpr(expr.expression);
4287
4329
  return { kind: "libCall", fn: "stats.size", args: [receiver], type: F64, loc: locOf(expr) };
4288
4330
  }
4289
- if (name === "isFile" || name === "isDirectory") {
4331
+ if (Object.hasOwn(STATS_TYPE_TESTS, name)) {
4290
4332
  lowerer.unsupported("SC1090", expr, `Stats methods as values (call '${name}' directly)`);
4291
4333
  }
4292
- lowerer.noLowering(`Stats.${name}`, expr, "isFile(), isDirectory(), isSymbolicLink(), dev, ino, size, blocks, nlink, atimeMs, mtimeMs, and ctimeMs are the supported Stats members", lowerer.checker.getSymbolAtLocation(expr.name));
4334
+ lowerer.noLowering(`Stats.${name}`, expr, "isFile(), isDirectory(), isSymbolicLink(), isBlockDevice(), isCharacterDevice(), isFIFO(), isSocket(), dev, mode, nlink, uid, gid, rdev, blksize, ino, size, blocks, atimeMs, mtimeMs, ctimeMs, birthtimeMs, atime, mtime, ctime, and birthtime are the supported Stats members", lowerer.checker.getSymbolAtLocation(expr.name));
4293
4335
  }
4294
4336
  if (kind === "date") {
4295
4337
  const methods = new Set([
@@ -7122,6 +7164,8 @@ export function ensureString(lowerer, e, node) {
7122
7164
  // prints its elements like an array (not lowered — fenced) — every
7123
7165
  // other record is Object.prototype.toString's constant.
7124
7166
  const shape = lowerer.shapes.get(e.type.shapeId);
7167
+ if (isPerfEntryType(lowerer, e.type))
7168
+ return perfEntryTag(lowerer, e, e.type, e.loc);
7125
7169
  if (shape && !shape.tuple && !shape.fields.some((f) => f.name === "toString")) {
7126
7170
  return { kind: "toString", operand: e, type: STRING, loc: e.loc };
7127
7171
  }
@@ -7272,7 +7316,23 @@ export function lowerAsExpression(lowerer, expr) {
7272
7316
  lowerer.unsupported("SC1090", expr, "opaque structural views of classes or accessor records (name the property's concrete type to retain native accessor dispatch)");
7273
7317
  }
7274
7318
  const boxed = lowerer.coerceInto(expr, inner, DYN);
7275
- return boxed.kind === "dynFrom" ? { ...boxed, liveRef: true } : boxed;
7319
+ // Only references box live; a scalar or unit source (`value as
7320
+ // unknown as View`) is an ordinary snapshot.
7321
+ const seen = new Set();
7322
+ const live = (type) => {
7323
+ if (type.kind === "record" ||
7324
+ type.kind === "array" ||
7325
+ type.kind === "bytes" ||
7326
+ isDynTypedRefType(type))
7327
+ return true;
7328
+ if (type.kind !== "union" || seen.has(type.unionId))
7329
+ return false;
7330
+ seen.add(type.unionId);
7331
+ return lowerer.unions.get(type.unionId)?.arms.some(live) ?? false;
7332
+ };
7333
+ return boxed.kind === "dynFrom" && live(boxed.value.type)
7334
+ ? { ...boxed, liveRef: true }
7335
+ : boxed;
7276
7336
  }
7277
7337
  // Collection assertions are interface views only: their backing
7278
7338
  // value must already have the same native key/element/value layout.
@@ -7916,6 +7976,13 @@ export function lowerBinary(lowerer, expr) {
7916
7976
  if (ts.isPropertyAccessExpression(expr.left) || ts.isElementAccessExpression(expr.left)) {
7917
7977
  fenceNodeModuleMutation(lowerer, expr.left, "assignment");
7918
7978
  }
7979
+ // The writable Event accessors on Event subclass instances, in value
7980
+ // position (`const r = (event.returnValue = false)`).
7981
+ if (op === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(expr.left)) {
7982
+ const eventWrite = lowerEventObjectPropertyWrite(lowerer, expr.left, expr.right);
7983
+ if (eventWrite)
7984
+ return eventWrite;
7985
+ }
7919
7986
  // `x = e` in EXPRESSION position (`while ((idx = s.indexOf("\n")) !== -1)`,
7920
7987
  // `f(x = v)`): evaluate e once, write the binding, yield the assigned
7921
7988
  // value — JS evaluation order. Variable targets only (locals and module
@@ -8252,14 +8319,24 @@ export function lowerBinary(lowerer, expr) {
8252
8319
  reference.kind === "union" ||
8253
8320
  DYN_HANDLE_KINDS.has(reference.kind)) &&
8254
8321
  lowerer.dynConvertible(reference)) {
8322
+ // Records, arrays and byte views compare by the capsule identity
8323
+ // their dyn reads produce, including when they arrive through a
8324
+ // union (an optional array field read from a typed record).
8325
+ const liveArm = (type) => {
8326
+ if (type.kind === "array" || type.kind === "bytes")
8327
+ return true;
8328
+ const shape = type.kind === "record" ? lowerer.shapes.get(type.shapeId) : undefined;
8329
+ return !!shape && (shape.fields.length > 0 || shape.indexValue !== undefined);
8330
+ };
8255
8331
  const boxed = {
8256
8332
  kind: "dynFrom",
8257
8333
  value: scalarSide,
8258
8334
  type: DYN,
8259
8335
  loc: scalarSide.loc,
8260
8336
  ...(reference.kind === "record" ||
8261
- reference.kind === "array" ||
8262
- reference.kind === "bytes"
8337
+ liveArm(reference) ||
8338
+ (reference.kind === "union" &&
8339
+ (lowerer.unions.get(reference.unionId)?.arms.some(liveArm) ?? false))
8263
8340
  ? { liveRef: true }
8264
8341
  : {}),
8265
8342
  };
@@ -8523,8 +8600,8 @@ export function lowerBinary(lowerer, expr) {
8523
8600
  // the checker typed the binding as `string`. An optional string is not
8524
8601
  // itself a string operand for `+`: `undefined + 1` and
8525
8602
  // `undefined + undefined` are NaN, while a present string concatenates.
8526
- // Keep this predicate exact so a nullable string does not silently take
8527
- // the string path either.
8603
+ // Keep this predicate exact so a nullable string does not take the
8604
+ // string path either.
8528
8605
  const optionalStringType = (type) => {
8529
8606
  if (type.kind !== "union")
8530
8607
  return false;
@@ -9518,6 +9595,7 @@ function typeofAnswer(arm) {
9518
9595
  case "searchParams":
9519
9596
  case "stats":
9520
9597
  case "fileHandle":
9598
+ case "dir":
9521
9599
  case "spawnRes":
9522
9600
  case "child":
9523
9601
  case "netServer":
@@ -10140,6 +10218,22 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10140
10218
  const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10141
10219
  return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
10142
10220
  }
10221
+ {
10222
+ const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
10223
+ if (eventKind >= 0) {
10224
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10225
+ const kind = { kind: "numLit", value: eventKind, type: F64, loc };
10226
+ return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
10227
+ }
10228
+ }
10229
+ {
10230
+ const blob = lowerBlobInstanceof(lowerer, expr);
10231
+ if (blob)
10232
+ return blob;
10233
+ const keyObject = lowerKeyObjectInstanceof(lowerer, expr);
10234
+ if (keyObject)
10235
+ return keyObject;
10236
+ }
10143
10237
  if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
10144
10238
  const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10145
10239
  return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
@@ -10339,7 +10433,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10339
10433
  lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
10340
10434
  if (left.kind === "varRef" &&
10341
10435
  (ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
10342
- return { kind: "boolLit", value, type: BOOL, loc };
10436
+ return readsClassAfter(lowerer, targetInfo, expr.right, [], {
10437
+ kind: "boolLit",
10438
+ value,
10439
+ type: BOOL,
10440
+ loc,
10441
+ });
10343
10442
  }
10344
10443
  lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
10345
10444
  }
@@ -10489,13 +10588,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10489
10588
  }
10490
10589
  }
10491
10590
  if (left.type.kind !== "object") {
10492
- return {
10493
- kind: "seqExpr",
10494
- stmts: [{ kind: "exprStmt", expr: left, loc }],
10495
- result: { kind: "boolLit", value: false, type: BOOL, loc },
10591
+ return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
10592
+ kind: "boolLit",
10593
+ value: false,
10496
10594
  type: BOOL,
10497
10595
  loc,
10498
- };
10596
+ });
10499
10597
  }
10500
10598
  const lhsInfo = lowerer.classes.get(left.type.className);
10501
10599
  if (!lhsInfo)
@@ -10506,10 +10604,33 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10506
10604
  const value = left.type.className === target.def.name ||
10507
10605
  lowerer.isSubclassOf(left.type.className, target.def.name);
10508
10606
  if (left.kind === "varRef") {
10509
- return { kind: "boolLit", value, type: BOOL, loc };
10607
+ return readsClassAfter(lowerer, target, expr.right, [], {
10608
+ kind: "boolLit",
10609
+ value,
10610
+ type: BOOL,
10611
+ loc,
10612
+ });
10510
10613
  }
10511
10614
  lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
10512
10615
  }
10616
+ /** A statically decided `instanceof` still reads its class after the left
10617
+ * operand: a class with an initialization flag throws there before its
10618
+ * declaration ran. */
10619
+ function readsClassAfter(lowerer, target, right, stmts, result) {
10620
+ if (!lowerer.classInitFlags.has(target.def.name)) {
10621
+ if (stmts.length === 0)
10622
+ return result;
10623
+ return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
10624
+ }
10625
+ const read = lowerer.lowerExpr(right);
10626
+ return {
10627
+ kind: "seqExpr",
10628
+ stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
10629
+ result,
10630
+ type: result.type,
10631
+ loc: result.loc,
10632
+ };
10633
+ }
10513
10634
  /** `#name in obj` — the ergonomic brand check. In this closed world a
10514
10635
  * brand is held by exactly the instances of the declaring class
10515
10636
  * (subclasses included — construction always runs the declaring class's
@@ -10567,7 +10688,7 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
10567
10688
  // A GENERIC family: JS has ONE runtime class and ONE brand for every
10568
10689
  // instantiation, while these layouts mint one class per instantiation
10569
10690
  // — a cross-instantiation check would answer false where Node says
10570
- // true, so the family fences rather than silently splitting the brand.
10691
+ // true, so the family reports SC1090 instead of splitting the brand.
10571
10692
  if (info.generic || info.genericInstance) {
10572
10693
  lowerer.unsupported("SC1090", expr, `'${pname} in …' inside a generic class (JS shares one brand across every instantiation; these layouts mint one class per instantiation)`);
10573
10694
  }
@@ -10663,11 +10784,27 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
10663
10784
  return { kind: "boolLit", value, type: BOOL, loc };
10664
10785
  lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
10665
10786
  }
10787
+ /** The string keys every record inherits from Object.prototype. */
10788
+ const OBJECT_PROTOTYPE_KEYS = new Set([
10789
+ "constructor",
10790
+ "__defineGetter__",
10791
+ "__defineSetter__",
10792
+ "hasOwnProperty",
10793
+ "__lookupGetter__",
10794
+ "__lookupSetter__",
10795
+ "isPrototypeOf",
10796
+ "propertyIsEnumerable",
10797
+ "toString",
10798
+ "valueOf",
10799
+ "__proto__",
10800
+ "toLocaleString",
10801
+ ]);
10666
10802
  /** `"key" in v` — the key-presence test. Three lowered receivers:
10667
10803
  * process.env (getenv(3) presence — Node-exact, an empty value still
10668
10804
  * counts as present), and monomorphic record shapes, where the answer is
10669
10805
  * type-directed: a declared non-optional field is a compile-time `true`,
10670
- * a missing field (no index signature) a compile-time `false` — both
10806
+ * a missing field (no index signature) a compile-time `false` unless
10807
+ * Object.prototype has it — both
10671
10808
  * folds limited to side-effect-free receivers, the lowerInstanceOf rule —
10672
10809
  * and an OPTIONAL field (undefined-armed union) is a runtime presence
10673
10810
  * test on the slot: an omitted or deleted property is absent, while a
@@ -10917,7 +11054,11 @@ function lowerInExpression(lowerer, expr, loc) {
10917
11054
  break;
10918
11055
  }
10919
11056
  const f = shape.fields.find((x) => x.name === key);
10920
- if (f && f.type.kind === "union" && lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
11057
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
11058
+ if (f &&
11059
+ !inherited &&
11060
+ f.type.kind === "union" &&
11061
+ lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
10921
11062
  staticAnswers = false; // an optional slot: presence is per-value
10922
11063
  break;
10923
11064
  }
@@ -10925,7 +11066,7 @@ function lowerInExpression(lowerer, expr, loc) {
10925
11066
  // true without invoking the getter) — either slot present makes
10926
11067
  // the name a member.
10927
11068
  const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
10928
- answers.push({ tag, has: f !== undefined || acc });
11069
+ answers.push({ tag, has: f !== undefined || acc || inherited });
10929
11070
  }
10930
11071
  if (staticAnswers) {
10931
11072
  const pureRecv = recv.kind === "varRef" ||
@@ -10993,7 +11134,9 @@ function lowerInExpression(lowerer, expr, loc) {
10993
11134
  throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
10994
11135
  const field = shape.fields.find((f) => f.name === key);
10995
11136
  if (field) {
10996
- if (field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
11137
+ if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
11138
+ field.type.kind === "union" &&
11139
+ lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
10997
11140
  // Optional slot: the key is present unless the field is absent
10998
11141
  // (omitted or deleted); an explicit undefined is present.
10999
11142
  return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
@@ -11021,14 +11164,16 @@ function lowerInExpression(lowerer, expr, loc) {
11021
11164
  }
11022
11165
  lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
11023
11166
  }
11024
- if (shape.indexValue) {
11167
+ // Records are ordinary objects: Object.prototype's members are in them.
11168
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
11169
+ if (shape.indexValue && !inherited) {
11025
11170
  lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
11026
11171
  }
11027
11172
  if (recv.kind === "varRef" ||
11028
11173
  recv.kind === "recordGet" ||
11029
11174
  recv.kind === "fieldGet" ||
11030
11175
  pureRecvNode) {
11031
- return { kind: "boolLit", value: false, type: BOOL, loc };
11176
+ return { kind: "boolLit", value: inherited, type: BOOL, loc };
11032
11177
  }
11033
11178
  lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
11034
11179
  }
@@ -11081,7 +11226,36 @@ function lowerRuntimeKeyIn(lowerer, expr, loc) {
11081
11226
  // Overflow keys answer through the map's hashed presence probe (a
11082
11227
  // stored undefined value is still present), not a scan over a fresh
11083
11228
  // key snapshot, which made `k in dict` loops quadratic.
11084
- body.push(ret({ kind: "recordOvfHas", obj: r, shapeId: recvT.shapeId, key: k, type: BOOL, loc }));
11229
+ const ovfHas = {
11230
+ kind: "recordOvfHas",
11231
+ obj: r,
11232
+ shapeId: recvT.shapeId,
11233
+ key: k,
11234
+ type: BOOL,
11235
+ loc,
11236
+ };
11237
+ // A miss in the record's own keys still finds Object.prototype's.
11238
+ let inherited = ovfHas;
11239
+ for (const name of OBJECT_PROTOTYPE_KEYS) {
11240
+ if (shape.fields.some((f) => f.name === name))
11241
+ continue;
11242
+ inherited = {
11243
+ kind: "logical",
11244
+ op: "||",
11245
+ left: inherited,
11246
+ right: {
11247
+ kind: "strEq",
11248
+ negated: false,
11249
+ left: k,
11250
+ right: { kind: "strLit", value: name, type: STRING, loc },
11251
+ type: BOOL,
11252
+ loc,
11253
+ },
11254
+ type: BOOL,
11255
+ loc,
11256
+ };
11257
+ }
11258
+ body.push(ret(inherited));
11085
11259
  lowerer.liftedFns.push({
11086
11260
  name: helper,
11087
11261
  params: [
@@ -12912,8 +13086,8 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
12912
13086
  // accounting; dot spelling only — symbol-keyed element targets are
12913
13087
  // static fields): read the member (dynKeyGet), VALIDATE it as a
12914
13088
  // number (dynCheck — a non-number member throws the catchable
12915
- // TypeError where JS would ToNumber-coerce; loud, never a silent
12916
- // NaN — SEMANTICS.md), combine, write back (dyn.keySet). The
13089
+ // TypeError where JS would ToNumber-coerce; it throws instead of
13090
+ // producing NaN — SEMANTICS.md), combine, write back (dyn.keySet). The
12917
13091
  // receiver and member read are saved before evaluating the RHS.
12918
13092
  if (ts.isPropertyAccessExpression(access)) {
12919
13093
  let probed = tryLowerExpression(lowerer, access.expression);
@@ -12987,22 +13161,33 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
12987
13161
  target.obj = save(target.obj, "%compoundReceiver");
12988
13162
  // Accessors observe getter, RHS side effects, then setter, all through
12989
13163
  // the saved receiver.
12990
- const read = save(lowerer.fieldGetExpr(target, locOf(access), access), "%compoundOld");
13164
+ const fieldRead = lowerer.fieldGetExpr(target, locOf(access), access);
13165
+ // `+=` on a stored string field reads it into a mutable local, so the
13166
+ // concat below can append to that local in place.
13167
+ const storedString = op === "+" &&
13168
+ fieldRead.type.kind === "string" &&
13169
+ target.fieldType.kind === "string" &&
13170
+ (target.container === "class" || target.container === "record");
13171
+ let read;
13172
+ if (storedString) {
13173
+ const old = declareContextLocal(lowerer.ctx, "%compoundOld", STRING, true, undefined, undefined);
13174
+ body.push({ kind: "varDecl", localId: old.id, init: fieldRead, loc: fieldRead.loc });
13175
+ read = varRef(old.id, STRING, fieldRead.loc);
13176
+ }
13177
+ else {
13178
+ read = save(fieldRead, "%compoundOld");
13179
+ }
12991
13180
  const rhs = save(rhsNode ? lowerer.lowerExpr(rhsNode) : { kind: "numLit", value: 1, type: F64, loc }, "%compoundRhs");
12992
13181
  const numericRhs = rhs.type.kind === "dyn" && isJsSourceFile(access.getSourceFile())
12993
13182
  ? { kind: "dynCheck", value: rhs, type: F64, loc: rhs.loc }
12994
13183
  : lowerOptionalNumber(lowerer, rhs, loc);
12995
13184
  let value;
13185
+ let appended = null;
12996
13186
  const numericRead = lowerOptionalNumber(lowerer, read, loc, access);
12997
13187
  const bigintValue = rhsNode ? bigintCompoundValue(op, read, rhs, loc) : null;
12998
13188
  if (op === "+" && read.type.kind === "string") {
12999
- value = {
13000
- kind: "strConcat",
13001
- left: read,
13002
- right: lowerer.ensureString(rhs, rhsNode ?? access),
13003
- type: STRING,
13004
- loc,
13005
- };
13189
+ appended = lowerer.ensureString(rhs, rhsNode ?? access);
13190
+ value = { kind: "strConcat", left: read, right: appended, type: STRING, loc };
13006
13191
  }
13007
13192
  else if (numericRead.type.kind === "f64" && numericRhs.type.kind === "f64") {
13008
13193
  value = { kind: "bin", op, left: numericRead, right: numericRhs, type: F64, loc };
@@ -13027,6 +13212,26 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
13027
13212
  else {
13028
13213
  lowerer.unsupported("SC1043", access);
13029
13214
  }
13215
+ if (storedString && rhs.type.kind === "string" && read.kind === "varRef" && appended !== null) {
13216
+ // The field gives up its value before the concat (no code runs in
13217
+ // between: both operands are already strings), and the concat is the
13218
+ // self-append `old = old + rhs`, which hands the local's reference to
13219
+ // the runtime: the old string is then uniquely owned unless something
13220
+ // else holds it, and is appended to in place. Repeated `this.text += s`
13221
+ // is linear rather than a copy per append.
13222
+ const oldId = read.localId;
13223
+ const oldLoc = read.loc;
13224
+ const oldRef = () => varRef(oldId, STRING, oldLoc);
13225
+ const concat = {
13226
+ kind: "strConcat",
13227
+ left: oldRef(),
13228
+ right: appended,
13229
+ type: STRING,
13230
+ loc,
13231
+ };
13232
+ body.push(lowerer.fieldSetStmt(target, { kind: "strLit", value: "", type: STRING, loc }, loc, access), { kind: "assign", localId: oldId, value: concat, loc }, lowerer.fieldSetStmt(target, oldRef(), loc, access));
13233
+ return { kind: "seqExpr", stmts: body, result: oldRef(), type: STRING, loc };
13234
+ }
13030
13235
  const result = save(value, "%compoundResult");
13031
13236
  body.push(lowerer.fieldSetStmt(target, lowerer.coerceInto(access, result, target.fieldType), loc, access));
13032
13237
  return { kind: "seqExpr", stmts: body, result, type: result.type, loc };