@scriptc/compiler 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. package/ambient/node-fallback/events.d.ts +6 -1
  2. package/ambient/node-fallback/fs-promises.d.ts +1 -1
  3. package/ambient/node-fallback/fs.d.ts +54 -10
  4. package/ambient/node-fallback/http.d.ts +3 -1
  5. package/ambient/node-fallback/net.d.ts +19 -0
  6. package/ambient/node-fallback/querystring.d.ts +3 -3
  7. package/ambient/scriptc-node-fallback.d.ts +58 -13
  8. package/dist/backend/executable-features.js +13 -0
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +12 -1
  11. package/dist/backend/immutability.js +50 -4
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/immutability.test.js +95 -1
  14. package/dist/backend/immutability.test.js.map +1 -1
  15. package/dist/backend/library-pack.js +2 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/linker.d.ts +11 -0
  18. package/dist/backend/linker.js +31 -3
  19. package/dist/backend/linker.js.map +1 -1
  20. package/dist/backend/lld.d.ts +7 -2
  21. package/dist/backend/lld.js +5 -3
  22. package/dist/backend/lld.js.map +1 -1
  23. package/dist/backend/lld.test.js +10 -4
  24. package/dist/backend/lld.test.js.map +1 -1
  25. package/dist/backend/llvm/constant-callbacks.test.js +50 -1
  26. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  27. package/dist/backend/llvm/cpu-dispatch.js +6 -5
  28. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  29. package/dist/backend/llvm/dyn.d.ts +53 -1
  30. package/dist/backend/llvm/dyn.js +221 -9
  31. package/dist/backend/llvm/dyn.js.map +1 -1
  32. package/dist/backend/llvm/emit-function.js +1 -1
  33. package/dist/backend/llvm/emit-function.js.map +1 -1
  34. package/dist/backend/llvm/emit-module.js +148 -50
  35. package/dist/backend/llvm/emit-module.js.map +1 -1
  36. package/dist/backend/llvm/emit-statements.js +39 -19
  37. package/dist/backend/llvm/emit-statements.js.map +1 -1
  38. package/dist/backend/llvm/emitter.d.ts +29 -2
  39. package/dist/backend/llvm/emitter.js +86 -7
  40. package/dist/backend/llvm/emitter.js.map +1 -1
  41. package/dist/backend/llvm/expr-calls.d.ts +4 -1
  42. package/dist/backend/llvm/expr-calls.js +20 -4
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-dynamic.js +209 -16
  45. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  46. package/dist/backend/llvm/expr-primitives.js +94 -11
  47. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  48. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  49. package/dist/backend/llvm/expr-stream-bridges.js +42 -2
  50. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  51. package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
  52. package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
  53. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/integer-values.d.ts +2 -0
  55. package/dist/backend/llvm/integer-values.js +6 -0
  56. package/dist/backend/llvm/integer-values.js.map +1 -1
  57. package/dist/backend/llvm/js-ic.d.ts +38 -0
  58. package/dist/backend/llvm/js-ic.js +295 -1
  59. package/dist/backend/llvm/js-ic.js.map +1 -1
  60. package/dist/backend/llvm/lib-dispatch.js +20 -0
  61. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  62. package/dist/backend/llvm/lib-filesystem.js +116 -11
  63. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  64. package/dist/backend/llvm/lib-process.js +136 -24
  65. package/dist/backend/llvm/lib-process.js.map +1 -1
  66. package/dist/backend/llvm/lib-shared.js +70 -0
  67. package/dist/backend/llvm/lib-shared.js.map +1 -1
  68. package/dist/backend/llvm/lib-stream.js +67 -0
  69. package/dist/backend/llvm/lib-stream.js.map +1 -1
  70. package/dist/backend/llvm/loop-entry-versions.d.ts +2 -2
  71. package/dist/backend/llvm/loop-entry-versions.js +43 -21
  72. package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
  73. package/dist/backend/llvm/loop-state.d.ts +7 -1
  74. package/dist/backend/llvm/loop-state.js +20 -2
  75. package/dist/backend/llvm/loop-state.js.map +1 -1
  76. package/dist/backend/llvm/map-number-lookup.d.ts +3 -1
  77. package/dist/backend/llvm/map-number-lookup.js +7 -3
  78. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  79. package/dist/backend/llvm/map-number-lookup.test.js +52 -11
  80. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  81. package/dist/backend/llvm/receiver-brackets.test.d.ts +1 -0
  82. package/dist/backend/llvm/receiver-brackets.test.js +68 -0
  83. package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
  84. package/dist/backend/llvm/record-views.d.ts +22 -2
  85. package/dist/backend/llvm/record-views.js +139 -10
  86. package/dist/backend/llvm/record-views.js.map +1 -1
  87. package/dist/backend/llvm/record-views.test.js +76 -0
  88. package/dist/backend/llvm/record-views.test.js.map +1 -1
  89. package/dist/backend/llvm/reference-writes.js +1 -0
  90. package/dist/backend/llvm/reference-writes.js.map +1 -1
  91. package/dist/backend/llvm/shapes.d.ts +3 -0
  92. package/dist/backend/llvm/shapes.js +18 -3
  93. package/dist/backend/llvm/shapes.js.map +1 -1
  94. package/dist/backend/llvm/shapes.test.js +4 -0
  95. package/dist/backend/llvm/shapes.test.js.map +1 -1
  96. package/dist/backend/llvm/speculative-integers.d.ts +10 -1
  97. package/dist/backend/llvm/speculative-integers.js +59 -8
  98. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  99. package/dist/backend/llvm/unwind-abi.d.ts +3 -3
  100. package/dist/backend/llvm/unwind-abi.js +8 -3
  101. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  102. package/dist/backend/llvm/walkers.js +1 -1
  103. package/dist/backend/llvm/walkers.js.map +1 -1
  104. package/dist/backend/native/contracts.d.ts +54 -0
  105. package/dist/backend/native/executable.js +87 -5
  106. package/dist/backend/native/executable.js.map +1 -1
  107. package/dist/backend/native/library.js +1 -1
  108. package/dist/backend/native/library.js.map +1 -1
  109. package/dist/backend/native/runtime-inputs.js +5 -1
  110. package/dist/backend/native/runtime-inputs.js.map +1 -1
  111. package/dist/backend/native/vendor.d.ts +1 -1
  112. package/dist/backend/native/vendor.js +1 -1
  113. package/dist/backend/native/vendor.js.map +1 -1
  114. package/dist/backend/native-codegen.js +3 -0
  115. package/dist/backend/native-codegen.js.map +1 -1
  116. package/dist/backend/native-link-info-core.d.ts +43 -0
  117. package/dist/backend/native-link-info-core.js.map +1 -1
  118. package/dist/backend/native-link-info.js +1 -0
  119. package/dist/backend/native-link-info.js.map +1 -1
  120. package/dist/backend/native-profile.d.ts +4 -1
  121. package/dist/backend/native-profile.js +12 -1
  122. package/dist/backend/native-profile.js.map +1 -1
  123. package/dist/backend/native-profile.test.js +10 -0
  124. package/dist/backend/native-profile.test.js.map +1 -1
  125. package/dist/backend/publication.d.ts +4 -1
  126. package/dist/backend/publication.js +4 -2
  127. package/dist/backend/publication.js.map +1 -1
  128. package/dist/backend/runtime-abi.d.ts +2 -2
  129. package/dist/backend/runtime-abi.js +2 -2
  130. package/dist/backend/runtime-pack-core.d.ts +31 -7
  131. package/dist/backend/runtime-pack-core.js +21 -1
  132. package/dist/backend/runtime-pack-core.js.map +1 -1
  133. package/dist/backend/runtime-pack-native.d.ts +18 -1
  134. package/dist/backend/runtime-pack-native.js +138 -29
  135. package/dist/backend/runtime-pack-native.js.map +1 -1
  136. package/dist/backend/runtime-pack-native.test.js +166 -4
  137. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  138. package/dist/backend/runtime-pack-targets.test.js +3 -1
  139. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  140. package/dist/backend/runtime-pack.d.ts +7 -0
  141. package/dist/backend/runtime-pack.js +25 -3
  142. package/dist/backend/runtime-pack.js.map +1 -1
  143. package/dist/backend/runtime-pack.test.js +3 -11
  144. package/dist/backend/runtime-pack.test.js.map +1 -1
  145. package/dist/backend/vendor-archives.d.ts +4 -1
  146. package/dist/backend/vendor-archives.js +264 -3
  147. package/dist/backend/vendor-archives.js.map +1 -1
  148. package/dist/backend/vendor-inputs.d.ts +36 -0
  149. package/dist/backend/vendor-inputs.js +42 -0
  150. package/dist/backend/vendor-inputs.js.map +1 -1
  151. package/dist/backend/vendor-inputs.test.js +28 -1
  152. package/dist/backend/vendor-inputs.test.js.map +1 -1
  153. package/dist/backend/warm-cache.js +2 -0
  154. package/dist/backend/warm-cache.js.map +1 -1
  155. package/dist/compat/fetch-profile.d.ts +7 -1
  156. package/dist/compat/fetch-profile.js +23 -10
  157. package/dist/compat/fetch-profile.js.map +1 -1
  158. package/dist/compile-types.d.ts +7 -0
  159. package/dist/contracts/check.d.ts +3 -0
  160. package/dist/contracts/check.js +18 -5
  161. package/dist/contracts/check.js.map +1 -1
  162. package/dist/coverage/surface-manifest.js +1 -1
  163. package/dist/coverage/surface-manifest.js.map +1 -1
  164. package/dist/diagnostics/codes.d.ts +6 -0
  165. package/dist/diagnostics/codes.js +6 -0
  166. package/dist/diagnostics/codes.js.map +1 -1
  167. package/dist/diagnostics/diagnostic.d.ts +50 -0
  168. package/dist/diagnostics/diagnostic.js +142 -3
  169. package/dist/diagnostics/diagnostic.js.map +1 -1
  170. package/dist/diagnostics/dynamic-tier.js +3 -1
  171. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  172. package/dist/executable/executable-cache.d.ts +29 -0
  173. package/dist/executable/executable-cache.js +18 -0
  174. package/dist/executable/executable-cache.js.map +1 -1
  175. package/dist/executable/executable-cache.test.js +5 -1
  176. package/dist/executable/executable-cache.test.js.map +1 -1
  177. package/dist/executable/prepare.d.ts +13 -3
  178. package/dist/executable/prepare.js +271 -18
  179. package/dist/executable/prepare.js.map +1 -1
  180. package/dist/frontend/early-errors.d.ts +14 -0
  181. package/dist/frontend/early-errors.js +305 -0
  182. package/dist/frontend/early-errors.js.map +1 -0
  183. package/dist/frontend/early-errors.test.d.ts +1 -0
  184. package/dist/frontend/early-errors.test.js +42 -0
  185. package/dist/frontend/early-errors.test.js.map +1 -0
  186. package/dist/frontend/inferred-js-diagnostics.test.js +23 -0
  187. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  188. package/dist/frontend/input-tracker.d.ts +47 -0
  189. package/dist/frontend/input-tracker.js +173 -36
  190. package/dist/frontend/input-tracker.js.map +1 -1
  191. package/dist/frontend/input-tracker.test.js +86 -2
  192. package/dist/frontend/input-tracker.test.js.map +1 -1
  193. package/dist/frontend/js-inference.d.ts +2 -0
  194. package/dist/frontend/js-inference.js +18 -0
  195. package/dist/frontend/js-inference.js.map +1 -0
  196. package/dist/frontend/lowering/binding-analysis.d.ts +2 -1
  197. package/dist/frontend/lowering/binding-analysis.js +65 -1
  198. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  199. package/dist/frontend/lowering/builtin-calls.js +9 -0
  200. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  201. package/dist/frontend/lowering/builtin-namespaces.d.ts +1 -1
  202. package/dist/frontend/lowering/builtin-namespaces.js +19 -2
  203. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +7 -0
  205. package/dist/frontend/lowering/builtins/child-process-methods.js +50 -10
  206. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/child-process.js +5 -1
  208. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/dates.d.ts +1 -1
  210. package/dist/frontend/lowering/builtins/dates.js +23 -1
  211. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
  213. package/dist/frontend/lowering/builtins/environment.js +213 -2
  214. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  215. package/dist/frontend/lowering/builtins/filesystem-calls.js +47 -16
  216. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
  218. package/dist/frontend/lowering/builtins/filesystem.js +185 -16
  219. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-calls.js +39 -2
  221. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  222. package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
  223. package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
  224. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/operating-system.d.ts +3 -2
  226. package/dist/frontend/lowering/builtins/operating-system.js +5 -4
  227. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/process.d.ts +17 -1
  229. package/dist/frontend/lowering/builtins/process.js +285 -19
  230. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/querystring.d.ts +8 -0
  232. package/dist/frontend/lowering/builtins/querystring.js +202 -18
  233. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/readline.js +21 -3
  235. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  236. package/dist/frontend/lowering/builtins/reflection.js +60 -1
  237. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  238. package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
  239. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  240. package/dist/frontend/lowering/builtins/url.js +20 -1
  241. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
  243. package/dist/frontend/lowering/builtins/v8.js +7 -5
  244. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
  246. package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
  247. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -1
  248. package/dist/frontend/lowering/call-signatures.js +77 -0
  249. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  250. package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
  251. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  252. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  253. package/dist/frontend/lowering/cjs-inline-require.js +5 -0
  254. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  255. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +5 -0
  256. package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
  257. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  258. package/dist/frontend/lowering/class-protocols.js +59 -10
  259. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  260. package/dist/frontend/lowering/class-runtime-statics.js +15 -0
  261. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  262. package/dist/frontend/lowering/class-views.d.ts +13 -0
  263. package/dist/frontend/lowering/class-views.js +51 -0
  264. package/dist/frontend/lowering/class-views.js.map +1 -0
  265. package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
  266. package/dist/frontend/lowering/coercions/function-adapters.js +54 -10
  267. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  268. package/dist/frontend/lowering/coercions/state.d.ts +7 -0
  269. package/dist/frontend/lowering/coercions/state.js +7 -0
  270. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  271. package/dist/frontend/lowering/coercions/structural-plans.js +60 -3
  272. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  273. package/dist/frontend/lowering/coercions/structural.js +29 -1
  274. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  275. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
  276. package/dist/frontend/lowering/containers/array-callbacks.js +132 -28
  277. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  278. package/dist/frontend/lowering/containers/array-construction.js +16 -5
  279. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  280. package/dist/frontend/lowering/containers/array-methods.js +16 -0
  281. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  282. package/dist/frontend/lowering/containers/bytes.js +4 -0
  283. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  284. package/dist/frontend/lowering/containers/callback-arguments.d.ts +11 -0
  285. package/dist/frontend/lowering/containers/callback-arguments.js +53 -0
  286. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  287. package/dist/frontend/lowering/containers/filter-predicates.d.ts +10 -0
  288. package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
  289. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  290. package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
  291. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -0
  293. package/dist/frontend/lowering/expressions/array-literals.js +26 -10
  294. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/binary.js +104 -12
  296. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/element-access.js +121 -4
  298. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/identifiers.js +143 -3
  300. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  301. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
  302. package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
  303. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  304. package/dist/frontend/lowering/expressions/narrowing.js +25 -1
  305. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  306. package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
  307. package/dist/frontend/lowering/expressions/object-literals.js +778 -229
  308. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  309. package/dist/frontend/lowering/expressions/optional-chains.js +66 -20
  310. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  311. package/dist/frontend/lowering/expressions/property-access.d.ts +31 -0
  312. package/dist/frontend/lowering/expressions/property-access.js +796 -12
  313. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  314. package/dist/frontend/lowering/expressions/relational.js +29 -1
  315. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  316. package/dist/frontend/lowering/expressions/typeof.js +17 -0
  317. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  318. package/dist/frontend/lowering/expressions/updates.js +132 -17
  319. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  320. package/dist/frontend/lowering/frozen-records.d.ts +6 -0
  321. package/dist/frontend/lowering/frozen-records.js +10 -4
  322. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  323. package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
  324. package/dist/frontend/lowering/frozen-records.test.js +44 -0
  325. package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
  326. package/dist/frontend/lowering/function-names.d.ts +9 -0
  327. package/dist/frontend/lowering/function-names.js +95 -0
  328. package/dist/frontend/lowering/function-names.js.map +1 -0
  329. package/dist/frontend/lowering/function-returns.js +5 -3
  330. package/dist/frontend/lowering/function-returns.js.map +1 -1
  331. package/dist/frontend/lowering/generic-functions.d.ts +49 -0
  332. package/dist/frontend/lowering/generic-functions.js +365 -7
  333. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  334. package/dist/frontend/lowering/global-values.d.ts +9 -0
  335. package/dist/frontend/lowering/global-values.js +44 -0
  336. package/dist/frontend/lowering/global-values.js.map +1 -1
  337. package/dist/frontend/lowering/handle-properties.js +34 -1
  338. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  339. package/dist/frontend/lowering/key-order-witness.d.ts +54 -0
  340. package/dist/frontend/lowering/key-order-witness.js +546 -5
  341. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  342. package/dist/frontend/lowering/lib-boundary.js +14 -0
  343. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  344. package/dist/frontend/lowering/lower-assert.js +110 -1
  345. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  346. package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
  347. package/dist/frontend/lowering/lower-builtin-values.js +332 -58
  348. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  349. package/dist/frontend/lowering/lower-calls.d.ts +22 -1
  350. package/dist/frontend/lowering/lower-calls.js +427 -48
  351. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  352. package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
  353. package/dist/frontend/lowering/lower-calls.test.js +78 -0
  354. package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
  355. package/dist/frontend/lowering/lower-classes.d.ts +16 -5
  356. package/dist/frontend/lowering/lower-classes.js +168 -51
  357. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  358. package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -0
  359. package/dist/frontend/lowering/lower-event-emitter.js +383 -41
  360. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  361. package/dist/frontend/lowering/lower-exprs.d.ts +14 -0
  362. package/dist/frontend/lowering/lower-exprs.js +25 -0
  363. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  364. package/dist/frontend/lowering/lower-functions.js +2 -0
  365. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  366. package/dist/frontend/lowering/lower-inspect.js +80 -33
  367. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  368. package/dist/frontend/lowering/lower-modules.js +87 -25
  369. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  370. package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
  371. package/dist/frontend/lowering/lower-node-island.js +456 -61
  372. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  373. package/dist/frontend/lowering/lower-server.js +160 -9
  374. package/dist/frontend/lowering/lower-server.js.map +1 -1
  375. package/dist/frontend/lowering/lower-shared-modules.js +13 -1
  376. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
  377. package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
  378. package/dist/frontend/lowering/lower-stdlib.js +32 -18
  379. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  380. package/dist/frontend/lowering/lower-stmts.d.ts +21 -4
  381. package/dist/frontend/lowering/lower-stmts.js +580 -103
  382. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  383. package/dist/frontend/lowering/lower-stream.js +126 -8
  384. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  385. package/dist/frontend/lowering/lower-timers.js +133 -21
  386. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  387. package/dist/frontend/lowering/lowerer.d.ts +139 -3
  388. package/dist/frontend/lowering/lowerer.js +579 -43
  389. package/dist/frontend/lowering/lowerer.js.map +1 -1
  390. package/dist/frontend/lowering/lowerer.test.js +1 -1
  391. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  392. package/dist/frontend/lowering/module-namespace-elements.js +15 -0
  393. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  394. package/dist/frontend/lowering/new-target.js +2 -2
  395. package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
  396. package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
  397. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
  398. package/dist/frontend/lowering/partial-assertions.d.ts +39 -0
  399. package/dist/frontend/lowering/partial-assertions.js +195 -0
  400. package/dist/frontend/lowering/partial-assertions.js.map +1 -0
  401. package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
  402. package/dist/frontend/lowering/primitive-wrappers.js +220 -0
  403. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
  404. package/dist/frontend/lowering/private-statics.d.ts +46 -0
  405. package/dist/frontend/lowering/private-statics.js +322 -0
  406. package/dist/frontend/lowering/private-statics.js.map +1 -0
  407. package/dist/frontend/lowering/record-sources.d.ts +12 -1
  408. package/dist/frontend/lowering/record-sources.js +60 -0
  409. package/dist/frontend/lowering/record-sources.js.map +1 -1
  410. package/dist/frontend/lowering/strict-equality.d.ts +4 -0
  411. package/dist/frontend/lowering/strict-equality.js +14 -0
  412. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  413. package/dist/frontend/lowering/surfaces.d.ts +27 -0
  414. package/dist/frontend/lowering/surfaces.js +135 -62
  415. package/dist/frontend/lowering/surfaces.js.map +1 -1
  416. package/dist/frontend/lowering/unit-journal.d.ts +128 -17
  417. package/dist/frontend/lowering/unit-journal.js +310 -53
  418. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  419. package/dist/frontend/lowering/unit-journal.test.js +91 -3
  420. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  421. package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
  422. package/dist/frontend/lowering/unit-reuse.js +1008 -0
  423. package/dist/frontend/lowering/unit-reuse.js.map +1 -0
  424. package/dist/frontend/lowering/width-lift.d.ts +12 -0
  425. package/dist/frontend/npm-file-import.test.d.ts +1 -0
  426. package/dist/frontend/npm-file-import.test.js +76 -0
  427. package/dist/frontend/npm-file-import.test.js.map +1 -0
  428. package/dist/frontend/npm-static.js +17 -2
  429. package/dist/frontend/npm-static.js.map +1 -1
  430. package/dist/frontend/npm.d.ts +9 -0
  431. package/dist/frontend/npm.js +82 -0
  432. package/dist/frontend/npm.js.map +1 -1
  433. package/dist/frontend/pipeline-native.js +2 -1
  434. package/dist/frontend/pipeline-native.js.map +1 -1
  435. package/dist/frontend/pipeline.d.ts +4 -0
  436. package/dist/frontend/pipeline.js +68 -7
  437. package/dist/frontend/pipeline.js.map +1 -1
  438. package/dist/frontend/program-node.d.ts +3 -0
  439. package/dist/frontend/program-node.js +13 -6
  440. package/dist/frontend/program-node.js.map +1 -1
  441. package/dist/frontend/program.d.ts +9 -0
  442. package/dist/frontend/program.js +159 -7
  443. package/dist/frontend/program.js.map +1 -1
  444. package/dist/frontend/provenance-core.js +4 -0
  445. package/dist/frontend/provenance-core.js.map +1 -1
  446. package/dist/frontend/services.d.ts +14 -0
  447. package/dist/frontend/services.js +52 -2
  448. package/dist/frontend/services.js.map +1 -1
  449. package/dist/frontend/services.test.js +61 -1
  450. package/dist/frontend/services.test.js.map +1 -1
  451. package/dist/frontend/shape-inference/analyze.d.ts +5 -0
  452. package/dist/frontend/shape-inference/analyze.js +104 -4
  453. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  454. package/dist/frontend/shape-inference/domain.js +0 -1
  455. package/dist/frontend/shape-inference/domain.js.map +1 -1
  456. package/dist/frontend/shape-inference/index.js +5 -1
  457. package/dist/frontend/shape-inference/index.js.map +1 -1
  458. package/dist/frontend/shape-inference/memo.d.ts +2 -1
  459. package/dist/frontend/shape-inference/memo.js +6 -2
  460. package/dist/frontend/shape-inference/memo.js.map +1 -1
  461. package/dist/frontend/shape-inference/overlay.d.ts +1 -1
  462. package/dist/frontend/shape-inference/overlay.js +116 -2
  463. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  464. package/dist/frontend/shape-inference/static-objects.js +11 -6
  465. package/dist/frontend/shape-inference/static-objects.js.map +1 -1
  466. package/dist/frontend/source-phase-imports.test.d.ts +1 -0
  467. package/dist/frontend/source-phase-imports.test.js +37 -0
  468. package/dist/frontend/source-phase-imports.test.js.map +1 -0
  469. package/dist/frontend/ts7/ast-node.d.ts +6 -1
  470. package/dist/frontend/ts7/ast-node.js +12 -0
  471. package/dist/frontend/ts7/ast-node.js.map +1 -1
  472. package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
  473. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
  474. package/dist/frontend/ts7/ast-wire.js +3 -5
  475. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  476. package/dist/frontend/ts7/checker-backend.d.ts +13 -0
  477. package/dist/frontend/ts7/checker-backend.js +84 -2
  478. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  479. package/dist/frontend/ts7/checker-backend.test.js +126 -2
  480. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  481. package/dist/frontend/ts7/program-host.d.ts +22 -1
  482. package/dist/frontend/ts7/program-host.js +49 -4
  483. package/dist/frontend/ts7/program-host.js.map +1 -1
  484. package/dist/frontend/ts7/program-host.test.js +83 -0
  485. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  486. package/dist/frontend/ts7/rpc-process.d.ts +16 -1
  487. package/dist/frontend/ts7/rpc-process.js +170 -92
  488. package/dist/frontend/ts7/rpc-process.js.map +1 -1
  489. package/dist/frontend/ts7/rpc-process.test.js +49 -21
  490. package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
  491. package/dist/frontend/tsc-codes.js +70 -0
  492. package/dist/frontend/tsc-codes.js.map +1 -1
  493. package/dist/frontend/type-mapper.d.ts +7 -2
  494. package/dist/frontend/type-mapper.js +148 -1
  495. package/dist/frontend/type-mapper.js.map +1 -1
  496. package/dist/index.d.ts +1 -1
  497. package/dist/index.js +152 -8
  498. package/dist/index.js.map +1 -1
  499. package/dist/ir/api.d.ts +1 -1
  500. package/dist/ir/api.js +1 -1
  501. package/dist/ir/api.js.map +1 -1
  502. package/dist/ir/build.d.ts +3 -2
  503. package/dist/ir/build.js +4 -2
  504. package/dist/ir/build.js.map +1 -1
  505. package/dist/ir/builtin-effects.js +53 -0
  506. package/dist/ir/builtin-effects.js.map +1 -1
  507. package/dist/ir/builtin-signatures.d.ts +1 -1
  508. package/dist/ir/builtin-signatures.js +211 -10
  509. package/dist/ir/builtin-signatures.js.map +1 -1
  510. package/dist/ir/codec.d.ts +82 -0
  511. package/dist/ir/codec.generated.d.ts +13 -0
  512. package/dist/ir/codec.generated.js +5274 -0
  513. package/dist/ir/codec.generated.js.map +1 -0
  514. package/dist/ir/codec.js +325 -0
  515. package/dist/ir/codec.js.map +1 -0
  516. package/dist/ir/codec.test.d.ts +1 -0
  517. package/dist/ir/codec.test.js +225 -0
  518. package/dist/ir/codec.test.js.map +1 -0
  519. package/dist/ir/fields.generated.d.ts +20 -10
  520. package/dist/ir/fields.generated.js +1031 -11
  521. package/dist/ir/fields.generated.js.map +1 -1
  522. package/dist/ir/fields.test.js +46 -2
  523. package/dist/ir/fields.test.js.map +1 -1
  524. package/dist/ir/function-references.d.ts +5 -4
  525. package/dist/ir/function-references.js +8 -4
  526. package/dist/ir/function-references.js.map +1 -1
  527. package/dist/ir/function-references.test.js +7 -0
  528. package/dist/ir/function-references.test.js.map +1 -1
  529. package/dist/ir/inline-array-sources.js +4 -1
  530. package/dist/ir/inline-array-sources.js.map +1 -1
  531. package/dist/ir/inline-array-views.d.ts +13 -0
  532. package/dist/ir/inline-array-views.js +944 -0
  533. package/dist/ir/inline-array-views.js.map +1 -0
  534. package/dist/ir/inline-arrays.d.ts +7 -0
  535. package/dist/ir/inline-arrays.js +190 -55
  536. package/dist/ir/inline-arrays.js.map +1 -1
  537. package/dist/ir/inline-arrays.test.js +140 -2
  538. package/dist/ir/inline-arrays.test.js.map +1 -1
  539. package/dist/ir/integer-ranges.js +16 -6
  540. package/dist/ir/integer-ranges.js.map +1 -1
  541. package/dist/ir/ir.d.ts +75 -44
  542. package/dist/ir/ir.js.map +1 -1
  543. package/dist/ir/js-ic.d.ts +10 -9
  544. package/dist/ir/js-ic.js +28 -20
  545. package/dist/ir/js-ic.js.map +1 -1
  546. package/dist/ir/js-ic.test.js +10 -2
  547. package/dist/ir/js-ic.test.js.map +1 -1
  548. package/dist/ir/jsval.js +374 -63
  549. package/dist/ir/jsval.js.map +1 -1
  550. package/dist/ir/jsval.test.js +96 -2
  551. package/dist/ir/jsval.test.js.map +1 -1
  552. package/dist/ir/loop-entry-ranges.js +112 -9
  553. package/dist/ir/loop-entry-ranges.js.map +1 -1
  554. package/dist/ir/loop-entry-ranges.test.js +40 -0
  555. package/dist/ir/loop-entry-ranges.test.js.map +1 -1
  556. package/dist/ir/parameter-versions.d.ts +2 -1
  557. package/dist/ir/parameter-versions.js +3 -1
  558. package/dist/ir/parameter-versions.js.map +1 -1
  559. package/dist/ir/receiver-readers.js +58 -2
  560. package/dist/ir/receiver-readers.js.map +1 -1
  561. package/dist/ir/runtime-features.d.ts +60 -1
  562. package/dist/ir/runtime-features.js +277 -2
  563. package/dist/ir/runtime-features.js.map +1 -1
  564. package/dist/ir/runtime-features.test.js +165 -1
  565. package/dist/ir/runtime-features.test.js.map +1 -1
  566. package/dist/ir/saturating-loop-jams.d.ts +8 -1
  567. package/dist/ir/saturating-loop-jams.js +46 -7
  568. package/dist/ir/saturating-loop-jams.js.map +1 -1
  569. package/dist/ir/saturating-loop-jams.test.js +39 -1
  570. package/dist/ir/saturating-loop-jams.test.js.map +1 -1
  571. package/dist/ir/self-captures.js +8 -1
  572. package/dist/ir/self-captures.js.map +1 -1
  573. package/dist/ir/self-captures.test.js +15 -0
  574. package/dist/ir/self-captures.test.js.map +1 -1
  575. package/dist/ir/serialize.d.ts +3 -2
  576. package/dist/ir/serialize.js +6 -2
  577. package/dist/ir/serialize.js.map +1 -1
  578. package/dist/ir/validate.js +82 -4
  579. package/dist/ir/validate.js.map +1 -1
  580. package/dist/ir/validate.test.js +46 -0
  581. package/dist/ir/validate.test.js.map +1 -1
  582. package/dist/library/ir-policy.js +3 -0
  583. package/dist/library/ir-policy.js.map +1 -1
  584. package/dist/native/cache.js +2 -0
  585. package/dist/native/cache.js.map +1 -1
  586. package/dist/native/cli.js +2 -0
  587. package/dist/native/cli.js.map +1 -1
  588. package/dist/native/compiler.js +8 -2
  589. package/dist/native/compiler.js.map +1 -1
  590. package/dist/native/prepare.js +32 -3
  591. package/dist/native/prepare.js.map +1 -1
  592. package/dist/native/sanitizer.js +53 -3
  593. package/dist/native/sanitizer.js.map +1 -1
  594. package/dist/native/sanitizer.test.js +88 -2
  595. package/dist/native/sanitizer.test.js.map +1 -1
  596. package/dist/native/toolchain.js +9 -2
  597. package/dist/native/toolchain.js.map +1 -1
  598. package/dist/node-islands/boundary.d.ts +25 -1
  599. package/dist/node-islands/boundary.js +28 -2
  600. package/dist/node-islands/boundary.js.map +1 -1
  601. package/dist/node-islands/detect.d.ts +18 -1
  602. package/dist/node-islands/detect.js +365 -40
  603. package/dist/node-islands/detect.js.map +1 -1
  604. package/dist/node-islands/detect.test.js +151 -4
  605. package/dist/node-islands/detect.test.js.map +1 -1
  606. package/dist/node-islands/effect-gate.js +30 -20
  607. package/dist/node-islands/effect-gate.js.map +1 -1
  608. package/dist/node-islands/effect-gate.test.js +4 -1
  609. package/dist/node-islands/effect-gate.test.js.map +1 -1
  610. package/dist/node-islands/libnode.d.ts +1 -1
  611. package/dist/node-islands/libnode.js +1 -1
  612. package/dist/node-islands/libnode.js.map +1 -1
  613. package/dist/node-islands/modules.d.ts +28 -0
  614. package/dist/node-islands/modules.js +156 -0
  615. package/dist/node-islands/modules.js.map +1 -1
  616. package/dist/node-islands/modules.test.js +105 -1
  617. package/dist/node-islands/modules.test.js.map +1 -1
  618. package/dist/node-islands/policy.js +2 -3
  619. package/dist/node-islands/policy.js.map +1 -1
  620. package/dist/node-islands/probe-recorder.d.ts +1 -0
  621. package/dist/node-islands/probe-recorder.js +596 -0
  622. package/dist/node-islands/probe-recorder.js.map +1 -0
  623. package/dist/node-islands/probe-recorder.test.d.ts +1 -0
  624. package/dist/node-islands/probe-recorder.test.js +80 -0
  625. package/dist/node-islands/probe-recorder.test.js.map +1 -0
  626. package/dist/node-islands/report.test.js +2 -0
  627. package/dist/node-islands/report.test.js.map +1 -1
  628. package/dist/node-islands/rules.js +4 -0
  629. package/dist/node-islands/rules.js.map +1 -1
  630. package/dist/node-islands/scan.d.ts +7 -1
  631. package/dist/node-islands/scan.js +51 -2
  632. package/dist/node-islands/scan.js.map +1 -1
  633. package/dist/node-islands/snapshot.d.ts +38 -1
  634. package/dist/node-islands/snapshot.js +165 -161
  635. package/dist/node-islands/snapshot.js.map +1 -1
  636. package/dist/node-islands/snapshot.test.js +63 -2
  637. package/dist/node-islands/snapshot.test.js.map +1 -1
  638. package/dist/node-islands/summary.js +8 -0
  639. package/dist/node-islands/summary.js.map +1 -1
  640. package/dist/node-islands/type-strip.d.ts +11 -0
  641. package/dist/node-islands/type-strip.js +157 -0
  642. package/dist/node-islands/type-strip.js.map +1 -0
  643. package/dist/node-islands/type-strip.test.d.ts +1 -0
  644. package/dist/node-islands/type-strip.test.js +31 -0
  645. package/dist/node-islands/type-strip.test.js.map +1 -0
  646. package/dist/project-config.d.ts +4 -0
  647. package/dist/project-config.js +19 -0
  648. package/dist/project-config.js.map +1 -1
  649. package/dist/project-config.test.js +10 -0
  650. package/dist/project-config.test.js.map +1 -1
  651. package/package.json +20 -20
  652. package/surface-manifest.json +43 -11
@@ -0,0 +1,220 @@
1
+ /* Primitive wrapper objects (`new String(s)`, `new Number(n)`, `new
2
+ * Boolean(b)`, `Object(primitive)`) in JavaScript sources. A wrapper is an
3
+ * ordinary dynamic object (scr_js_wrapper.c): its prototype is the
4
+ * wrapper unit's String/Number/Boolean prototype object, whose valueOf,
5
+ * toString and methods read the [[PrimitiveValue]] slot, and a String
6
+ * wrapper owns its index properties and `length`. Every generic dynamic
7
+ * operation (ToPrimitive, property reads, method calls, key listing,
8
+ * identity, typeof) already handles that shape; this module builds the
9
+ * values and routes the few consumers that must see the slot itself. */
10
+ import * as ts from "../ts7/adapter.js";
11
+ import { BOOL, DYN, F64, STRING, } from "../../ir/ir.js";
12
+ import { transformStmtList } from "../../ir/traverse.js";
13
+ import { isJsSourceFile, locOf } from "../program.js";
14
+ import { primitiveCtorClosure } from "./lower-exprs.js";
15
+ /** The runtime's kind numbers (scr_js_wrapper.c SCR_JS_WRAPPER_*). */
16
+ export const WRAPPER_KIND_NUMBER = {
17
+ String: 0,
18
+ Number: 1,
19
+ Boolean: 2,
20
+ };
21
+ /** Whether any compiled source creates a primitive wrapper: a `new` of the
22
+ * stdlib String, Number or Boolean constructor (with or without an
23
+ * argument: `new String()` is a wrapper over "", `new Number()` over 0 and
24
+ * `new Boolean()` over false), or a call of the stdlib Object with an
25
+ * argument. `new Object()` without one is a fresh plain object, so it is
26
+ * not a wrapper. Until a program has one, no value is a wrapper, so the
27
+ * boxed interface types keep their primitive mapping and every fold that
28
+ * relies on it stays. */
29
+ export function programCreatesWrappers(lowerer) {
30
+ for (const sf of lowerer.program.getSourceFiles()) {
31
+ if (sf.isDeclarationFile || !isJsSourceFile(sf))
32
+ continue;
33
+ const text = sf.text;
34
+ if (!text.includes("String") &&
35
+ !text.includes("Number") &&
36
+ !text.includes("Boolean") &&
37
+ !text.includes("Object"))
38
+ continue;
39
+ let found = false;
40
+ const visit = (node) => {
41
+ if (found)
42
+ return;
43
+ if ((ts.isNewExpression(node) || ts.isCallExpression(node)) &&
44
+ ts.isIdentifier(node.expression)) {
45
+ const name = node.expression.text;
46
+ // A `new` of a boxed constructor is a wrapper even without an
47
+ // argument; Object is a wrapper site only when it converts a value.
48
+ const wrapperNew = ts.isNewExpression(node) &&
49
+ (name === "String" || name === "Number" || name === "Boolean");
50
+ const toObject = name === "Object" && (node.arguments?.nodes.length ?? 0) > 0;
51
+ if ((wrapperNew || toObject) && lowerer.isStdlibGlobal(node.expression, name)) {
52
+ found = true;
53
+ return;
54
+ }
55
+ }
56
+ ts.forEachChild(node, visit);
57
+ };
58
+ visit(sf);
59
+ if (found)
60
+ return true;
61
+ }
62
+ return false;
63
+ }
64
+ /** `new String(x)` / `new Number(x)` / `new Boolean(x)` in a JavaScript
65
+ * source: the wrapper over ToString/ToNumber/ToBoolean of the argument
66
+ * (the runtime converts, with the object hooks), or over "", 0, false
67
+ * without one. Null outside JavaScript sources and for other callees. */
68
+ export function lowerWrapperNew(lowerer, expr) {
69
+ if (!isJsSourceFile(ts.getSourceFileOfNode(expr)))
70
+ return null;
71
+ if (!ts.isIdentifier(expr.expression))
72
+ return null;
73
+ const kind = expr.expression.text;
74
+ if (kind !== "String" && kind !== "Number" && kind !== "Boolean")
75
+ return null;
76
+ if (!lowerer.isStdlibGlobal(expr.expression, kind))
77
+ return null;
78
+ const args = expr.arguments?.nodes ?? [];
79
+ if (args.some(ts.isSpreadElement))
80
+ return null;
81
+ const loc = locOf(expr);
82
+ // Arguments past the first are evaluated and ignored.
83
+ const value = args.length > 0
84
+ ? lowerer.lowerExprExpecting(args[0], DYN)
85
+ : lowerer.coerceToExpected(kind === "String"
86
+ ? { kind: "strLit", value: "", type: STRING, loc }
87
+ : kind === "Number"
88
+ ? { kind: "numLit", value: 0, type: F64, loc }
89
+ : { kind: "boolLit", value: false, type: BOOL, loc }, DYN);
90
+ const rest = args.slice(1).map((arg) => ({
91
+ kind: "exprStmt",
92
+ expr: lowerer.lowerExpr(arg),
93
+ loc: locOf(arg),
94
+ }));
95
+ const created = {
96
+ kind: "libCall",
97
+ fn: "wrapper.new",
98
+ args: [
99
+ { kind: "numLit", value: WRAPPER_KIND_NUMBER[kind], type: F64, loc },
100
+ value,
101
+ ...wrapperConstructors(lowerer, loc),
102
+ ],
103
+ type: DYN,
104
+ loc,
105
+ };
106
+ if (rest.length === 0)
107
+ return created;
108
+ const local = lowerer.declareHiddenLocal("%wrapperArg", DYN);
109
+ return {
110
+ kind: "seqExpr",
111
+ stmts: [{ kind: "varDecl", localId: local.id, init: value, loc }, ...rest],
112
+ result: {
113
+ ...created,
114
+ args: [
115
+ created.args[0],
116
+ { kind: "varRef", localId: local.id, type: DYN, loc },
117
+ ...created.args.slice(2),
118
+ ],
119
+ },
120
+ type: DYN,
121
+ loc,
122
+ };
123
+ }
124
+ /** The String, Number and Boolean constructor values, for the prototypes'
125
+ * `constructor` property (the interned closures `x === String` compares). */
126
+ export function wrapperConstructors(lowerer, loc) {
127
+ return ["String", "Number", "Boolean"].map((name) => lowerer.coerceToExpected(primitiveCtorClosure(lowerer, name, loc, true), DYN));
128
+ }
129
+ /** Consumers that walk a dynamic value's whole graph and must see the
130
+ * [[PrimitiveValue]] slot (JSON's unwrapping, util.inspect's `[String:
131
+ * 'x']`, structuredClone's wrapper clone, deep equality's primitive
132
+ * compare). Until they know the slot, a wrapper reaching one refuses: each
133
+ * dynamic argument passes through wrapper.guard, which throws the
134
+ * not-supported Error when the value's own data graph holds a wrapper. */
135
+ const GUARDED_CONSUMERS = new Set([
136
+ "json.stringifyValue",
137
+ "json.stringifyReplacer",
138
+ "util.isDeepStrictEqual",
139
+ "dyn.structuredClone",
140
+ "assert.looseDeepDyn",
141
+ "assert.partialDeepDyn",
142
+ "console.dirDyn",
143
+ "insp.format",
144
+ "insp.formatPrimitives",
145
+ "insp.formatList",
146
+ "insp.formatWithOptions",
147
+ "insp.inspect",
148
+ "insp.dynS",
149
+ "insp.dynFormatS",
150
+ ]);
151
+ /** util.types brands that read the [[PrimitiveValue]] slot. */
152
+ const WRAPPER_TYPE_PROBES = new Set([
153
+ "isStringObject",
154
+ "isNumberObject",
155
+ "isBooleanObject",
156
+ "isBoxedPrimitive",
157
+ ]);
158
+ /** The consumer as the refusal names it. */
159
+ function consumerName(fn) {
160
+ if (fn.startsWith("json."))
161
+ return "JSON.stringify";
162
+ if (fn === "dyn.structuredClone")
163
+ return "structuredClone";
164
+ if (fn === "util.isDeepStrictEqual")
165
+ return "util.isDeepStrictEqual";
166
+ if (fn.startsWith("assert."))
167
+ return "assert's deep equality";
168
+ return "console.log/util.inspect";
169
+ }
170
+ function guarded(arg, fn) {
171
+ const consumer = consumerName(fn);
172
+ if (arg.type.kind !== "dyn" && !(arg.type.kind === "array" && arg.type.elem.kind === "dyn"))
173
+ return arg;
174
+ return {
175
+ kind: "libCall",
176
+ fn: arg.type.kind === "dyn" ? "wrapper.guard" : "wrapper.guardList",
177
+ args: [arg, { kind: "strLit", value: consumer, type: STRING, loc: arg.loc }],
178
+ type: arg.type,
179
+ loc: arg.loc,
180
+ };
181
+ }
182
+ /** In a program that creates wrappers, route the consumers that read
183
+ * internal slots: Object.prototype.toString's tag and the util.types
184
+ * brands answer from the slot (wrapper.objectTag, wrapper.typeIs), and the
185
+ * graph-walking consumers above guard their dynamic arguments. Programs
186
+ * without a wrapper site keep every node unchanged. */
187
+ export function routeWrapperConsumers(lowerer, functions) {
188
+ if (!(lowerer.createsWrappers ??= programCreatesWrappers(lowerer)))
189
+ return;
190
+ const transform = {
191
+ expr: (expr) => {
192
+ if (expr.kind === "libCall") {
193
+ if (expr.fn === "dyn.objectTag")
194
+ return { ...expr, fn: "wrapper.objectTag" };
195
+ if (expr.fn === "util.typeIs" &&
196
+ expr.args[1]?.kind === "strLit" &&
197
+ WRAPPER_TYPE_PROBES.has(expr.args[1].value))
198
+ return { ...expr, fn: "wrapper.typeIs" };
199
+ if (GUARDED_CONSUMERS.has(expr.fn))
200
+ return { ...expr, args: expr.args.map((arg) => guarded(arg, expr.fn)) };
201
+ }
202
+ if (expr.kind === "intrinsic" &&
203
+ (expr.name === "console.log" || expr.name === "console.error"))
204
+ return { ...expr, args: expr.args.map((arg) => guarded(arg, expr.name)) };
205
+ return expr;
206
+ },
207
+ stmt: (stmt) => stmt,
208
+ };
209
+ for (const fn of functions)
210
+ fn.body = transformStmtList(fn.body, transform);
211
+ }
212
+ /** `Object(x)` / `new Object(x)` over a checked-dynamic `x` in a program
213
+ * that creates wrappers: ToObject (wrapper.toObject), a wrapper for a
214
+ * primitive, the value itself for an object, a fresh object for null and
215
+ * undefined. */
216
+ export function lowerWrapperToObject(lowerer, value, loc) {
217
+ const ctors = wrapperConstructors(lowerer, loc);
218
+ return { kind: "libCall", fn: "wrapper.toObject", args: [value, ...ctors], type: DYN, loc };
219
+ }
220
+ //# sourceMappingURL=primitive-wrappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitive-wrappers.js","sourceRoot":"","sources":["../../../src/frontend/lowering/primitive-wrappers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import * as ts from "../ts7/adapter.js";
2
+ import { type IrExpr, type IrStmt, type IrType, type SrcLoc } from "../../ir/ir.js";
3
+ import type { Lowerer } from "./lowerer.js";
4
+ import { type ClassInfo } from "./lower-classes.js";
5
+ /** How a static private name is used: a field read or write, or a method
6
+ * (or accessor) read or call. V8 words each failure differently. */
7
+ export type StaticPrivateUse = "read" | "write" | "method";
8
+ /** The declaration-level class whose body declares `priv` as a STATIC
9
+ * member (the nearest enclosing class declaring the name, as JavaScript
10
+ * scoping resolves it). Null for an instance private, a function-local or
11
+ * generic class, or a class that was not collected. */
12
+ export declare function staticPrivateOwner(lowerer: Lowerer, priv: ts.PrivateIdentifier): ClassInfo | null;
13
+ /** The brand check of a static private: JavaScript installs static private
14
+ * elements on the declaring class object alone, so the receiver must BE
15
+ * that object (a subclass, an object inheriting from it, or a primitive
16
+ * throws). An expression statement calling the lifted helper
17
+ * `%private.static.<use>:<class>:<#name>(value: dyn): void`, which throws
18
+ * V8's TypeError; `value` is the checked-dynamic receiver. */
19
+ export declare function staticPrivateBrandCheck(lowerer: Lowerer, info: ClassInfo, use: StaticPrivateUse, name: string, value: IrExpr, loc: SrcLoc): IrStmt;
20
+ /** `R.#x` / `R.#m` read, where `#x` is a static private of a
21
+ * declaration-level class and `R` is a checked-dynamic value (`this` in a
22
+ * static accessor or method that the constructor object carries): the
23
+ * brand check, then the member's native storage. Null for other reads,
24
+ * which keep their paths (the class's own name reads storage directly). */
25
+ export declare function lowerStaticPrivateRead(lowerer: Lowerer, expr: ts.PropertyAccessExpression, loc: SrcLoc): IrExpr | null;
26
+ /** `R.#m(args)` for a static private method on a checked-dynamic receiver:
27
+ * the brand check, then the call with `this` known to be the declaring
28
+ * class. A receiver other than `this` reaches only methods that do not
29
+ * read `this`; the others keep a loud refusal. */
30
+ export declare function lowerStaticPrivateCall(lowerer: Lowerer, call: ts.CallExpression, access: ts.PropertyAccessExpression): IrExpr | null;
31
+ /** `R.#x = v` for a static private field on a checked-dynamic receiver:
32
+ * the receiver, then the value, then the brand check (PrivateSet checks
33
+ * after the right side runs), then the native global. */
34
+ export declare function lowerStaticPrivateAssignment(lowerer: Lowerer, expr: ts.BinaryExpression): IrExpr | null;
35
+ /** The update target of `R.#x++`, `--R.#x` or `R.#x op= v` for a static
36
+ * private field on a checked-dynamic receiver: the brand check, which runs
37
+ * where PrivateGet reads the old value (before the right side), and the
38
+ * field's native global. The write after it needs no second check: the
39
+ * receiver already passed. Null for other targets. */
40
+ export declare function staticPrivateUpdateTarget(lowerer: Lowerer, access: ts.PropertyAccessExpression): {
41
+ brand: IrStmt;
42
+ target: {
43
+ id: string;
44
+ type: IrType;
45
+ };
46
+ } | null;
@@ -0,0 +1,322 @@
1
+ import * as ts from "../ts7/adapter.js";
2
+ import { BOOL, DYN, VOID, } from "../../ir/ir.js";
3
+ import { helperLoc, strLit, varRef } from "../../ir/build.js";
4
+ import { locOf } from "../program.js";
5
+ import { hasStaticThis } from "./static-this.js";
6
+ import { lowerClassStaticRead, lowerStaticMethodCall } from "./lower-classes.js";
7
+ import { tryLowerExpression } from "./expressions/try-lower-expression.js";
8
+ import { lowerCallThroughValue } from "./lower-calls.js";
9
+ /** The declaration-level class whose body declares `priv` as a STATIC
10
+ * member (the nearest enclosing class declaring the name, as JavaScript
11
+ * scoping resolves it). Null for an instance private, a function-local or
12
+ * generic class, or a class that was not collected. */
13
+ export function staticPrivateOwner(lowerer, priv) {
14
+ for (let node = priv.parent; node; node = node.parent) {
15
+ if (!ts.isClassDeclaration(node) && !ts.isClassExpression(node))
16
+ continue;
17
+ const member = node.members.nodes.find((candidate) => {
18
+ const name = candidate.name;
19
+ return name !== undefined && ts.isPrivateIdentifier(name) && name.text === priv.text;
20
+ });
21
+ if (!member)
22
+ continue;
23
+ const isStatic = ts.canHaveModifiers(member) &&
24
+ ts.getModifiers(member)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword) === true;
25
+ if (!isStatic)
26
+ return null;
27
+ for (const info of lowerer.classes.values()) {
28
+ if (info.decl !== node)
29
+ continue;
30
+ if (info.localClass || info.generic || info.genericInstance)
31
+ return null;
32
+ return info;
33
+ }
34
+ return null;
35
+ }
36
+ return null;
37
+ }
38
+ /** V8's TypeError text for a static private `name` of `info` used on a
39
+ * receiver that is not the declaring class object. */
40
+ function brandMessage(info, use, name) {
41
+ if (use === "read")
42
+ return `Cannot read private member ${name} from an object whose class did not declare it`;
43
+ if (use === "write")
44
+ return `Cannot write private member ${name} to an object whose class did not declare it`;
45
+ // V8 names the class by its own identifier; an anonymous class
46
+ // expression prints ".".
47
+ return `Receiver must be class ${info.decl?.name?.text ?? "."}`;
48
+ }
49
+ /** The brand check of a static private: JavaScript installs static private
50
+ * elements on the declaring class object alone, so the receiver must BE
51
+ * that object (a subclass, an object inheriting from it, or a primitive
52
+ * throws). An expression statement calling the lifted helper
53
+ * `%private.static.<use>:<class>:<#name>(value: dyn): void`, which throws
54
+ * V8's TypeError; `value` is the checked-dynamic receiver. */
55
+ export function staticPrivateBrandCheck(lowerer, info, use, name, value, loc) {
56
+ const helper = `%private.static.${use}:${info.def.name}:${name}`;
57
+ if (!lowerer.valueHelpers.has(helper)) {
58
+ const at = helperLoc(loc);
59
+ const param = varRef("value.0", DYN, at);
60
+ const classValue = lowerer.coerceToExpected(lowerer.classValueRef(info, info.decl), DYN);
61
+ lowerer.liftedFns.push({
62
+ name: helper,
63
+ params: [{ localId: "value.0", name: "value", type: DYN }],
64
+ returnType: VOID,
65
+ locals: [{ id: "value.0", name: "value", type: DYN, mutable: false }],
66
+ body: [
67
+ {
68
+ kind: "if",
69
+ cond: {
70
+ kind: "dynScalarEq",
71
+ left: param,
72
+ right: classValue,
73
+ negated: true,
74
+ type: BOOL,
75
+ loc: at,
76
+ },
77
+ then: [
78
+ {
79
+ kind: "throw",
80
+ value: {
81
+ kind: "libCall",
82
+ fn: "error.new",
83
+ args: [strLit(brandMessage(info, use, name), at)],
84
+ type: { kind: "object", className: "%TypeError" },
85
+ loc: at,
86
+ },
87
+ loc: at,
88
+ },
89
+ ],
90
+ else_: null,
91
+ loc: at,
92
+ },
93
+ ],
94
+ loc: at,
95
+ });
96
+ lowerer.valueHelpers.set(helper, helper);
97
+ }
98
+ return {
99
+ kind: "exprStmt",
100
+ expr: { kind: "call", callee: helper, args: [value], type: VOID, loc },
101
+ loc,
102
+ };
103
+ }
104
+ /** A static private the native storage does not hold (an accessor, a
105
+ * field without an initializer): a loud refusal, never a string-keyed
106
+ * read of the class object. */
107
+ function unsupportedStaticPrivate(lowerer, node, name) {
108
+ return lowerer.unsupported("SC1090", node, `the private static '${name}' in this form on a class whose constructor carries runtime statics`);
109
+ }
110
+ /** The checked-dynamic value `expr` lowers to, or null. */
111
+ function checkedDynamicReceiver(lowerer, node) {
112
+ const probed = tryLowerExpression(lowerer, node);
113
+ if (!probed)
114
+ return null;
115
+ if (probed.type.kind !== "dyn" &&
116
+ !(probed.kind === "dynCheck" && probed.value.type.kind === "dyn"))
117
+ return null;
118
+ const value = lowerer.lowerExpr(node);
119
+ if (value.type.kind === "dyn")
120
+ return value;
121
+ return value.kind === "dynCheck" ? value.value : null;
122
+ }
123
+ /** `R.#x` / `R.#m` read, where `#x` is a static private of a
124
+ * declaration-level class and `R` is a checked-dynamic value (`this` in a
125
+ * static accessor or method that the constructor object carries): the
126
+ * brand check, then the member's native storage. Null for other reads,
127
+ * which keep their paths (the class's own name reads storage directly). */
128
+ export function lowerStaticPrivateRead(lowerer, expr, loc) {
129
+ if (!ts.isPrivateIdentifier(expr.name) || expr.questionDotToken)
130
+ return null;
131
+ const info = staticPrivateOwner(lowerer, expr.name);
132
+ if (!info || !info.runtimeStatics)
133
+ return null;
134
+ if (lowerer.exactClassOfReceiver(expr.expression) === info)
135
+ return null;
136
+ const value = checkedDynamicReceiver(lowerer, expr.expression);
137
+ if (!value)
138
+ return null;
139
+ const name = expr.name.text;
140
+ const found = lowerer.findStaticOn(info, name);
141
+ if (!found)
142
+ unsupportedStaticPrivate(lowerer, expr, name);
143
+ const read = lowerClassStaticRead(lowerer, info, name, expr.expression, expr);
144
+ if (!read)
145
+ return null;
146
+ return {
147
+ kind: "seqExpr",
148
+ stmts: [
149
+ staticPrivateBrandCheck(lowerer, info, found.field ? "read" : "method", name, value, loc),
150
+ ],
151
+ result: read,
152
+ type: read.type,
153
+ loc,
154
+ };
155
+ }
156
+ /** `R.#m(args)` for a static private method on a checked-dynamic receiver:
157
+ * the brand check, then the call with `this` known to be the declaring
158
+ * class. A receiver other than `this` reaches only methods that do not
159
+ * read `this`; the others keep a loud refusal. */
160
+ export function lowerStaticPrivateCall(lowerer, call, access) {
161
+ if (!ts.isPrivateIdentifier(access.name) || access.questionDotToken)
162
+ return null;
163
+ const info = staticPrivateOwner(lowerer, access.name);
164
+ if (!info || !info.runtimeStatics)
165
+ return null;
166
+ if (lowerer.exactClassOfReceiver(access.expression) === info)
167
+ return null;
168
+ const name = access.name.text;
169
+ const found = lowerer.findStaticOn(info, name);
170
+ if (!found)
171
+ unsupportedStaticPrivate(lowerer, call, name);
172
+ const value = checkedDynamicReceiver(lowerer, access.expression);
173
+ if (!value)
174
+ return null;
175
+ const loc = locOf(call);
176
+ if (found.field !== undefined)
177
+ return lowerStaticPrivateFieldCall(lowerer, call, info, name, found.field, value);
178
+ const brand = staticPrivateBrandCheck(lowerer, info, "method", name, value, loc);
179
+ let result;
180
+ if (access.expression.kind === ts.SyntaxKind.ThisKeyword) {
181
+ // After the check `this` IS the class: lower the call against a
182
+ // class-valued `this`, the exact-receiver static path.
183
+ const classType = { kind: "classval", className: info.def.name };
184
+ const local = lowerer.declareHiddenLocal("%staticPrivateThis", classType);
185
+ const previous = lowerer.ctx.thisLocal;
186
+ lowerer.ctx.thisLocal = local;
187
+ try {
188
+ result = lowerStaticMethodCall(lowerer, call, access);
189
+ }
190
+ finally {
191
+ lowerer.ctx.thisLocal = previous;
192
+ }
193
+ if (!result)
194
+ return null;
195
+ return {
196
+ kind: "seqExpr",
197
+ stmts: [
198
+ brand,
199
+ {
200
+ kind: "varDecl",
201
+ localId: local.id,
202
+ init: lowerer.coerceToExpected(lowerer.classValueRef(info, info.decl), classType),
203
+ loc,
204
+ },
205
+ ],
206
+ result,
207
+ type: result.type,
208
+ loc,
209
+ };
210
+ }
211
+ if (found.method.member.body && hasStaticThis(found.method.member)) {
212
+ lowerer.unsupported("SC1090", call, `calling the private static '${name}' through a value other than 'this' when the method reads 'this'`);
213
+ }
214
+ const fnName = `%${found.declarer.def.name}.static:${name}`;
215
+ lowerer.noteEdge(fnName);
216
+ const args = lowerer.completeArgs(call.arguments.nodes, found.method.params, loc, call);
217
+ return {
218
+ kind: "seqExpr",
219
+ stmts: [brand],
220
+ result: { kind: "call", callee: fnName, args, type: found.method.ret, loc },
221
+ type: found.method.ret,
222
+ loc,
223
+ };
224
+ }
225
+ /** `R.#f(args)` for a function-valued static private field on a
226
+ * checked-dynamic receiver: the receiver, the brand check (PrivateGet's),
227
+ * then a call through the field's value with `this` bound to the receiver,
228
+ * as JavaScript calls a private field's function. The call takes the
229
+ * ordinary call-through-value lanes, so rest parameters, typed rests and
230
+ * checked-dynamic values receive every argument. */
231
+ function lowerStaticPrivateFieldCall(lowerer, call, info, name, field, value) {
232
+ const loc = locOf(call);
233
+ const receiver = lowerer.declareHiddenLocal("%staticPrivateReceiver", DYN);
234
+ const lowered = lowerCallThroughValue(lowerer, call, varRef(field.globalId, field.type, loc), loc);
235
+ if (lowered.kind !== "callValue" && lowered.kind !== "dynCall") {
236
+ return lowerer.unsupported("SC1090", call, `this call of the private static field '${name}' (spread arguments)`);
237
+ }
238
+ const result = { ...lowered, receiver: varRef(receiver.id, DYN, loc) };
239
+ return {
240
+ kind: "seqExpr",
241
+ stmts: [
242
+ { kind: "varDecl", localId: receiver.id, init: value, loc },
243
+ staticPrivateBrandCheck(lowerer, info, "read", name, varRef(receiver.id, DYN, loc), loc),
244
+ ],
245
+ result,
246
+ type: result.type,
247
+ loc,
248
+ };
249
+ }
250
+ /** `R.#x = v` for a static private field on a checked-dynamic receiver:
251
+ * the receiver, then the value, then the brand check (PrivateSet checks
252
+ * after the right side runs), then the native global. */
253
+ export function lowerStaticPrivateAssignment(lowerer, expr) {
254
+ const target = expr.left;
255
+ if (expr.operatorToken.kind !== ts.SyntaxKind.EqualsToken ||
256
+ !ts.isPropertyAccessExpression(target) ||
257
+ !ts.isPrivateIdentifier(target.name))
258
+ return null;
259
+ const info = staticPrivateOwner(lowerer, target.name);
260
+ if (!info || !info.runtimeStatics)
261
+ return null;
262
+ if (lowerer.exactClassOfReceiver(target.expression) === info)
263
+ return null;
264
+ const name = target.name.text;
265
+ const found = lowerer.findStaticOn(info, name);
266
+ if (!found?.field)
267
+ unsupportedStaticPrivate(lowerer, expr, name);
268
+ const value = checkedDynamicReceiver(lowerer, target.expression);
269
+ if (!value)
270
+ return null;
271
+ const loc = locOf(expr);
272
+ const receiver = lowerer.declareHiddenLocal("%staticPrivateReceiver", DYN);
273
+ const assigned = lowerer.declareHiddenLocal("%staticPrivateValue", found.field.type);
274
+ return {
275
+ kind: "seqExpr",
276
+ stmts: [
277
+ { kind: "varDecl", localId: receiver.id, init: value, loc },
278
+ {
279
+ kind: "varDecl",
280
+ localId: assigned.id,
281
+ init: lowerer.lowerExprExpecting(expr.right, found.field.type),
282
+ loc,
283
+ },
284
+ staticPrivateBrandCheck(lowerer, info, "write", name, varRef(receiver.id, DYN, loc), loc),
285
+ {
286
+ kind: "assign",
287
+ localId: found.field.globalId,
288
+ value: varRef(assigned.id, found.field.type, loc),
289
+ loc,
290
+ },
291
+ ],
292
+ result: varRef(assigned.id, found.field.type, loc),
293
+ type: found.field.type,
294
+ loc,
295
+ };
296
+ }
297
+ /** The update target of `R.#x++`, `--R.#x` or `R.#x op= v` for a static
298
+ * private field on a checked-dynamic receiver: the brand check, which runs
299
+ * where PrivateGet reads the old value (before the right side), and the
300
+ * field's native global. The write after it needs no second check: the
301
+ * receiver already passed. Null for other targets. */
302
+ export function staticPrivateUpdateTarget(lowerer, access) {
303
+ if (!ts.isPrivateIdentifier(access.name) || access.questionDotToken)
304
+ return null;
305
+ const info = staticPrivateOwner(lowerer, access.name);
306
+ if (!info || !info.runtimeStatics)
307
+ return null;
308
+ if (lowerer.exactClassOfReceiver(access.expression) === info)
309
+ return null;
310
+ const name = access.name.text;
311
+ const found = lowerer.findStaticOn(info, name);
312
+ if (!found?.field)
313
+ unsupportedStaticPrivate(lowerer, access, name);
314
+ const value = checkedDynamicReceiver(lowerer, access.expression);
315
+ if (!value)
316
+ return null;
317
+ return {
318
+ brand: staticPrivateBrandCheck(lowerer, info, "read", name, value, locOf(access)),
319
+ target: { id: found.field.globalId, type: found.field.type },
320
+ };
321
+ }
322
+ //# sourceMappingURL=private-statics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-statics.js","sourceRoot":"","sources":["../../../src/frontend/lowering/private-statics.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { IrExpr, IrType, SrcLoc } from "../../ir/ir.js";
1
+ import type { IrExpr, IrFunction, IrType, SrcLoc } from "../../ir/ir.js";
2
2
  import type { Lowerer } from "./lowerer.js";
3
3
  /** Closed declared-field layouts with an ordinary data surface: the targets
4
4
  * the checked record builder notes sources for. */
@@ -8,6 +8,17 @@ export declare function recordMayKeepSource(lowerer: Lowerer, t: IrType & {
8
8
  /** `record.sourceHas(value)`: whether this record kept undeclared source
9
9
  * properties. */
10
10
  export declare function recordSourceTest(value: IrExpr, loc: SrcLoc): IrExpr;
11
+ /** Shared work list of the whole-program scan: settled union and record
12
+ * answers, and the unions and records on the current path, by id. */
13
+ export interface KeepsSourceScan {
14
+ memo: Map<string, boolean>;
15
+ visiting: Set<string>;
16
+ }
17
+ /** Whether `fn` holds a validated conversion that can note a record source:
18
+ * a `dynCheck` whose target accepts `recordMayKeepSource`. Only such a
19
+ * conversion creates the kept view `recordSourceTest` answers, so a program
20
+ * without one never needs a capture to consult the view. */
21
+ export declare function functionKeepsRecordSources(lowerer: Lowerer, fn: IrFunction, scan: KeepsSourceScan): boolean;
11
22
  /** A reflective answer over a record value that branches on its kept
12
23
  * source: `staticAnswer` walks the declared fields, `viewAnswer` answers
13
24
  * from the live checked view (typed `type`, the static answer's type). The