@scriptc/compiler 0.4.0 → 0.4.1

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 (433) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +35 -5
  2. package/dist/backend/executable-features.js +7 -0
  3. package/dist/backend/executable-features.js.map +1 -1
  4. package/dist/backend/library-pack.js +3 -0
  5. package/dist/backend/library-pack.js.map +1 -1
  6. package/dist/backend/link-plan-core.d.ts +2 -0
  7. package/dist/backend/link-plan-core.js +2 -0
  8. package/dist/backend/link-plan-core.js.map +1 -1
  9. package/dist/backend/link-plan.d.ts +1 -0
  10. package/dist/backend/link-plan.js +1 -0
  11. package/dist/backend/link-plan.js.map +1 -1
  12. package/dist/backend/llvm/array-search.js +3 -1
  13. package/dist/backend/llvm/array-search.js.map +1 -1
  14. package/dist/backend/llvm/classes.d.ts +27 -1
  15. package/dist/backend/llvm/classes.js +115 -22
  16. package/dist/backend/llvm/classes.js.map +1 -1
  17. package/dist/backend/llvm/classes.test.js +21 -9
  18. package/dist/backend/llvm/classes.test.js.map +1 -1
  19. package/dist/backend/llvm/common.d.ts +21 -3
  20. package/dist/backend/llvm/common.js +50 -3
  21. package/dist/backend/llvm/common.js.map +1 -1
  22. package/dist/backend/llvm/dense-array-access.d.ts +3 -1
  23. package/dist/backend/llvm/dense-array-access.js +61 -38
  24. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  25. package/dist/backend/llvm/dense-array-access.test.js +4 -0
  26. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  27. package/dist/backend/llvm/dense-array-loops.js +3 -3
  28. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  29. package/dist/backend/llvm/dyn.d.ts +9 -0
  30. package/dist/backend/llvm/dyn.js +62 -6
  31. package/dist/backend/llvm/dyn.js.map +1 -1
  32. package/dist/backend/llvm/emit-function.js +5 -2
  33. package/dist/backend/llvm/emit-function.js.map +1 -1
  34. package/dist/backend/llvm/emit-module.js +54 -32
  35. package/dist/backend/llvm/emit-module.js.map +1 -1
  36. package/dist/backend/llvm/emit-statements.d.ts +3 -2
  37. package/dist/backend/llvm/emit-statements.js +90 -13
  38. package/dist/backend/llvm/emit-statements.js.map +1 -1
  39. package/dist/backend/llvm/emitter.d.ts +20 -9
  40. package/dist/backend/llvm/emitter.js +42 -31
  41. package/dist/backend/llvm/emitter.js.map +1 -1
  42. package/dist/backend/llvm/expr-calls.js +17 -4
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-containers.js +6 -9
  45. package/dist/backend/llvm/expr-containers.js.map +1 -1
  46. package/dist/backend/llvm/expr-dynamic.js +46 -4
  47. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  48. package/dist/backend/llvm/expr-primitives.js +3 -3
  49. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  50. package/dist/backend/llvm/expr-primitives.test.js +55 -0
  51. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  52. package/dist/backend/llvm/expr-stream-bridges.js +11 -15
  53. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  54. package/dist/backend/llvm/integer-clones.js +3 -3
  55. package/dist/backend/llvm/integer-clones.js.map +1 -1
  56. package/dist/backend/llvm/js-ic.d.ts +18 -0
  57. package/dist/backend/llvm/js-ic.js +712 -0
  58. package/dist/backend/llvm/js-ic.js.map +1 -0
  59. package/dist/backend/llvm/jsval.js +139 -11
  60. package/dist/backend/llvm/jsval.js.map +1 -1
  61. package/dist/backend/llvm/lib-process.js +4 -3
  62. package/dist/backend/llvm/lib-process.js.map +1 -1
  63. package/dist/backend/llvm/lib-shared.js +22 -0
  64. package/dist/backend/llvm/lib-shared.js.map +1 -1
  65. package/dist/backend/llvm/local-array-reads.js +40 -31
  66. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  67. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  68. package/dist/backend/llvm/map-number-lookup.js +43 -7
  69. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  70. package/dist/backend/llvm/narrow-guards.js +64 -0
  71. package/dist/backend/llvm/narrow-guards.js.map +1 -1
  72. package/dist/backend/llvm/publish.d.ts +3 -0
  73. package/dist/backend/llvm/publish.js +36 -17
  74. package/dist/backend/llvm/publish.js.map +1 -1
  75. package/dist/backend/llvm/regions.js +2 -2
  76. package/dist/backend/llvm/regions.js.map +1 -1
  77. package/dist/backend/llvm/regions.test.js +7 -1
  78. package/dist/backend/llvm/regions.test.js.map +1 -1
  79. package/dist/backend/llvm/shapes.d.ts +8 -2
  80. package/dist/backend/llvm/shapes.js +9 -7
  81. package/dist/backend/llvm/shapes.js.map +1 -1
  82. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  83. package/dist/backend/llvm/speculative-integers.js +94 -6
  84. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  85. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  86. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  87. package/dist/backend/llvm/string-reads.d.ts +1 -1
  88. package/dist/backend/llvm/string-reads.js +4 -4
  89. package/dist/backend/llvm/string-reads.js.map +1 -1
  90. package/dist/backend/llvm/thread-slots.test.js +5 -4
  91. package/dist/backend/llvm/thread-slots.test.js.map +1 -1
  92. package/dist/backend/mangle.d.ts +5 -0
  93. package/dist/backend/mangle.js +7 -0
  94. package/dist/backend/mangle.js.map +1 -1
  95. package/dist/backend/native/contracts.d.ts +20 -0
  96. package/dist/backend/native/executable.js +20 -3
  97. package/dist/backend/native/executable.js.map +1 -1
  98. package/dist/backend/native/library.js +2 -1
  99. package/dist/backend/native/library.js.map +1 -1
  100. package/dist/backend/native-codegen.d.ts +6 -0
  101. package/dist/backend/native-codegen.js +19 -0
  102. package/dist/backend/native-codegen.js.map +1 -1
  103. package/dist/backend/native-codegen.test.js +27 -0
  104. package/dist/backend/native-codegen.test.js.map +1 -1
  105. package/dist/backend/native-link-info-core.d.ts +18 -0
  106. package/dist/backend/native-link-info-core.js.map +1 -1
  107. package/dist/backend/native-profile.d.ts +32 -0
  108. package/dist/backend/native-profile.js +39 -0
  109. package/dist/backend/native-profile.js.map +1 -0
  110. package/dist/backend/native-profile.test.d.ts +1 -0
  111. package/dist/backend/native-profile.test.js +58 -0
  112. package/dist/backend/native-profile.test.js.map +1 -0
  113. package/dist/backend/native-tools.d.ts +14 -0
  114. package/dist/backend/native-tools.js +13 -0
  115. package/dist/backend/native-tools.js.map +1 -1
  116. package/dist/backend/runtime-abi.d.ts +2 -2
  117. package/dist/backend/runtime-abi.js +2 -2
  118. package/dist/backend/runtime-pack-core.d.ts +4 -0
  119. package/dist/backend/runtime-pack-core.js +4 -0
  120. package/dist/backend/runtime-pack-core.js.map +1 -1
  121. package/dist/backend/runtime-pack-targets.test.js +4 -1
  122. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  123. package/dist/backend/runtime-pack.test.js +4 -1
  124. package/dist/backend/runtime-pack.test.js.map +1 -1
  125. package/dist/backend/target-diagnostics.js +7 -0
  126. package/dist/backend/target-diagnostics.js.map +1 -1
  127. package/dist/backend/warm-cache.js +3 -0
  128. package/dist/backend/warm-cache.js.map +1 -1
  129. package/dist/cli/command.js +63 -1
  130. package/dist/cli/command.js.map +1 -1
  131. package/dist/cli/host.d.ts +3 -0
  132. package/dist/cli/output-options.d.ts +2 -0
  133. package/dist/cli/output-options.js +9 -0
  134. package/dist/cli/output-options.js.map +1 -1
  135. package/dist/cli/usage.d.ts +11 -1
  136. package/dist/cli/usage.js +23 -0
  137. package/dist/cli/usage.js.map +1 -1
  138. package/dist/compile-types.d.ts +9 -0
  139. package/dist/contracts/check.js +1 -2
  140. package/dist/contracts/check.js.map +1 -1
  141. package/dist/executable/executable-cache.d.ts +10 -0
  142. package/dist/executable/executable-cache.js +6 -0
  143. package/dist/executable/executable-cache.js.map +1 -1
  144. package/dist/executable/executable-cache.test.js +5 -0
  145. package/dist/executable/executable-cache.test.js.map +1 -1
  146. package/dist/frontend/arguments-usage.d.ts +8 -0
  147. package/dist/frontend/arguments-usage.js +98 -0
  148. package/dist/frontend/arguments-usage.js.map +1 -1
  149. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  150. package/dist/frontend/arguments-usage.test.js +32 -0
  151. package/dist/frontend/arguments-usage.test.js.map +1 -0
  152. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  153. package/dist/frontend/builtin-package-aliases.js +133 -0
  154. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  155. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  156. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  157. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  158. package/dist/frontend/dts-paths.d.ts +4 -0
  159. package/dist/frontend/dts-paths.js +9 -1
  160. package/dist/frontend/dts-paths.js.map +1 -1
  161. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +8 -0
  162. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +50 -1
  163. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -1
  164. package/dist/frontend/lowering/builtins/callable-aliases.js +3 -2
  165. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  166. package/dist/frontend/lowering/builtins/crypto.d.ts +3 -0
  167. package/dist/frontend/lowering/builtins/crypto.js +4 -1
  168. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  169. package/dist/frontend/lowering/builtins/ecdh.d.ts +10 -0
  170. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  171. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  172. package/dist/frontend/lowering/builtins/json.js +52 -0
  173. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  174. package/dist/frontend/lowering/builtins/process.d.ts +9 -0
  175. package/dist/frontend/lowering/builtins/process.js +44 -0
  176. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  177. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +3 -0
  178. package/dist/frontend/lowering/builtins/promisify-callback.js +21 -3
  179. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  180. package/dist/frontend/lowering/builtins/reflection.js +26 -0
  181. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  182. package/dist/frontend/lowering/builtins/timers.js +5 -1
  183. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  184. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  185. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  186. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  187. package/dist/frontend/lowering/call-signatures.d.ts +4 -0
  188. package/dist/frontend/lowering/call-signatures.js +126 -9
  189. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  190. package/dist/frontend/lowering/cjs-exports-object.js +34 -1
  191. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  192. package/dist/frontend/lowering/class-dynamic-dispatch.js +9 -1
  193. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  194. package/dist/frontend/lowering/class-protocols.d.ts +10 -0
  195. package/dist/frontend/lowering/class-protocols.js +53 -3
  196. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  197. package/dist/frontend/lowering/class-prototypes.js +6 -1
  198. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  199. package/dist/frontend/lowering/class-to-primitive.d.ts +2 -2
  200. package/dist/frontend/lowering/class-to-primitive.js +6 -3
  201. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  202. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  203. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  204. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  205. package/dist/frontend/lowering/coercions/function-adapters.js +99 -70
  206. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  207. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -0
  208. package/dist/frontend/lowering/containers/array-callbacks.js +22 -19
  209. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  210. package/dist/frontend/lowering/containers/array-construction.js +7 -0
  211. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  212. package/dist/frontend/lowering/containers/array-methods.js +5 -0
  213. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  214. package/dist/frontend/lowering/containers/bytes.d.ts +9 -0
  215. package/dist/frontend/lowering/containers/bytes.js +493 -17
  216. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  217. package/dist/frontend/lowering/containers/collection-methods.js +72 -3
  218. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  219. package/dist/frontend/lowering/containers/string-and-regexp.js +49 -13
  220. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  221. package/dist/frontend/lowering/cycle-initialization.d.ts +26 -10
  222. package/dist/frontend/lowering/cycle-initialization.js +152 -35
  223. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  224. package/dist/frontend/lowering/expressions/array-literals.js +33 -13
  225. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  226. package/dist/frontend/lowering/expressions/binary.js +79 -5
  227. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  228. package/dist/frontend/lowering/expressions/element-access.js +13 -6
  229. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  230. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +14 -2
  231. package/dist/frontend/lowering/expressions/keyed-field-targets.js +91 -10
  232. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  233. package/dist/frontend/lowering/expressions/narrowing.js +17 -2
  234. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  235. package/dist/frontend/lowering/expressions/object-literals.js +48 -1
  236. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  237. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  238. package/dist/frontend/lowering/expressions/optional-chains.js +12 -3
  239. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  240. package/dist/frontend/lowering/expressions/property-access.d.ts +5 -0
  241. package/dist/frontend/lowering/expressions/property-access.js +252 -9
  242. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  243. package/dist/frontend/lowering/expressions/relational.js +49 -4
  244. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  245. package/dist/frontend/lowering/expressions/typeof.js +13 -0
  246. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  247. package/dist/frontend/lowering/expressions/updates.js +1 -1
  248. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  249. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  250. package/dist/frontend/lowering/generator-delegation.js +191 -1
  251. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  252. package/dist/frontend/lowering/generic-functions.d.ts +4 -0
  253. package/dist/frontend/lowering/generic-functions.js +213 -56
  254. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  255. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  256. package/dist/frontend/lowering/handle-properties.js +281 -0
  257. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  258. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  259. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  260. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  261. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  262. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  263. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  264. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  265. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  266. package/dist/frontend/lowering/lower-builtin-values.js +1 -0
  267. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  268. package/dist/frontend/lowering/lower-calls.js +166 -7
  269. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  270. package/dist/frontend/lowering/lower-classes.d.ts +4 -0
  271. package/dist/frontend/lowering/lower-classes.js +59 -7
  272. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  273. package/dist/frontend/lowering/lower-dgram.js +62 -13
  274. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  275. package/dist/frontend/lowering/lower-exprs.js +32 -1
  276. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  277. package/dist/frontend/lowering/lower-functions.js +4 -0
  278. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  279. package/dist/frontend/lowering/lower-generators.js +10 -4
  280. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  281. package/dist/frontend/lowering/lower-inspect.js +569 -11
  282. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  283. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  284. package/dist/frontend/lowering/lower-modules.js +212 -67
  285. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  286. package/dist/frontend/lowering/lower-namespaces.js +20 -0
  287. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  288. package/dist/frontend/lowering/lower-server.js +26 -1
  289. package/dist/frontend/lowering/lower-server.js.map +1 -1
  290. package/dist/frontend/lowering/lower-stdlib.js +28 -9
  291. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  292. package/dist/frontend/lowering/lower-stmts.d.ts +7 -10
  293. package/dist/frontend/lowering/lower-stmts.js +418 -51
  294. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  295. package/dist/frontend/lowering/lower-timers.js +17 -1
  296. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  297. package/dist/frontend/lowering/lowerer.d.ts +29 -5
  298. package/dist/frontend/lowering/lowerer.js +172 -25
  299. package/dist/frontend/lowering/lowerer.js.map +1 -1
  300. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  301. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  302. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  303. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  304. package/dist/frontend/lowering/static-typeof.js +133 -0
  305. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  306. package/dist/frontend/lowering/string-index-bounds.js +3 -2
  307. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  308. package/dist/frontend/lowering/surfaces.js +30 -4
  309. package/dist/frontend/lowering/surfaces.js.map +1 -1
  310. package/dist/frontend/lowering/thenables.d.ts +16 -0
  311. package/dist/frontend/lowering/thenables.js +124 -0
  312. package/dist/frontend/lowering/thenables.js.map +1 -0
  313. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  314. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  315. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  316. package/dist/frontend/npm-static-bundled-chunks.d.ts +8 -1
  317. package/dist/frontend/npm-static-bundled-chunks.js +173 -2
  318. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
  319. package/dist/frontend/npm-static-bundled-chunks.test.js +112 -0
  320. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
  321. package/dist/frontend/npm-static-bundled-esm.js +224 -4
  322. package/dist/frontend/npm-static-bundled-esm.js.map +1 -1
  323. package/dist/frontend/npm-static-bundled-esm.test.js +129 -0
  324. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -1
  325. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  326. package/dist/frontend/npm-static-enum-iife.js +280 -0
  327. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  328. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  329. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  330. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  331. package/dist/frontend/npm-static.d.ts +8 -0
  332. package/dist/frontend/npm-static.js +46 -1
  333. package/dist/frontend/npm-static.js.map +1 -1
  334. package/dist/frontend/npm.js +13 -0
  335. package/dist/frontend/npm.js.map +1 -1
  336. package/dist/frontend/package-shims.d.ts +47 -0
  337. package/dist/frontend/package-shims.js +300 -0
  338. package/dist/frontend/package-shims.js.map +1 -0
  339. package/dist/frontend/pipeline.js +67 -1
  340. package/dist/frontend/pipeline.js.map +1 -1
  341. package/dist/frontend/program.d.ts +8 -0
  342. package/dist/frontend/program.js +72 -9
  343. package/dist/frontend/program.js.map +1 -1
  344. package/dist/frontend/resolve.js +13 -0
  345. package/dist/frontend/resolve.js.map +1 -1
  346. package/dist/frontend/services.d.ts +6 -0
  347. package/dist/frontend/services.js +19 -0
  348. package/dist/frontend/services.js.map +1 -1
  349. package/dist/frontend/ts7/program-host.d.ts +6 -5
  350. package/dist/frontend/ts7/program-host.js +7 -0
  351. package/dist/frontend/ts7/program-host.js.map +1 -1
  352. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  353. package/dist/frontend/ts7/semantic-model.js +26 -0
  354. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  355. package/dist/frontend/ts7/session.d.ts +19 -4
  356. package/dist/frontend/ts7/session.js.map +1 -1
  357. package/dist/frontend/type-mapper.js +201 -15
  358. package/dist/frontend/type-mapper.js.map +1 -1
  359. package/dist/index.d.ts +1 -0
  360. package/dist/index.js +58 -6
  361. package/dist/index.js.map +1 -1
  362. package/dist/ir/array-length-stability.d.ts +3 -2
  363. package/dist/ir/array-length-stability.js +15 -2
  364. package/dist/ir/array-length-stability.js.map +1 -1
  365. package/dist/ir/array-length-stability.test.js +22 -1
  366. package/dist/ir/array-length-stability.test.js.map +1 -1
  367. package/dist/ir/builtin-effects.js +13 -0
  368. package/dist/ir/builtin-effects.js.map +1 -1
  369. package/dist/ir/builtin-signatures.d.ts +1 -1
  370. package/dist/ir/builtin-signatures.js +46 -4
  371. package/dist/ir/builtin-signatures.js.map +1 -1
  372. package/dist/ir/integer-loop-facts.d.ts +5 -0
  373. package/dist/ir/integer-loop-facts.js +79 -14
  374. package/dist/ir/integer-loop-facts.js.map +1 -1
  375. package/dist/ir/integer-ranges.d.ts +10 -1
  376. package/dist/ir/integer-ranges.js +122 -25
  377. package/dist/ir/integer-ranges.js.map +1 -1
  378. package/dist/ir/integer-ranges.test.js +191 -1
  379. package/dist/ir/integer-ranges.test.js.map +1 -1
  380. package/dist/ir/ir.js +8 -0
  381. package/dist/ir/ir.js.map +1 -1
  382. package/dist/ir/js-ic.d.ts +52 -0
  383. package/dist/ir/js-ic.js +199 -0
  384. package/dist/ir/js-ic.js.map +1 -0
  385. package/dist/ir/js-ic.test.d.ts +1 -0
  386. package/dist/ir/js-ic.test.js +148 -0
  387. package/dist/ir/js-ic.test.js.map +1 -0
  388. package/dist/ir/jsval.js +38 -4
  389. package/dist/ir/jsval.js.map +1 -1
  390. package/dist/ir/runtime-features.d.ts +39 -4
  391. package/dist/ir/runtime-features.js +229 -99
  392. package/dist/ir/runtime-features.js.map +1 -1
  393. package/dist/ir/traverse.js +110 -68
  394. package/dist/ir/traverse.js.map +1 -1
  395. package/dist/ir/validate.js +21 -8
  396. package/dist/ir/validate.js.map +1 -1
  397. package/dist/ir/validate.test.js +15 -2
  398. package/dist/ir/validate.test.js.map +1 -1
  399. package/dist/library/ir-policy.js +1 -0
  400. package/dist/library/ir-policy.js.map +1 -1
  401. package/dist/native/cli.js +17 -0
  402. package/dist/native/cli.js.map +1 -1
  403. package/dist/native/compiler.js +33 -4
  404. package/dist/native/compiler.js.map +1 -1
  405. package/dist/native/executable-cache.js +3 -0
  406. package/dist/native/executable-cache.js.map +1 -1
  407. package/dist/native/prepare.js +3 -0
  408. package/dist/native/prepare.js.map +1 -1
  409. package/dist/native/sanitizer.test.js +7 -0
  410. package/dist/native/sanitizer.test.js.map +1 -1
  411. package/package.json +21 -20
  412. package/shims/fs-extra/core/api.ts +1192 -0
  413. package/shims/fs-extra/index.ts +9 -0
  414. package/shims/undici/core/agent.ts +163 -0
  415. package/shims/undici/core/api.ts +93 -0
  416. package/shims/undici/core/client.ts +1304 -0
  417. package/shims/undici/core/connector.ts +157 -0
  418. package/shims/undici/core/diagnostics-types.ts +68 -0
  419. package/shims/undici/core/diagnostics.ts +16 -0
  420. package/shims/undici/core/dispatcher.ts +574 -0
  421. package/shims/undici/core/errors-v5.ts +22 -0
  422. package/shims/undici/core/errors-v7.ts +25 -0
  423. package/shims/undici/core/errors.ts +255 -0
  424. package/shims/undici/core/fetch.ts +635 -0
  425. package/shims/undici/core/pool.ts +280 -0
  426. package/shims/undici/core/readable.ts +268 -0
  427. package/shims/undici/core/request.ts +313 -0
  428. package/shims/undici/core/timers.ts +80 -0
  429. package/shims/undici/core/types.ts +167 -0
  430. package/shims/undici/core/util.ts +67 -0
  431. package/shims/undici/v5.ts +119 -0
  432. package/shims/undici/v7.ts +119 -0
  433. package/surface-manifest.json +2 -4
@@ -1,4 +1,4 @@
1
- import { dynUndefinedExpr, boolLit, helperLoc, numLit, strLit, varRef } from "../../ir/build.js";
1
+ import { dynUndefinedExpr, boolLit, helperLoc, nodeThrowExpr, numLit, strLit, varRef, } from "../../ir/build.js";
2
2
  import { builtinClassDynValueOf, builtinClassKindOf } from "./builtins/builtin-class-dyn.js";
3
3
  import { InternalCompilerError } from "../../errors.js";
4
4
  import * as ts from "../ts7/adapter.js";
@@ -85,13 +85,540 @@ function inspectKey(name) {
85
85
  function errorRenderable(info) {
86
86
  // The builtin classes' name/message/code live in runtime slots (the
87
87
  // ScrError prefix insp.error reads), not IR fields; only USER-declared
88
- // fields are own properties the runtime rendering would miss. #private
89
- // fields are NOT own properties — Node never prints them — so they
90
- // don't disqualify.
91
- if (!info.builtinError && info.def.fields.some((f) => !f.name.startsWith("#")))
92
- return false;
88
+ // fields are own properties the runtime rendering would miss. A user
89
+ // class's layout repeats its builtin base's prefix fields, which are
90
+ // those same slots. #private fields are NOT own properties — Node never
91
+ // prints them — so they don't disqualify.
92
+ if (!info.builtinError) {
93
+ const inherited = new Set();
94
+ for (let c = info.base; c; c = c.base) {
95
+ if (c.builtinError || c.def.runtime)
96
+ for (const f of c.def.fields)
97
+ inherited.add(f.name);
98
+ }
99
+ if (info.def.fields.some((f) => !f.name.startsWith("#") && !inherited.has(f.name)))
100
+ return false;
101
+ }
93
102
  return info.subclasses.every((s) => errorRenderable(s));
94
103
  }
104
+ /** The accessors that change what Node reads for an error's header. The
105
+ * runtime renders the instance's own name and message slots. */
106
+ const ERROR_HEADER_ACCESSORS = [
107
+ "get:name",
108
+ "set:name",
109
+ "get:message",
110
+ "set:message",
111
+ "get:stack",
112
+ "set:stack",
113
+ ];
114
+ /** Whether Node's header for an instance of `info`'s hierarchy can differ
115
+ * from the runtime's slots: a program class among its ancestors or
116
+ * descendants declares a `name`, `message` or `stack` accessor, or the
117
+ * program writes a prototype's `name` or `message`. */
118
+ function errorHeaderOverridden(lowerer, info) {
119
+ if (lowerer.prototypeMethodAccesses.has("name") || lowerer.prototypeMethodAccesses.has("message"))
120
+ return true;
121
+ const declares = (c) => !c.builtinError && !c.def.runtime && ERROR_HEADER_ACCESSORS.some((m) => c.methods.has(m));
122
+ for (let c = info.base; c; c = c.base)
123
+ if (declares(c))
124
+ return true;
125
+ const below = (c) => declares(c) || c.subclasses.some(below);
126
+ return below(info);
127
+ }
128
+ /** Error keys Node's error inspector folds into the base or hides. */
129
+ const ERROR_SPECIAL_KEYS = new Set(["name", "message", "stack", "cause", "errors"]);
130
+ /** The declared own (enumerable) fields of a user error class, in layout
131
+ * order (the base chain first). */
132
+ function ownErrorFields(info) {
133
+ // The builtin bases' layout fields (name, message) are runtime slots the
134
+ // error base already renders, not own enumerable properties.
135
+ const builtin = new Set();
136
+ for (let c = info.base; c; c = c.base) {
137
+ if (c.builtinError || c.def.runtime)
138
+ for (const f of c.def.fields)
139
+ builtin.add(f.name);
140
+ }
141
+ return info.def.fields.filter((f) => isClassOwnEnumerableFieldName(f.name) && !builtin.has(f.name));
142
+ }
143
+ /** `info` and its descendants that declare fields, most-derived first (a
144
+ * runtime instance tests against its own class before an ancestor's). */
145
+ function fieldedErrorClasses(info) {
146
+ const out = [];
147
+ const visit = (c) => {
148
+ for (const s of c.subclasses)
149
+ visit(s);
150
+ if (!c.builtinError && !c.def.runtime && ownErrorFields(c).length > 0)
151
+ out.push(c);
152
+ };
153
+ visit(info);
154
+ return out;
155
+ }
156
+ /** Why a fielded error class's own properties have no static rendering,
157
+ * or null when every field renders. `visiting` and `out` are the caller's
158
+ * inspectSupport walk: a field typed as the class itself (`next?: Chain`)
159
+ * is a recursive shape, not a new walk. */
160
+ function fieldedErrorReason(lowerer, info, visiting = new Set(), out = { recursive: false }) {
161
+ const key = `error:${info.def.name}`;
162
+ if (visiting.has(key)) {
163
+ out.recursive = true;
164
+ return null;
165
+ }
166
+ visiting.add(key);
167
+ try {
168
+ for (let c = info; c && !c.builtinError && !c.def.runtime; c = c.base) {
169
+ // Node prints the own properties in creation order, which puts a
170
+ // declared `cause` among the fields; the cause renders after them.
171
+ if (c.fieldOrder.some((f) => f.errorCause))
172
+ return "its field 'cause' is one Node's error inspector treats specially";
173
+ // A JavaScript class's fields exist once its constructor creates them,
174
+ // which can be conditional; the layout reads every field.
175
+ if (c.decl && isJsSourceFile(c.decl.getSourceFile()) && ownErrorFields(c).length > 0)
176
+ return "its fields are JavaScript properties, which its constructor may not create";
177
+ }
178
+ for (const f of ownErrorFields(info)) {
179
+ if (ERROR_SPECIAL_KEYS.has(f.name))
180
+ return `its field '${f.name}' is one Node's error inspector treats specially`;
181
+ const why = inspectSupport(lowerer, f.type, visiting, out);
182
+ if (why !== null)
183
+ return `its field '${f.name}': ${why}`;
184
+ }
185
+ return null;
186
+ }
187
+ finally {
188
+ visiting.delete(key);
189
+ }
190
+ }
191
+ /** True when an instance of `c` can contain itself: its fields reach `c`
192
+ * or one of its bases, whose slots can hold a `c` (`next: Chain` in a
193
+ * subclass of Chain, a field typed as Error). */
194
+ function errorInstanceReachesItself(lowerer, c) {
195
+ const holders = new Set();
196
+ for (let a = c; a; a = a.base)
197
+ holders.add(a.def.name);
198
+ const seen = new Set();
199
+ const walk = (u) => {
200
+ for (const x of typeConstituents(lowerer, u)) {
201
+ if (x.kind === "object" && holders.has(x.className))
202
+ return true;
203
+ const k = typeKey(x);
204
+ if (!seen.has(k)) {
205
+ seen.add(k);
206
+ if (walk(x))
207
+ return true;
208
+ }
209
+ }
210
+ return false;
211
+ };
212
+ return walk({ kind: "object", className: c.def.name });
213
+ }
214
+ /** An error value whose runtime class may be a program-declared subclass,
215
+ * which may declare fields (`class Bailable extends Error { bail = false }`)
216
+ * or carry a `cause`: Node prints the error base (`[Bailable [Error]: m]`,
217
+ * the stackless form compiled errors use) followed by the own properties,
218
+ * `[Bailable [Error]: m] { bail: true }`, with the usual single-line/
219
+ * multi-line choice counting the base. Each program class (most-derived
220
+ * first) is an instanceof arm; other values keep the runtime's error
221
+ * rendering. Beyond the depth budget an instance with own properties
222
+ * prints `[Name]`, as Node does for any object with keys; one without
223
+ * prints its header. */
224
+ function errorInspectHelper(lowerer, t, info, loc) {
225
+ const key = `insp.userError:${typeKey(t)}`;
226
+ const existing = lowerer.inspectHelpers.get(key);
227
+ if (existing)
228
+ return existing;
229
+ const name = `%util.insp.${lowerer.inspectHelpers.size}`;
230
+ lowerer.inspectHelpers.set(key, name);
231
+ const v = () => varRef("v.0", t, loc);
232
+ const r = () => varRef("r.0", F64, loc);
233
+ const d = () => varRef("d.0", F64, loc);
234
+ const rPlus1 = () => ({
235
+ kind: "bin",
236
+ op: "+",
237
+ left: r(),
238
+ right: numLit(1, loc),
239
+ type: F64,
240
+ loc,
241
+ });
242
+ const base = () => ({
243
+ kind: "libCall",
244
+ fn: "insp.error",
245
+ args: [v(), r(), d()],
246
+ type: STRING,
247
+ loc,
248
+ });
249
+ const error = () => lowerer.upcastTo(v(), "%Error");
250
+ const hasCause = () => ({
251
+ kind: "libCall",
252
+ fn: "insp.errorHasCause",
253
+ args: [error()],
254
+ type: BOOL,
255
+ loc,
256
+ });
257
+ const entry = (text) => ({
258
+ kind: "exprStmt",
259
+ expr: {
260
+ kind: "libCall",
261
+ fn: "insp.entry",
262
+ args: [text, boolLit(false, loc)],
263
+ type: VOID,
264
+ loc,
265
+ },
266
+ loc,
267
+ });
268
+ /** The own properties of an instance of `c`: its fields, then its
269
+ * `cause` (an assignment in the constructor or later, or the
270
+ * constructor's options, which Node lists last as `[cause]`). */
271
+ const propertiesArm = (c, display, fields) => {
272
+ const cls = { kind: "object", className: c.def.name };
273
+ const instance = c.def.name === t.className ? v() : { kind: "downcast", value: v(), type: cls, loc };
274
+ // A class whose fields can hold the instance itself (`next: Chain`)
275
+ // runs Node's circular machinery, as other cycle-capable objects do:
276
+ // an instance already on the traversal stack renders [Circular *N],
277
+ // before the depth answer, and the frame's text gets the <ref *N>
278
+ // prefix when the walk found it circular.
279
+ const onCycle = errorInstanceReachesItself(lowerer, c);
280
+ const circular = () => varRef("cc.0", F64, loc);
281
+ const arm = [
282
+ ...(onCycle
283
+ ? [
284
+ {
285
+ kind: "varDecl",
286
+ localId: "cc.0",
287
+ init: { kind: "libCall", fn: "insp.circCheck", args: [v()], type: F64, loc },
288
+ loc,
289
+ },
290
+ {
291
+ kind: "if",
292
+ cond: {
293
+ kind: "bin",
294
+ op: ">",
295
+ left: circular(),
296
+ right: numLit(0, loc),
297
+ type: BOOL,
298
+ loc,
299
+ },
300
+ then: [
301
+ {
302
+ kind: "return",
303
+ value: {
304
+ kind: "libCall",
305
+ fn: "insp.circular",
306
+ args: [circular()],
307
+ type: STRING,
308
+ loc,
309
+ },
310
+ loc,
311
+ },
312
+ ],
313
+ else_: null,
314
+ loc,
315
+ },
316
+ ]
317
+ : []),
318
+ {
319
+ kind: "if",
320
+ cond: { kind: "bin", op: ">", left: r(), right: d(), type: BOOL, loc },
321
+ then: [{ kind: "return", value: strLit(`[${display}]`, loc), loc }],
322
+ else_: null,
323
+ loc,
324
+ },
325
+ {
326
+ kind: "varDecl",
327
+ localId: "base.0",
328
+ init: improvedErrorBase(lowerer, v(), base(), display, loc),
329
+ loc,
330
+ },
331
+ {
332
+ kind: "exprStmt",
333
+ expr: { kind: "libCall", fn: "insp.begin", args: [rPlus1()], type: VOID, loc },
334
+ loc,
335
+ },
336
+ ...(onCycle
337
+ ? [
338
+ {
339
+ kind: "exprStmt",
340
+ expr: { kind: "libCall", fn: "insp.seenPush", args: [v()], type: VOID, loc },
341
+ loc,
342
+ },
343
+ ]
344
+ : []),
345
+ ];
346
+ for (const f of fields) {
347
+ const read = {
348
+ kind: "fieldGet",
349
+ obj: instance,
350
+ className: c.def.name,
351
+ field: f.name,
352
+ type: f.type,
353
+ loc,
354
+ };
355
+ arm.push(entry(concatAll([
356
+ strLit(`${inspectKey(f.name)}: `, loc),
357
+ inspectExpr(lowerer, f.type, read, rPlus1(), d(), loc),
358
+ ], loc)));
359
+ }
360
+ arm.push({
361
+ kind: "if",
362
+ cond: hasCause(),
363
+ then: [
364
+ entry({
365
+ kind: "libCall",
366
+ fn: "insp.errorCause",
367
+ args: [error(), rPlus1(), d()],
368
+ type: STRING,
369
+ loc,
370
+ }),
371
+ ],
372
+ else_: null,
373
+ loc,
374
+ });
375
+ const ended = {
376
+ kind: "libCall",
377
+ fn: "insp.end",
378
+ args: [
379
+ varRef("base.0", STRING, loc),
380
+ strLit("{", loc),
381
+ strLit("}", loc),
382
+ rPlus1(),
383
+ boolLit(false, loc),
384
+ boolLit(false, loc),
385
+ ],
386
+ type: STRING,
387
+ loc,
388
+ };
389
+ arm.push({
390
+ kind: "return",
391
+ value: onCycle
392
+ ? { kind: "libCall", fn: "insp.refWrap", args: [v(), ended], type: STRING, loc }
393
+ : ended,
394
+ loc,
395
+ });
396
+ return arm;
397
+ };
398
+ const body = [];
399
+ for (const c of userErrorClasses(info)) {
400
+ const display = c.def.jsName ?? c.decl?.name?.text ?? c.def.name.replace(/^%/, "");
401
+ const fields = ownErrorFields(c);
402
+ const why = fields.length > 0 ? fieldedErrorReason(lowerer, c) : null;
403
+ let arm;
404
+ if (why !== null) {
405
+ // An instance of a subclass whose own properties have no rendering
406
+ // throws a named refusal instead of printing a partial object.
407
+ arm = [
408
+ {
409
+ kind: "return",
410
+ value: nodeThrowExpr(0, "SC2020", `inspecting a '${display}' error (${why}) is not supported yet`, STRING, loc),
411
+ loc,
412
+ },
413
+ ];
414
+ }
415
+ else if (fields.length === 0) {
416
+ // A field-less program class: without a `cause` it has no own
417
+ // properties, and Node prints the header alone at any depth.
418
+ arm = [
419
+ {
420
+ kind: "if",
421
+ cond: { kind: "unary", op: "!", operand: hasCause(), type: BOOL, loc },
422
+ then: [
423
+ { kind: "return", value: improvedErrorBase(lowerer, v(), base(), display, loc), loc },
424
+ ],
425
+ else_: null,
426
+ loc,
427
+ },
428
+ ...propertiesArm(c, display, fields),
429
+ ];
430
+ }
431
+ else {
432
+ arm = propertiesArm(c, display, fields);
433
+ }
434
+ if (c.def.name === t.className) {
435
+ body.push({ kind: "block", body: arm, loc });
436
+ break;
437
+ }
438
+ body.push({
439
+ kind: "if",
440
+ cond: { kind: "instanceOf", value: v(), className: c.def.name, type: BOOL, loc },
441
+ then: arm,
442
+ else_: null,
443
+ loc,
444
+ });
445
+ }
446
+ if (body.at(-1)?.kind !== "block")
447
+ body.push({ kind: "return", value: base(), loc });
448
+ const fn = {
449
+ name,
450
+ params: [
451
+ { localId: "v.0", name: "v", type: t },
452
+ { localId: "r.0", name: "r", type: F64 },
453
+ { localId: "d.0", name: "d", type: F64 },
454
+ ],
455
+ returnType: STRING,
456
+ locals: [
457
+ { id: "v.0", name: "v", type: t, mutable: false },
458
+ { id: "r.0", name: "r", type: F64, mutable: false },
459
+ { id: "d.0", name: "d", type: F64, mutable: false },
460
+ { id: "base.0", name: "base", type: STRING, mutable: false },
461
+ { id: "cc.0", name: "cc", type: F64, mutable: false },
462
+ { id: "name.0", name: "name", type: STRING, mutable: true },
463
+ { id: "raw.0", name: "raw", type: STRING, mutable: true },
464
+ ],
465
+ body,
466
+ loc,
467
+ };
468
+ // Dynamic stores (a JavaScript class's `this.x = ...` outside its
469
+ // declared fields, or a write through an untyped reference) add a
470
+ // property bag to a class after this helper was built. The rendering
471
+ // reads only a `cause` from it, so an instance whose bag holds another
472
+ // property throws a named refusal instead of printing a partial object.
473
+ lowerer.shapeOrderHelperFinalizers.push(() => {
474
+ const bagged = [info, ...userErrorClasses(info)].filter((c) => !c.builtinError &&
475
+ !c.def.runtime &&
476
+ c.def.fields.some((f) => f.name === DYN_CLASS_PROPERTIES));
477
+ if (bagged.length === 0)
478
+ return;
479
+ fn.body = [
480
+ ...bagged.map((c) => ({
481
+ kind: "if",
482
+ cond: {
483
+ kind: "logical",
484
+ op: "&&",
485
+ left: { kind: "instanceOf", value: v(), className: c.def.name, type: BOOL, loc },
486
+ right: {
487
+ kind: "libCall",
488
+ fn: "insp.errorBagHasProperties",
489
+ args: [
490
+ {
491
+ kind: "fieldGet",
492
+ obj: c.def.name === t.className
493
+ ? v()
494
+ : {
495
+ kind: "downcast",
496
+ value: v(),
497
+ type: { kind: "object", className: c.def.name },
498
+ loc,
499
+ },
500
+ className: c.def.name,
501
+ field: DYN_CLASS_PROPERTIES,
502
+ type: DYN,
503
+ loc,
504
+ },
505
+ ],
506
+ type: BOOL,
507
+ loc,
508
+ },
509
+ type: BOOL,
510
+ loc,
511
+ },
512
+ then: [
513
+ {
514
+ kind: "return",
515
+ value: nodeThrowExpr(0, "SC2020", `inspecting a '${c.def.jsName ?? c.def.name.replace(/^%/, "")}' error with properties created at run time is not supported yet`, STRING, loc),
516
+ loc,
517
+ },
518
+ ],
519
+ else_: null,
520
+ loc,
521
+ })),
522
+ ...body,
523
+ ];
524
+ });
525
+ lowerer.liftedFns.push(fn);
526
+ return name;
527
+ }
528
+ /** The program-declared classes among `info` and its descendants, most
529
+ * derived first (an instance tests against its own class before an
530
+ * ancestor's). Runtime-provided error classes are not among them. */
531
+ function userErrorClasses(info) {
532
+ const out = [];
533
+ const visit = (c) => {
534
+ for (const s of c.subclasses)
535
+ visit(s);
536
+ if (!c.builtinError && !c.def.runtime)
537
+ out.push(c);
538
+ };
539
+ visit(info);
540
+ return out;
541
+ }
542
+ /** Node's improveStack over the stackless base (`[Error: m]`): when the
543
+ * instance's constructor name differs from its `name` and the name ends in
544
+ * "Error", the header names both — `[Bailable [Error]: m]`, or
545
+ * `[FetchError: m]` when the constructor name already contains it. */
546
+ function improvedErrorBase(lowerer, value, base, display, loc) {
547
+ const str = (method, receiver, args, type) => ({
548
+ kind: "strIntrinsic",
549
+ method,
550
+ receiver,
551
+ args,
552
+ type,
553
+ loc,
554
+ });
555
+ const and = (left, right) => ({
556
+ kind: "logical",
557
+ op: "&&",
558
+ left,
559
+ right,
560
+ type: BOOL,
561
+ loc,
562
+ });
563
+ const eq = (left, right, negated = false) => ({
564
+ kind: "strEq",
565
+ negated,
566
+ left,
567
+ right,
568
+ type: BOOL,
569
+ loc,
570
+ });
571
+ const nameRef = () => varRef("name.0", STRING, loc);
572
+ const baseRef = () => varRef("raw.0", STRING, loc);
573
+ const after = () => ({
574
+ kind: "bin",
575
+ op: "+",
576
+ left: str("length", nameRef(), [], F64),
577
+ right: numLit(1, loc),
578
+ type: F64,
579
+ loc,
580
+ });
581
+ const next = () => str("charAt", baseRef(), [after()], STRING);
582
+ const cond = and(and(eq(nameRef(), strLit(display, loc), true), str("endsWith", nameRef(), [strLit("Error", loc)], BOOL)), and(str("startsWith", baseRef(), [concatAll([strLit("[", loc), nameRef()], loc)], BOOL), {
583
+ kind: "logical",
584
+ op: "||",
585
+ left: eq(next(), strLit(":", loc)),
586
+ right: eq(next(), strLit("]", loc)),
587
+ type: BOOL,
588
+ loc,
589
+ }));
590
+ const rest = () => str("slice", baseRef(), [after()], STRING);
591
+ const improved = {
592
+ kind: "ternary",
593
+ cond: str("includes", strLit(display, loc), [nameRef()], BOOL),
594
+ then: concatAll([strLit(`[${display}`, loc), rest()], loc),
595
+ else_: concatAll([strLit(`[${display} [`, loc), nameRef(), strLit("]", loc), rest()], loc),
596
+ type: STRING,
597
+ loc,
598
+ };
599
+ return {
600
+ kind: "seqExpr",
601
+ stmts: [
602
+ {
603
+ kind: "varDecl",
604
+ localId: "name.0",
605
+ init: {
606
+ kind: "fieldGet",
607
+ obj: lowerer.upcastTo(value, "%Error"),
608
+ className: "%Error",
609
+ field: "name",
610
+ type: STRING,
611
+ loc,
612
+ },
613
+ loc,
614
+ },
615
+ { kind: "varDecl", localId: "raw.0", init: base, loc },
616
+ ],
617
+ result: { kind: "ternary", cond, then: improved, else_: baseRef(), type: STRING, loc },
618
+ type: STRING,
619
+ loc,
620
+ };
621
+ }
95
622
  function isErrorClass(lowerer, className) {
96
623
  if (RUNTIME_ERROR_CLASSES.has(className))
97
624
  return true;
@@ -200,9 +727,19 @@ function inspectSupport(lowerer, t, visiting, out) {
200
727
  if (eventTargetRootOf(info) !== null)
201
728
  return null;
202
729
  if (isErrorClass(lowerer, t.className)) {
203
- return errorRenderable(info)
204
- ? null
205
- : "error subclasses with declared fields have no inspect lowering yet (the extra own properties are runtime-dynamic)";
730
+ if (userErrorClasses(info).length > 0 && errorHeaderOverridden(lowerer, info))
731
+ return "error subclasses whose name, message or stack is an accessor or a prototype property have no inspect lowering yet";
732
+ if (errorRenderable(info))
733
+ return null;
734
+ // Subclasses with declared fields render the error base followed
735
+ // by their own properties. The static class's own fields must
736
+ // render; a subclass whose fields cannot is a runtime refusal on
737
+ // its own instances only (see errorInspectHelper).
738
+ const own = fieldedErrorClasses(info).find((c) => c === info);
739
+ const ownWhy = own ? fieldedErrorReason(lowerer, own, visiting, out) : null;
740
+ if (ownWhy !== null)
741
+ return `'${t.className.replace(/^%(m\d+\.)?/, "")}' error values (${ownWhy})`;
742
+ return null;
206
743
  }
207
744
  // A class with subclasses, or a JavaScript class, renders through its
208
745
  // checked-dynamic view, which names the instance's own class and holds
@@ -347,6 +884,16 @@ export function inspectExpr(lowerer, t, value, recurse, depth, loc) {
347
884
  };
348
885
  }
349
886
  if (isErrorClass(lowerer, t.className)) {
887
+ const info = lowerer.classes.get(t.className);
888
+ if (info && userErrorClasses(info).length > 0) {
889
+ return {
890
+ kind: "call",
891
+ callee: errorInspectHelper(lowerer, t, info, loc),
892
+ args: [value, recurse, depth],
893
+ type: STRING,
894
+ loc,
895
+ };
896
+ }
350
897
  return {
351
898
  kind: "libCall",
352
899
  fn: "insp.error",
@@ -452,8 +999,19 @@ function typeConstituents(lowerer, u) {
452
999
  return [u.key, u.value];
453
1000
  case "union":
454
1001
  return lowerer.unions.get(u.unionId)?.arms.slice() ?? [];
455
- case "object":
456
- return lowerer.classes.get(u.className)?.def.fields.map((f) => f.type) ?? [];
1002
+ case "object": {
1003
+ const info = lowerer.classes.get(u.className);
1004
+ if (!info)
1005
+ return [];
1006
+ const types = info.def.fields.map((f) => f.type);
1007
+ // An error value can be an instance of a program-declared subclass,
1008
+ // whose own fields its inspection renders (errorInspectHelper).
1009
+ if (isErrorClass(lowerer, u.className))
1010
+ for (const c of userErrorClasses(info))
1011
+ for (const f of ownErrorFields(c))
1012
+ types.push(f.type);
1013
+ return types;
1014
+ }
457
1015
  default:
458
1016
  return [];
459
1017
  }