@scriptc/compiler 0.3.2 → 0.3.4

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 (454) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +1202 -64
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-mutability.d.ts +5 -0
  5. package/dist/backend/cycle-mutability.js +62 -3
  6. package/dist/backend/cycle-mutability.js.map +1 -1
  7. package/dist/backend/executable-features.js +1 -0
  8. package/dist/backend/executable-features.js.map +1 -1
  9. package/dist/backend/library-pack.js +1 -0
  10. package/dist/backend/library-pack.js.map +1 -1
  11. package/dist/backend/llvm/alloc.js +24 -10
  12. package/dist/backend/llvm/alloc.js.map +1 -1
  13. package/dist/backend/llvm/alloc.test.js +47 -1
  14. package/dist/backend/llvm/alloc.test.js.map +1 -1
  15. package/dist/backend/llvm/array-search.d.ts +8 -0
  16. package/dist/backend/llvm/array-search.js +52 -0
  17. package/dist/backend/llvm/array-search.js.map +1 -0
  18. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  19. package/dist/backend/llvm/array-search.test.js +72 -0
  20. package/dist/backend/llvm/array-search.test.js.map +1 -0
  21. package/dist/backend/llvm/call-lifetimes.d.ts +12 -1
  22. package/dist/backend/llvm/call-lifetimes.js +41 -11
  23. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  24. package/dist/backend/llvm/call-lifetimes.test.js +85 -1
  25. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  26. package/dist/backend/llvm/classes.js +87 -36
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/common.d.ts +6 -1
  29. package/dist/backend/llvm/common.js +8 -1
  30. package/dist/backend/llvm/common.js.map +1 -1
  31. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  32. package/dist/backend/llvm/dense-array-access.js +3 -3
  33. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  34. package/dist/backend/llvm/dyn.d.ts +44 -1
  35. package/dist/backend/llvm/dyn.js +251 -36
  36. package/dist/backend/llvm/dyn.js.map +1 -1
  37. package/dist/backend/llvm/emitter.d.ts +77 -14
  38. package/dist/backend/llvm/emitter.js +461 -108
  39. package/dist/backend/llvm/emitter.js.map +1 -1
  40. package/dist/backend/llvm/emitter.test.js +26 -3
  41. package/dist/backend/llvm/emitter.test.js.map +1 -1
  42. package/dist/backend/llvm/expr-async.js +52 -1
  43. package/dist/backend/llvm/expr-async.js.map +1 -1
  44. package/dist/backend/llvm/expr-bytes.d.ts +9 -0
  45. package/dist/backend/llvm/expr-bytes.js +169 -63
  46. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  47. package/dist/backend/llvm/expr-callbacks.js +16 -2
  48. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  49. package/dist/backend/llvm/expr-calls.d.ts +3 -1
  50. package/dist/backend/llvm/expr-calls.js +57 -2
  51. package/dist/backend/llvm/expr-calls.js.map +1 -1
  52. package/dist/backend/llvm/expr-containers.js +57 -19
  53. package/dist/backend/llvm/expr-containers.js.map +1 -1
  54. package/dist/backend/llvm/expr-dynamic.js +19 -8
  55. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  56. package/dist/backend/llvm/expr-primitives.js +28 -30
  57. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  58. package/dist/backend/llvm/expr-records.js +8 -4
  59. package/dist/backend/llvm/expr-records.js.map +1 -1
  60. package/dist/backend/llvm/expr-stream-bridges.js +35 -32
  61. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  62. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  63. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  64. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  65. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  66. package/dist/backend/llvm/inline-unions.js +134 -0
  67. package/dist/backend/llvm/inline-unions.js.map +1 -0
  68. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  69. package/dist/backend/llvm/inline-unions.test.js +124 -0
  70. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  71. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  72. package/dist/backend/llvm/integer-remainder.js +80 -9
  73. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  74. package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
  75. package/dist/backend/llvm/intern-tables.test.js +77 -0
  76. package/dist/backend/llvm/intern-tables.test.js.map +1 -0
  77. package/dist/backend/llvm/lib-datagram.js +10 -0
  78. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  79. package/dist/backend/llvm/lib-dispatch.js +255 -29
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-filesystem.js +176 -7
  82. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  83. package/dist/backend/llvm/lib-network.js +25 -6
  84. package/dist/backend/llvm/lib-network.js.map +1 -1
  85. package/dist/backend/llvm/lib-process.js +2 -2
  86. package/dist/backend/llvm/lib-process.js.map +1 -1
  87. package/dist/backend/llvm/lib-shared.d.ts +5 -0
  88. package/dist/backend/llvm/lib-shared.js +212 -1
  89. package/dist/backend/llvm/lib-shared.js.map +1 -1
  90. package/dist/backend/llvm/lib-stream.js +184 -0
  91. package/dist/backend/llvm/lib-stream.js.map +1 -1
  92. package/dist/backend/llvm/lib-test.js +9 -0
  93. package/dist/backend/llvm/lib-test.js.map +1 -1
  94. package/dist/backend/llvm/local-array-reads.js +7 -3
  95. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  96. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  97. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  98. package/dist/backend/llvm/local-union-storage.d.ts +2 -0
  99. package/dist/backend/llvm/local-union-storage.js +5 -0
  100. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  101. package/dist/backend/llvm/local-union-storage.test.js +1 -0
  102. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  103. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  104. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  105. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  106. package/dist/backend/llvm/map-number-lookup.d.ts +24 -0
  107. package/dist/backend/llvm/map-number-lookup.js +88 -0
  108. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  109. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  110. package/dist/backend/llvm/map-number-lookup.test.js +158 -0
  111. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  112. package/dist/backend/llvm/map-read-lifetimes.d.ts +9 -0
  113. package/dist/backend/llvm/map-read-lifetimes.js +90 -1
  114. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  115. package/dist/backend/llvm/map-read-lifetimes.test.js +129 -1
  116. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  117. package/dist/backend/llvm/publish.d.ts +9 -0
  118. package/dist/backend/llvm/publish.js +25 -4
  119. package/dist/backend/llvm/publish.js.map +1 -1
  120. package/dist/backend/llvm/record-results.d.ts +8 -5
  121. package/dist/backend/llvm/record-results.js +20 -12
  122. package/dist/backend/llvm/record-results.js.map +1 -1
  123. package/dist/backend/llvm/reference-effects.js +13 -0
  124. package/dist/backend/llvm/reference-effects.js.map +1 -1
  125. package/dist/backend/llvm/reference-writes.js +19 -2
  126. package/dist/backend/llvm/reference-writes.js.map +1 -1
  127. package/dist/backend/llvm/regions.d.ts +5 -1
  128. package/dist/backend/llvm/regions.js +24 -10
  129. package/dist/backend/llvm/regions.js.map +1 -1
  130. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  131. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  132. package/dist/backend/llvm/shapes.d.ts +56 -10
  133. package/dist/backend/llvm/shapes.js +178 -39
  134. package/dist/backend/llvm/shapes.js.map +1 -1
  135. package/dist/backend/llvm/shapes.test.js +61 -3
  136. package/dist/backend/llvm/shapes.test.js.map +1 -1
  137. package/dist/backend/llvm/stack-objects.js +16 -4
  138. package/dist/backend/llvm/stack-objects.js.map +1 -1
  139. package/dist/backend/llvm/stack-objects.test.js +3 -0
  140. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  141. package/dist/backend/llvm/string-reads.js +2 -2
  142. package/dist/backend/llvm/string-reads.js.map +1 -1
  143. package/dist/backend/llvm/string-slices.js +2 -2
  144. package/dist/backend/llvm/string-slices.js.map +1 -1
  145. package/dist/backend/llvm/walkers.d.ts +11 -0
  146. package/dist/backend/llvm/walkers.js +106 -10
  147. package/dist/backend/llvm/walkers.js.map +1 -1
  148. package/dist/backend/may-throw.js +13 -4
  149. package/dist/backend/may-throw.js.map +1 -1
  150. package/dist/backend/native/contracts.d.ts +5 -2
  151. package/dist/backend/native/executable.js +27 -8
  152. package/dist/backend/native/executable.js.map +1 -1
  153. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  154. package/dist/backend/native/runtime-inputs.js +2 -0
  155. package/dist/backend/native/runtime-inputs.js.map +1 -1
  156. package/dist/backend/native-codegen-core.d.ts +4 -4
  157. package/dist/backend/native-codegen-core.js +4 -6
  158. package/dist/backend/native-codegen-core.js.map +1 -1
  159. package/dist/backend/native-codegen.test.js +7 -8
  160. package/dist/backend/native-codegen.test.js.map +1 -1
  161. package/dist/backend/native-link-info-core.d.ts +3 -0
  162. package/dist/backend/native-link-info-core.js.map +1 -1
  163. package/dist/backend/native-toolchain.test.js +1 -1
  164. package/dist/backend/native-toolchain.test.js.map +1 -1
  165. package/dist/backend/publication.js +3 -1
  166. package/dist/backend/publication.js.map +1 -1
  167. package/dist/backend/runtime-abi.d.ts +2 -2
  168. package/dist/backend/runtime-abi.js +2 -2
  169. package/dist/backend/runtime-pack-targets.test.js +2 -1
  170. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  171. package/dist/backend/runtime-pack.test.js +2 -1
  172. package/dist/backend/runtime-pack.test.js.map +1 -1
  173. package/dist/backend/target-diagnostics.js +11 -1
  174. package/dist/backend/target-diagnostics.js.map +1 -1
  175. package/dist/backend/target-diagnostics.test.js +4 -1
  176. package/dist/backend/target-diagnostics.test.js.map +1 -1
  177. package/dist/backend/warm-cache.js +1 -0
  178. package/dist/backend/warm-cache.js.map +1 -1
  179. package/dist/compat/fetch-profile.js +4 -4
  180. package/dist/compat/fetch-profile.js.map +1 -1
  181. package/dist/contracts/check.js +2 -0
  182. package/dist/contracts/check.js.map +1 -1
  183. package/dist/coverage/report.js +1 -1
  184. package/dist/coverage/report.js.map +1 -1
  185. package/dist/diagnostics/diagnostic.d.ts +6 -5
  186. package/dist/diagnostics/diagnostic.js +7 -6
  187. package/dist/diagnostics/diagnostic.js.map +1 -1
  188. package/dist/executable/executable-cache.d.ts +1 -0
  189. package/dist/executable/executable-cache.js +1 -0
  190. package/dist/executable/executable-cache.js.map +1 -1
  191. package/dist/executable/executable-cache.test.js +1 -0
  192. package/dist/executable/executable-cache.test.js.map +1 -1
  193. package/dist/frontend/builtin-modules.d.ts +1 -1
  194. package/dist/frontend/builtin-modules.js +1 -0
  195. package/dist/frontend/builtin-modules.js.map +1 -1
  196. package/dist/frontend/comptime-node.js +2 -2
  197. package/dist/frontend/comptime-node.js.map +1 -1
  198. package/dist/frontend/experimental-import.d.ts +5 -1
  199. package/dist/frontend/experimental-import.js +28 -3
  200. package/dist/frontend/experimental-import.js.map +1 -1
  201. package/dist/frontend/lowering/assert-instances.d.ts +38 -0
  202. package/dist/frontend/lowering/assert-instances.js +269 -0
  203. package/dist/frontend/lowering/assert-instances.js.map +1 -0
  204. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  205. package/dist/frontend/lowering/binding-analysis.js +1 -1
  206. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  207. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  208. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  210. package/dist/frontend/lowering/builtins/blob.js +167 -0
  211. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  212. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  213. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  214. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  215. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  216. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  217. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  218. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  219. package/dist/frontend/lowering/builtins/compression.js +178 -4
  220. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  221. package/dist/frontend/lowering/builtins/constants.js +7 -2
  222. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
  224. package/dist/frontend/lowering/builtins/crypto.js +526 -121
  225. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  226. package/dist/frontend/lowering/builtins/errors.js +23 -0
  227. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  229. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  230. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  232. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  233. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  235. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  236. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  237. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  238. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  239. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  240. package/dist/frontend/lowering/builtins/module-calls.js +44 -11
  241. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  243. package/dist/frontend/lowering/builtins/performance.js +340 -5
  244. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  246. package/dist/frontend/lowering/builtins/process.js +107 -14
  247. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  248. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  249. package/dist/frontend/lowering/builtins/properties.js +39 -11
  250. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  251. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  252. package/dist/frontend/lowering/builtins/readline.js +266 -90
  253. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  254. package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
  255. package/dist/frontend/lowering/builtins/timers.js +109 -23
  256. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  257. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  258. package/dist/frontend/lowering/builtins/url.js +36 -0
  259. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  260. package/dist/frontend/lowering/call-arguments.js +1 -1
  261. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  262. package/dist/frontend/lowering/call-signatures.js +26 -2
  263. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  264. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +2 -0
  265. package/dist/frontend/lowering/class-dynamic-dispatch.js +171 -13
  266. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  267. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  268. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  269. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  270. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  271. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  272. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  273. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  274. package/dist/frontend/lowering/coercions/structural.js +3 -3
  275. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  276. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  277. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  278. package/dist/frontend/lowering/containers/array-callbacks.js +4 -7
  279. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  280. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  281. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  282. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  283. package/dist/frontend/lowering/containers/bytes.js +38 -26
  284. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  285. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  286. package/dist/frontend/lowering/containers/for-of.js +5 -1
  287. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  288. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  289. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  290. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  291. package/dist/frontend/lowering/crypto-tables.js +77 -12
  292. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  293. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  294. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +16 -12
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  298. package/dist/frontend/lowering/generic-functions.js +2 -2
  299. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  300. package/dist/frontend/lowering/http2-constants.js +1 -1
  301. package/dist/frontend/lowering/intern-tables.d.ts +13 -0
  302. package/dist/frontend/lowering/intern-tables.js +536 -0
  303. package/dist/frontend/lowering/intern-tables.js.map +1 -0
  304. package/dist/frontend/lowering/lower-array-sort.d.ts +12 -1
  305. package/dist/frontend/lowering/lower-array-sort.js +561 -191
  306. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  307. package/dist/frontend/lowering/lower-array-sort.test.js +4 -2
  308. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  309. package/dist/frontend/lowering/lower-assert.js +702 -63
  310. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  311. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  312. package/dist/frontend/lowering/lower-async-iteration.js +259 -4
  313. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  314. package/dist/frontend/lowering/lower-calls.js +118 -12
  315. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  316. package/dist/frontend/lowering/lower-classes.d.ts +11 -2
  317. package/dist/frontend/lowering/lower-classes.js +76 -9
  318. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  319. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  320. package/dist/frontend/lowering/lower-comptime.js +4 -4
  321. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  322. package/dist/frontend/lowering/lower-dgram.js +77 -52
  323. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  324. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  325. package/dist/frontend/lowering/lower-event-target.js +362 -0
  326. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  327. package/dist/frontend/lowering/lower-expando.js +2 -2
  328. package/dist/frontend/lowering/lower-exprs.js +124 -22
  329. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  330. package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
  331. package/dist/frontend/lowering/lower-inspect.js +240 -49
  332. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  333. package/dist/frontend/lowering/lower-mixins.js +1 -1
  334. package/dist/frontend/lowering/lower-mock.d.ts +11 -0
  335. package/dist/frontend/lowering/lower-mock.js +504 -0
  336. package/dist/frontend/lowering/lower-mock.js.map +1 -0
  337. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  338. package/dist/frontend/lowering/lower-modules.js +14 -3
  339. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  340. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  341. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  342. package/dist/frontend/lowering/lower-server.d.ts +3 -0
  343. package/dist/frontend/lowering/lower-server.js +419 -44
  344. package/dist/frontend/lowering/lower-server.js.map +1 -1
  345. package/dist/frontend/lowering/lower-stdlib.d.ts +7 -1
  346. package/dist/frontend/lowering/lower-stdlib.js +10 -3
  347. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  348. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  349. package/dist/frontend/lowering/lower-stmts.js +69 -14
  350. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  351. package/dist/frontend/lowering/lower-stream.d.ts +10 -6
  352. package/dist/frontend/lowering/lower-stream.js +1020 -49
  353. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  354. package/dist/frontend/lowering/lower-test.js +86 -8
  355. package/dist/frontend/lowering/lower-test.js.map +1 -1
  356. package/dist/frontend/lowering/lower-timers.js +1 -1
  357. package/dist/frontend/lowering/lowerer.d.ts +45 -5
  358. package/dist/frontend/lowering/lowerer.js +317 -48
  359. package/dist/frontend/lowering/lowerer.js.map +1 -1
  360. package/dist/frontend/lowering/native-ffi.js +2 -2
  361. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  362. package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
  363. package/dist/frontend/lowering/pairs-snapshot.js +49 -0
  364. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  365. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  366. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  367. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  368. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  369. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  370. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  371. package/dist/frontend/lowering/surfaces.d.ts +11 -3
  372. package/dist/frontend/lowering/surfaces.js +334 -37
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
  375. package/dist/frontend/lowering/zlib-constants.js +181 -0
  376. package/dist/frontend/lowering/zlib-constants.js.map +1 -0
  377. package/dist/frontend/mock-shapes.d.ts +10 -0
  378. package/dist/frontend/mock-shapes.js +76 -0
  379. package/dist/frontend/mock-shapes.js.map +1 -0
  380. package/dist/frontend/module-syntax.d.ts +1 -1
  381. package/dist/frontend/module-syntax.js +1 -1
  382. package/dist/frontend/npm-static-prune.js +1 -1
  383. package/dist/frontend/npm-static-prune.js.map +1 -1
  384. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  385. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  386. package/dist/frontend/pipeline.js +6 -4
  387. package/dist/frontend/pipeline.js.map +1 -1
  388. package/dist/frontend/program.d.ts +3 -3
  389. package/dist/frontend/program.js +25 -18
  390. package/dist/frontend/program.js.map +1 -1
  391. package/dist/frontend/resolve.d.ts +4 -0
  392. package/dist/frontend/resolve.js +15 -1
  393. package/dist/frontend/resolve.js.map +1 -1
  394. package/dist/frontend/ts7/adapter.js +1 -1
  395. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  396. package/dist/frontend/ts7/ast-bytes.js +1 -1
  397. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  398. package/dist/frontend/ts7/semantic-json.js +1 -1
  399. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  400. package/dist/frontend/ts7/world-check.js +1 -1
  401. package/dist/frontend/tsc-codes.js +3 -2
  402. package/dist/frontend/tsc-codes.js.map +1 -1
  403. package/dist/frontend/type-mapper.d.ts +21 -1
  404. package/dist/frontend/type-mapper.js +245 -27
  405. package/dist/frontend/type-mapper.js.map +1 -1
  406. package/dist/index.js +7 -5
  407. package/dist/index.js.map +1 -1
  408. package/dist/ir/analysis.d.ts +12 -6
  409. package/dist/ir/analysis.js +26 -10
  410. package/dist/ir/analysis.js.map +1 -1
  411. package/dist/ir/analysis.test.js +15 -3
  412. package/dist/ir/analysis.test.js.map +1 -1
  413. package/dist/ir/builtin-effects.js +115 -0
  414. package/dist/ir/builtin-effects.js.map +1 -1
  415. package/dist/ir/builtin-signatures.d.ts +1 -1
  416. package/dist/ir/builtin-signatures.js +438 -46
  417. package/dist/ir/builtin-signatures.js.map +1 -1
  418. package/dist/ir/int32-slots.js +1 -0
  419. package/dist/ir/int32-slots.js.map +1 -1
  420. package/dist/ir/ir.d.ts +84 -17
  421. package/dist/ir/ir.js +54 -1
  422. package/dist/ir/ir.js.map +1 -1
  423. package/dist/ir/runtime-features.d.ts +1 -0
  424. package/dist/ir/runtime-features.js +111 -7
  425. package/dist/ir/runtime-features.js.map +1 -1
  426. package/dist/ir/serialize.js +1 -1
  427. package/dist/ir/serialize.js.map +1 -1
  428. package/dist/ir/traverse.js +1 -0
  429. package/dist/ir/traverse.js.map +1 -1
  430. package/dist/ir/validate.js +295 -14
  431. package/dist/ir/validate.js.map +1 -1
  432. package/dist/ir/validate.test.js +60 -0
  433. package/dist/ir/validate.test.js.map +1 -1
  434. package/dist/library/fence-eval.d.ts +1 -1
  435. package/dist/library/fence-eval.js +5 -4
  436. package/dist/library/fence-eval.js.map +1 -1
  437. package/dist/library/ir-policy.js +11 -4
  438. package/dist/library/ir-policy.js.map +1 -1
  439. package/dist/library/library-profile.js +13 -13
  440. package/dist/library/library-profile.js.map +1 -1
  441. package/dist/library/prepare.js +1 -1
  442. package/dist/library/prepare.js.map +1 -1
  443. package/dist/library/sidecar.js +3 -3
  444. package/dist/library/sidecar.js.map +1 -1
  445. package/dist/native/cli.js +1 -0
  446. package/dist/native/cli.js.map +1 -1
  447. package/dist/native/compiler.js +1 -3
  448. package/dist/native/compiler.js.map +1 -1
  449. package/dist/native/prepare.js +4 -2
  450. package/dist/native/prepare.js.map +1 -1
  451. package/dist/native/sanitizer.test.js +1 -0
  452. package/dist/native/sanitizer.test.js.map +1 -1
  453. package/package.json +20 -20
  454. package/surface-manifest.json +1279 -221
@@ -12,6 +12,12 @@ export declare function inspectExpr(lowerer: Lowerer, t: IrType, value: IrExpr,
12
12
  * <ref *N>/[Circular *N]); everything acyclic keeps the zero-cost path
13
13
  * (a value of an acyclic type can never repeat on its own path). */
14
14
  export declare function typeReachesItself(lowerer: Lowerer, t: IrType): boolean;
15
+ /** True when a value of `t` can be cyclic: `t` or any type reachable from
16
+ * it reaches itself. */
17
+ export declare function typeReachesCycle(lowerer: Lowerer, t: IrType): boolean;
18
+ /** True when a value of `t` can hold a function: `t` or any type
19
+ * reachable from it is a function type. */
20
+ export declare function typeReachesFunction(lowerer: Lowerer, t: IrType): boolean;
15
21
  /** One console.log/info/debug/error/warn argument OUTSIDE the direct
16
22
  * scalar set (number/string/boolean ride the ScrLogArg protocol
17
23
  * untouched, and dyn/function values have their own paths at the call
@@ -3,10 +3,12 @@ import { InternalCompilerError } from "../../errors.js";
3
3
  import * as ts from "../ts7/adapter.js";
4
4
  import { unsignedHex } from "../../format-integer.js";
5
5
  import { isJsSourceFile } from "../program.js";
6
- import { BOOL, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, recordTextCodecClass, shapeHasAccessorSlots, typeKey, } from "../../ir/ir.js";
7
- import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
6
+ import { BOOL, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, isUnitType, UNDEFINED_T, VOID, canConvertToDyn, canDynCheckTo, isDirentShape, isDynTypedRefType, recordTextCodecClass, shapeHasAccessorSlots, typeKey, } from "../../ir/ir.js";
7
+ import { isSafeToDiscard, isSafeToRepeat } from "./expressions/evaluation-safety.js";
8
8
  import { symbolFieldDisplayName } from "./symbol-fields.js";
9
+ import { eventTargetRootOf } from "./lower-event-target.js";
9
10
  import { lowerSystemErrorMap } from "./lower-system-errors.js";
11
+ import { isPerfEntryType, perfEntryJson } from "./builtins/performance.js";
10
12
  /* ── IR construction shorthand ───────────────────────────────────────── */
11
13
  function concatAll(parts, loc) {
12
14
  if (parts.length === 0)
@@ -20,7 +22,7 @@ function concatAll(parts, loc) {
20
22
  /* ── property-name rendering (compile-time keys) ─────────────────────── */
21
23
  /** strEscape's quote ladder over a COMPILE-TIME string (record field
22
24
  * names, format-string chunks never pass through here — only keys).
23
- * Mirrors scr_inspect.c's insp_quote_into byte-for-byte. */
25
+ * Mirrors scr_inspect.c's insp_quote_into exactly. */
24
26
  function inspectQuote(s) {
25
27
  const hasSingle = s.includes("'");
26
28
  const quote = !hasSingle
@@ -185,13 +187,35 @@ function inspectSupport(lowerer, t, visiting, out) {
185
187
  const info = lowerer.classes.get(t.className);
186
188
  if (!info)
187
189
  return `class '${t.className}' has no inspect lowering`;
190
+ // EventTarget and Event subclasses render through Node's inspectors
191
+ // for those classes (the runtime's capsule view).
192
+ if (eventTargetRootOf(info) !== null)
193
+ return null;
188
194
  if (isErrorClass(lowerer, t.className)) {
189
195
  return errorRenderable(info)
190
196
  ? null
191
197
  : "error subclasses with declared fields have no inspect lowering yet (the extra own properties are runtime-dynamic)";
192
198
  }
199
+ // A class with subclasses renders through its checked-dynamic view,
200
+ // which names the instance's own class and holds its own fields.
193
201
  if (info.subclasses.length > 0) {
194
- return `inspect of '${t.className}' values is not lowered (the class has subclasses — the runtime value's constructor name and fields are dynamic)`;
202
+ if (!isDynTypedRefType(t) || visiting.has(t.className))
203
+ return null;
204
+ visiting.add(t.className);
205
+ const hierarchy = (current) => [
206
+ current,
207
+ ...current.subclasses.flatMap(hierarchy),
208
+ ];
209
+ for (const member of hierarchy(info))
210
+ for (const f of member.def.fields) {
211
+ if (f.name.startsWith("#") || f.name.startsWith("%"))
212
+ continue;
213
+ const why = inspectSupport(lowerer, f.type, visiting, out);
214
+ if (why !== null)
215
+ return why;
216
+ }
217
+ visiting.delete(t.className);
218
+ return null;
195
219
  }
196
220
  if (visiting.has(t.className)) {
197
221
  out.recursive = true;
@@ -241,6 +265,20 @@ function isNumberFlag(lowerer, t, v, loc) {
241
265
  * with the depth budget `depth` — a direct scalar libCall or a call of
242
266
  * the interned per-type helper. */
243
267
  export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
268
+ // A Dirent row renders through its dyn view: Node's `Dirent { ... }`
269
+ // with the Symbol(type) key.
270
+ if (t.kind === "record") {
271
+ const shape = lowerer.shapes.get(t.shapeId);
272
+ if (shape && isDirentShape(shape)) {
273
+ return {
274
+ kind: "libCall",
275
+ fn: "insp.dyn",
276
+ args: [lowerer.coerceToExpected(value, DYN), recurse, depth],
277
+ type: STRING,
278
+ loc,
279
+ };
280
+ }
281
+ }
244
282
  switch (t.kind) {
245
283
  case "f64":
246
284
  return { kind: "libCall", fn: "insp.f64", args: [value], type: STRING, loc };
@@ -265,6 +303,15 @@ export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
265
303
  case "dyn":
266
304
  return { kind: "libCall", fn: "insp.dyn", args: [value, recurse, depth], type: STRING, loc };
267
305
  case "object":
306
+ if (eventTargetRootOf(lowerer.classes.get(t.className)) !== null) {
307
+ return {
308
+ kind: "libCall",
309
+ fn: "insp.dyn",
310
+ args: [lowerer.coerceToExpected(value, DYN), recurse, depth],
311
+ type: STRING,
312
+ loc,
313
+ };
314
+ }
268
315
  if (isErrorClass(lowerer, t.className)) {
269
316
  return {
270
317
  kind: "libCall",
@@ -274,6 +321,15 @@ export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
274
321
  loc,
275
322
  };
276
323
  }
324
+ if (lowerer.classes.get(t.className)?.subclasses.length) {
325
+ return {
326
+ kind: "libCall",
327
+ fn: "insp.dyn",
328
+ args: [lowerer.coerceToExpected(value, DYN), recurse, depth],
329
+ type: STRING,
330
+ loc,
331
+ };
332
+ }
277
333
  return {
278
334
  kind: "call",
279
335
  callee: inspectHelper(lowerer, t, loc),
@@ -301,40 +357,7 @@ export function typeReachesItself(lowerer, t) {
301
357
  const root = typeKey(t);
302
358
  const seen = new Set();
303
359
  const walk = (u) => {
304
- const constituents = [];
305
- switch (u.kind) {
306
- case "record": {
307
- const shape = lowerer.shapes.get(u.shapeId);
308
- if (!shape)
309
- return false;
310
- constituents.push(...shape.fields.map((f) => f.type));
311
- if (shape.indexValue)
312
- constituents.push(shape.indexValue);
313
- break;
314
- }
315
- case "array":
316
- case "set":
317
- constituents.push(u.elem);
318
- break;
319
- case "map":
320
- constituents.push(u.key, u.value);
321
- break;
322
- case "union": {
323
- const def = lowerer.unions.get(u.unionId);
324
- if (def)
325
- constituents.push(...def.arms);
326
- break;
327
- }
328
- case "object": {
329
- const info = lowerer.classes.get(u.className);
330
- if (info)
331
- constituents.push(...info.def.fields.map((f) => f.type));
332
- break;
333
- }
334
- default:
335
- return false;
336
- }
337
- for (const c of constituents) {
360
+ for (const c of typeConstituents(lowerer, u)) {
338
361
  const k = typeKey(c);
339
362
  if (k === root)
340
363
  return true;
@@ -348,6 +371,59 @@ export function typeReachesItself(lowerer, t) {
348
371
  };
349
372
  return walk(t);
350
373
  }
374
+ /** True when a value of `t` can be cyclic: `t` or any type reachable from
375
+ * it reaches itself. */
376
+ export function typeReachesCycle(lowerer, t) {
377
+ const seen = new Set();
378
+ const walk = (u) => {
379
+ const k = typeKey(u);
380
+ if (seen.has(k))
381
+ return false;
382
+ seen.add(k);
383
+ if (typeReachesItself(lowerer, u))
384
+ return true;
385
+ return typeConstituents(lowerer, u).some(walk);
386
+ };
387
+ return walk(t);
388
+ }
389
+ /** True when a value of `t` can hold a function: `t` or any type
390
+ * reachable from it is a function type. */
391
+ export function typeReachesFunction(lowerer, t) {
392
+ const seen = new Set();
393
+ const walk = (u) => {
394
+ if (u.kind === "func")
395
+ return true;
396
+ const k = typeKey(u);
397
+ if (seen.has(k))
398
+ return false;
399
+ seen.add(k);
400
+ return typeConstituents(lowerer, u).some(walk);
401
+ };
402
+ return walk(t);
403
+ }
404
+ /** The types a value of `u` holds directly. */
405
+ function typeConstituents(lowerer, u) {
406
+ switch (u.kind) {
407
+ case "record": {
408
+ const shape = lowerer.shapes.get(u.shapeId);
409
+ if (!shape)
410
+ return [];
411
+ const fields = shape.fields.map((f) => f.type);
412
+ return shape.indexValue ? [...fields, shape.indexValue] : fields;
413
+ }
414
+ case "array":
415
+ case "set":
416
+ return [u.elem];
417
+ case "map":
418
+ return [u.key, u.value];
419
+ case "union":
420
+ return lowerer.unions.get(u.unionId)?.arms.slice() ?? [];
421
+ case "object":
422
+ return lowerer.classes.get(u.className)?.def.fields.map((f) => f.type) ?? [];
423
+ default:
424
+ return [];
425
+ }
426
+ }
351
427
  /* ── the interned per-type helper ────────────────────────────────────── */
352
428
  /** `%util.insp.<n>(v, r, d): string` — formatValue over the static type:
353
429
  * empty composites answer their literals (before the depth check, Node's
@@ -599,6 +675,66 @@ function inspectHelper(lowerer, t, loc) {
599
675
  type,
600
676
  loc,
601
677
  });
678
+ if (isPerfEntryType(lowerer, t)) {
679
+ // PerformanceEntry's custom inspect: `[PerformanceMark]` past the
680
+ // depth budget, otherwise the class name and a nested inspect of
681
+ // toJSON() one level shallower, in its own context.
682
+ const className = {
683
+ kind: "ternary",
684
+ cond: {
685
+ kind: "strEq",
686
+ negated: false,
687
+ left: get("entryType", STRING),
688
+ right: strLit("mark", loc),
689
+ type: BOOL,
690
+ loc,
691
+ },
692
+ then: strLit("PerformanceMark", loc),
693
+ else_: strLit("PerformanceMeasure", loc),
694
+ type: STRING,
695
+ loc,
696
+ };
697
+ const json = perfEntryJson(lowerer, v(), t, loc);
698
+ const dLess1 = {
699
+ kind: "bin",
700
+ op: "-",
701
+ left: d(),
702
+ right: numLit(1, loc),
703
+ type: F64,
704
+ loc,
705
+ };
706
+ locals.push({ id: "in.0", name: "inner", type: STRING, mutable: false });
707
+ body = [
708
+ {
709
+ kind: "if",
710
+ cond: { kind: "bin", op: ">", left: r(), right: d(), type: BOOL, loc },
711
+ then: [ret(concatAll([strLit("[", loc), className, strLit("]", loc)], loc))],
712
+ else_: null,
713
+ loc,
714
+ },
715
+ exprStmt({
716
+ kind: "libCall",
717
+ fn: "insp.nestedBegin",
718
+ args: [],
719
+ type: { kind: "void" },
720
+ loc,
721
+ }),
722
+ {
723
+ kind: "varDecl",
724
+ localId: "in.0",
725
+ init: inspectExpr(lowerer, json.type, json, numLit(0, loc), dLess1, loc),
726
+ loc,
727
+ },
728
+ ret({
729
+ kind: "libCall",
730
+ fn: "insp.nestedEnd",
731
+ args: [className, varRef("in.0", STRING, loc)],
732
+ type: STRING,
733
+ loc,
734
+ }),
735
+ ];
736
+ break;
737
+ }
602
738
  if (shape.tuple) {
603
739
  // Tuples ARE arrays to Node: bracket form, array-extras grouping.
604
740
  if (shape.fields.length === 0) {
@@ -910,13 +1046,13 @@ function inspectHelper(lowerer, t, loc) {
910
1046
  // Node prints the class's OWN name — the declaration's, never the
911
1047
  // IR name's module qualifier (`m0.Timer` is the frontend's spelling
912
1048
  // for a class declared in a non-entry module).
913
- const display = info.decl?.name?.text ?? info.def.name.replace(/^%/, "");
1049
+ const display = info.def.jsName ?? info.decl?.name?.text ?? info.def.name.replace(/^%/, "");
914
1050
  // #private fields never render: they are not properties in any
915
1051
  // observable way — Node's inspect omits them entirely (verified),
916
1052
  // so a class whose only fields are private prints as `C {}`.
917
1053
  const visible = info.def.fields.filter((f) => !f.name.startsWith("#"));
918
1054
  if (visible.length === 0) {
919
- body = [ret(strLit(`${display} {}`, loc))];
1055
+ body = [ret(strLit(display === "" ? "{}" : `${display} {}`, loc))];
920
1056
  break;
921
1057
  }
922
1058
  const get = (field, type) => ({
@@ -927,7 +1063,7 @@ function inspectHelper(lowerer, t, loc) {
927
1063
  type,
928
1064
  loc,
929
1065
  });
930
- body = [depthGate(`[${display}]`), ...begin()];
1066
+ body = [depthGate(display === "" ? "[Object]" : `[${display}]`), ...begin()];
931
1067
  // def.fields carries layout order: the base chain first, then own —
932
1068
  // exactly the own-property insertion order of a constructor that
933
1069
  // assigns in declaration order (SEMANTICS.md 36's stance). SYMBOL-
@@ -948,7 +1084,7 @@ function inspectHelper(lowerer, t, loc) {
948
1084
  const key = symNames.has(f.name) ? symbolFieldDisplayName(f.name) : inspectKey(f.name);
949
1085
  body.push(entry(concatAll([strLit(`${key}: `, loc), child(f.type, get(f.name, f.type))], loc), boolLit(false, loc)));
950
1086
  }
951
- body.push(ret(end(strLit("", loc), strLit(`${display} {`, loc), strLit("}", loc), false, boolLit(false, loc))));
1087
+ body.push(ret(end(strLit("", loc), strLit(display === "" ? "{" : `${display} {`, loc), strLit("}", loc), false, boolLit(false, loc))));
952
1088
  break;
953
1089
  }
954
1090
  default:
@@ -1108,7 +1244,7 @@ export function lowerConsoleInspectArg(lowerer, node, value, surface, loc) {
1108
1244
  if (t.kind === "undefinedT" || t.kind === "nullT") {
1109
1245
  // The baked text ("undefined"/"null"): the operand is a literal or a
1110
1246
  // pure read, so dropping its evaluation loses nothing. Effectful
1111
- // unit-typed operands keep a fence — a silent skip is banned.
1247
+ // unit-typed operands report SC1090 instead of being skipped.
1112
1248
  if (value.kind !== "unitLit" && !isSafeToRepeat(value)) {
1113
1249
  lowerer.unsupported("SC1090", node, `${surface} of an effectful '${lowerer.fmt(t)}'-typed expression (evaluate it first: const v = ...; ${surface}(v))`);
1114
1250
  }
@@ -1484,7 +1620,8 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverrid
1484
1620
  // context.actual)` — test/common's exit report): VALIDATE it as a
1485
1621
  // number (dynCheck) and format. A non-number dyn value throws the
1486
1622
  // catchable TypeError where Node would print its ToNumber (NaN
1487
- // for objects) — loud, never a silent wrong answer (SEMANTICS.md).
1623
+ // for objects) — it throws instead of returning a wrong result
1624
+ // (SEMANTICS.md).
1488
1625
  if (value.type.kind === "dyn") {
1489
1626
  return {
1490
1627
  kind: "libCall",
@@ -1536,7 +1673,8 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverrid
1536
1673
  // A checked-dynamic argument (`console.error('headers: %j',
1537
1674
  // headers)` — the suite's http logging idiom): the runtime dyn
1538
1675
  // walk stringifies JS-exactly (root undefined/function prints
1539
- // "undefined"; a handle in the tree throws the loud fence).
1676
+ // "undefined"; a handle in the tree throws the "not supported yet"
1677
+ // Error).
1540
1678
  if (value.type.kind === "dyn") {
1541
1679
  return { kind: "libCall", fn: "insp.jsonDyn", args: [value], type: STRING, loc };
1542
1680
  }
@@ -1545,6 +1683,61 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverrid
1545
1683
  }
1546
1684
  return { kind: "jsonStringify", value, type: STRING, loc };
1547
1685
  }
1686
+ case 102: {
1687
+ // %f — parseFloat(String(arg)) formatted: a number keeps its value
1688
+ // except -0, which String() prints as "0"; strings parse with the
1689
+ // global parseFloat; booleans and unit values (void calls and
1690
+ // null | undefined unions included) parse to NaN.
1691
+ const value = lowerer.lowerExpr(node);
1692
+ const format = (number) => ({
1693
+ kind: "libCall",
1694
+ fn: "insp.f64",
1695
+ args: [number],
1696
+ type: STRING,
1697
+ loc,
1698
+ });
1699
+ const parse = (text) => format({ kind: "libCall", fn: "num.parseFloat", args: [text], type: F64, loc });
1700
+ if (value.type.kind === "f64")
1701
+ return format({
1702
+ kind: "bin",
1703
+ op: "+",
1704
+ left: value,
1705
+ right: numLit(0, loc),
1706
+ type: F64,
1707
+ loc,
1708
+ });
1709
+ if (value.type.kind === "string")
1710
+ return parse(value);
1711
+ if (value.type.kind === "dyn") {
1712
+ return parse({
1713
+ kind: "libCall",
1714
+ fn: "dyn.toStringCoerce",
1715
+ args: [value],
1716
+ type: STRING,
1717
+ loc,
1718
+ });
1719
+ }
1720
+ const unitArms = (t) => t.kind === "union" && (lowerer.unions.get(t.unionId)?.arms.every(isUnitType) ?? false);
1721
+ if (value.type.kind === "bool" ||
1722
+ value.type.kind === "void" ||
1723
+ isUnitType(value.type) ||
1724
+ unitArms(value.type)) {
1725
+ // The argument still evaluates once, for its effects: the value
1726
+ // already lowered, as a statement (never a second lowering of the
1727
+ // node, whose lifted helpers and closures would be built twice).
1728
+ if (isSafeToDiscard(value))
1729
+ return strLit("NaN", loc);
1730
+ return {
1731
+ kind: "seqExpr",
1732
+ stmts: [{ kind: "exprStmt", expr: value, loc }],
1733
+ result: strLit("NaN", loc),
1734
+ type: STRING,
1735
+ loc,
1736
+ };
1737
+ }
1738
+ lowerer.noLowering(`util.format %f of '${lowerer.fmt(value.type)}' values`, node, "pass a number, string or boolean, or convert the argument with String() first");
1739
+ return strLit("NaN", loc);
1740
+ }
1548
1741
  case 79: // %O — inspect at the defaults
1549
1742
  return formatOArg(lowerer, node, 2, loc);
1550
1743
  case 111: // %o — showHidden semantics; depth 4
@@ -1562,6 +1755,7 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverrid
1562
1755
  case 100: // d
1563
1756
  case 79: // O
1564
1757
  case 111: // o
1758
+ case 102: // f
1565
1759
  case 105: {
1566
1760
  // i
1567
1761
  const node = args[++a];
@@ -1571,9 +1765,6 @@ export function lowerFormatCall(lowerer, expr, loc, withOptions, argNodesOverrid
1571
1765
  lastPos = i + 1;
1572
1766
  continue;
1573
1767
  }
1574
- case 102: // f — parseFloat's full grammar has no static lowering
1575
- lowerer.noLowering("util.format %f", expr, "parseFloat has no native lowering");
1576
- break;
1577
1768
  case 99: // c — consumes its argument, contributes nothing
1578
1769
  a += 1;
1579
1770
  if (lastPos !== i - 1)
@@ -1898,7 +2089,7 @@ function lowerParseArgsCall(lowerer, expr, loc) {
1898
2089
  * mustNotCall — `callSite.scriptName`:`callSite.lineNumber` in the
1899
2090
  * failure text — read a printable value instead of throwing). Argument
1900
2091
  * forms and TypeScript keep the SC2020 fence: a typed consumer asserting
1901
- * real frames must fail loudly at compile time, not read placeholders. */
2092
+ * real frames must fail at compile time instead of reading placeholders. */
1902
2093
  function lowerGetCallSitesCall(lowerer, expr, loc) {
1903
2094
  if (expr.arguments.length !== 0)
1904
2095
  return null;