@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,944 @@
1
+ /* Dynamic values of instances that may hold an InlineArray field
2
+ * (ir/inline-arrays.ts).
3
+ *
4
+ * Boxing an instance into a dynamic value (dynFrom, caughtToDyn) keeps the
5
+ * instance: a checked cast or a class test on the value gives the instance
6
+ * back, and the compiler's class dispatch for a dynamic member read or
7
+ * method call is IR that uses the instance as typed code does (a read of the
8
+ * inline field there is followed by inline-array-sources.ts like any
9
+ * other). Generic dynamic operations instead read the fields through a view
10
+ * of the instance, where the inline field gives a new array over the
11
+ * elements each time, and Node.js gives the field's one array. The two agree
12
+ * as long as no such operation reads the field by name, enumerates the
13
+ * instance's properties for code that can keep or write them, or writes the
14
+ * field.
15
+ *
16
+ * This pass follows the dynamic values that may hold such an instance from
17
+ * the boxings, through the slots that hold dynamic values (locals,
18
+ * parameters, results, globals, class and record fields, the elements of
19
+ * arrays, Maps and Sets, the members of dynamic objects and arrays, and the
20
+ * receivers and arguments of calls through function values and of the
21
+ * callbacks of array methods, whose callees it follows from the closures
22
+ * that reach them), and reports the first operation on one of them that is
23
+ * not known to keep those reads away from the field: a keyed read or write
24
+ * whose key is the field's name or not a literal, a checked cast to a type
25
+ * that has a record member of the field's name or holds a dynamic value, a
26
+ * call through a value no compiled function reaches, or a library call
27
+ * other than printing, JSON.stringify without a replacer, publishing,
28
+ * cloning for a worker, and the class tests and checked casts that give the
29
+ * instance back. */
30
+ import { readsArguments } from "./inline-arrays.js";
31
+ import { everyExprChild, everyStmtChild } from "./traverse.js";
32
+ /** The class dispatch's normalization of a capsule (class-dynamic-dispatch.ts):
33
+ * its result holds the instance its argument holds. */
34
+ export const NORMALIZE = "%dyn.class.normalize";
35
+ const DYN_KINDS = new Set(["dyn", "jsval", "caught"]);
36
+ /** Expressions whose value is one of their children's. */
37
+ const PASS_THROUGH = new Set([
38
+ "upcast",
39
+ "downcast",
40
+ "unionWrap",
41
+ "unionRetype",
42
+ "unionNarrow",
43
+ "ternary",
44
+ "logical",
45
+ "nullish",
46
+ "orDefault",
47
+ "seqExpr",
48
+ "chainRecv",
49
+ "optChain",
50
+ "dynDestrCheck",
51
+ ]);
52
+ /** Expressions that only look at a dynamic value: kind tests and
53
+ * comparisons. */
54
+ const OBSERVE = new Set([
55
+ "dynTest",
56
+ "dynScalarEq",
57
+ "dynHasKey",
58
+ "toBool",
59
+ "strEq",
60
+ "unionEq",
61
+ "unionIsTag",
62
+ "unionDisc",
63
+ "instanceOf",
64
+ "instanceOfValue",
65
+ "bin",
66
+ "unary",
67
+ ]);
68
+ /** Library calls that look at a dynamic value without handing its members
69
+ * to other code, or give the instance back. */
70
+ const READS = new Set([
71
+ "js.fromDyn",
72
+ "js.toDyn",
73
+ "dyn.this",
74
+ "dyn.typedRefIs",
75
+ "dyn.typedRefKeyIs",
76
+ "dyn.getPrototypeForIdentity",
77
+ "dyn.hasKey",
78
+ "dyn.hasOwn",
79
+ "dyn.in",
80
+ "dyn.arrLen",
81
+ "dyn.typeof",
82
+ "dyn.objectTag",
83
+ // Keys alone.
84
+ "dyn.forInKeyStrings",
85
+ "dyn.forInKeys",
86
+ "dyn.forInStable",
87
+ "dyn.objKeys",
88
+ "dyn.objKeyStrings",
89
+ "dyn.ownKeys",
90
+ "dyn.getOwnPropertyNames",
91
+ // The operators and conversions that make a number, string or bigint of
92
+ // a value: an instance converts through its class's own methods.
93
+ "js.add",
94
+ "js.arithmetic",
95
+ "js.bitwise",
96
+ "js.compare",
97
+ "js.increment",
98
+ "js.toF64",
99
+ "js.toNumberCoerce",
100
+ "js.toNumeric",
101
+ "dyn.add",
102
+ "dyn.abstractEq",
103
+ "dyn.arithmetic",
104
+ "dyn.bitwise",
105
+ "dyn.compare",
106
+ "dyn.increment",
107
+ "dyn.numberConstructor",
108
+ "dyn.stringConstructor",
109
+ "dyn.toNumberCoerce",
110
+ "dyn.toNumeric",
111
+ "dyn.toString",
112
+ "dyn.toStringCoerce",
113
+ // Adoption turns shared source nodes into capsules of the native value;
114
+ // it reads nothing the program sees.
115
+ "dyn.adoptShared",
116
+ // A worker's data is a structured clone, as in Node.js: the clone holds
117
+ // the elements, not the field.
118
+ "worker.new",
119
+ ]);
120
+ /** Library calls that read a member of a dynamic value by the key in their
121
+ * second argument: the member is followed as the value's. */
122
+ const KEYED_READS = new Set(["dyn.bagGet", "dyn.arrAt"]);
123
+ /** Library calls that iterate their first argument: an array's elements, or
124
+ * what an iterable class's own iterator gives. Their results are followed as
125
+ * the argument's members. */
126
+ const ITERATES = new Set([
127
+ "dyn.iterator",
128
+ "dyn.iteratorStep",
129
+ "dyn.iteratorStepDone",
130
+ "dyn.iteratorResult",
131
+ "dyn.iteratorCanStep",
132
+ ]);
133
+ /** Library calls that store their third argument into a member of their
134
+ * first, keyed by their second. */
135
+ const KEYED_WRITES = new Set(["dyn.keySet", "dyn.keyDelete"]);
136
+ /** The callee name of the iterator protocol's calls the lowering makes for
137
+ * `for...of`, spreads and `yield*` over a dynamic iterable: the iterator's
138
+ * `next`, `return` and `throw`. */
139
+ const ITERATOR_METHOD = "iterator method";
140
+ /** Methods of arrays, Maps and Sets a dynamic call may run that give the
141
+ * receiver's elements, or iterators over them, without keeping or writing
142
+ * them: their results are followed as the receiver's members. */
143
+ const ELEMENT_METHODS = new Set([
144
+ "values",
145
+ "keys",
146
+ "entries",
147
+ "get",
148
+ "has",
149
+ "at",
150
+ "indexOf",
151
+ "includes",
152
+ "slice",
153
+ ]);
154
+ /** Methods of arrays, Maps and Sets a dynamic call may run that call their
155
+ * first argument with each element (or value and key), its index (or key)
156
+ * and the receiver, and what their results hold: the receiver's members,
157
+ * the callback's results, or neither. */
158
+ const CALLBACK_METHODS = new Map([
159
+ ["forEach", "none"],
160
+ ["some", "none"],
161
+ ["every", "none"],
162
+ ["findIndex", "none"],
163
+ ["findLastIndex", "none"],
164
+ ["filter", "members"],
165
+ ["find", "members"],
166
+ ["findLast", "members"],
167
+ ["map", "results"],
168
+ ]);
169
+ /** Methods a dynamic call may run on a dynamic receiver whose arguments it
170
+ * only copies as a structured clone or publishes. */
171
+ const CLONING_METHODS = new Set(["postMessage"]);
172
+ /** The first operation that may let generic dynamic code read or write the
173
+ * inline field `field` of an instance boxed at one of `boxings`, or null. */
174
+ export function inlineArrayViewIssue(mod, boxings, field) {
175
+ if (boxings.size === 0)
176
+ return null;
177
+ return new ViewAnalysis(mod, boxings, field).run();
178
+ }
179
+ class ViewAnalysis {
180
+ mod;
181
+ boxings;
182
+ field;
183
+ functions = new Map();
184
+ methodImpls = new Map();
185
+ bases = new Map();
186
+ recordFields = new Map();
187
+ unions = new Map();
188
+ edges = new Map();
189
+ /** `edges` reversed: where a slot's values come from. */
190
+ sources = new Map();
191
+ sites = new Map();
192
+ /** The function each closure's site makes. */
193
+ closures = new Map();
194
+ valueCalls = [];
195
+ callbackCalls = [];
196
+ /** The compiled functions each value call, or each callback method call's
197
+ * callback, may run. */
198
+ targets = new Map();
199
+ held = new Set();
200
+ /** Whether values of each record shape and union (`r:` and `u:` keys)
201
+ * hold dynamic values (`dynish`), and whether checked casts to them
202
+ * recover (`recovers`). */
203
+ dynParts = new Map();
204
+ recoveringParts = new Map();
205
+ /** The slots each function's return statements return. */
206
+ returns = new Map();
207
+ /** The parameters (by index) a function may return as they came. */
208
+ returnedParams = new Map();
209
+ edgeCount = 0;
210
+ constructor(mod, boxings, field) {
211
+ this.mod = mod;
212
+ this.boxings = boxings;
213
+ this.field = field;
214
+ for (const fn of mod.functions)
215
+ this.functions.set(fn.name, fn);
216
+ for (const cls of mod.classes ?? []) {
217
+ this.bases.set(cls.name, cls.base);
218
+ for (const m of cls.methods ?? []) {
219
+ let list = this.methodImpls.get(m);
220
+ if (!list)
221
+ this.methodImpls.set(m, (list = []));
222
+ list.push(`%${cls.name}.${m}`);
223
+ }
224
+ }
225
+ for (const r of mod.records ?? [])
226
+ this.recordFields.set(r.id, r.fields.map((f) => f.name));
227
+ for (const u of mod.unions ?? [])
228
+ this.unions.set(u.id, u.arms);
229
+ }
230
+ run() {
231
+ // A function that returns one of its parameters as it came gives each
232
+ // caller that caller's argument back, so one call's argument does not
233
+ // reach every caller's result. Which parameters a function returns
234
+ // depends on the graph, which depends on the calls' results: the graph
235
+ // grows until both settle.
236
+ for (let changed = true; changed;) {
237
+ this.returns.clear();
238
+ this.valueCalls.length = 0;
239
+ this.callbackCalls.length = 0;
240
+ const before = this.edgeCount;
241
+ for (const fn of this.mod.functions)
242
+ this.flow(fn, null);
243
+ // Calls through values run the closures that reach their callees; the
244
+ // edges to their parameters can bring more closures to other calls.
245
+ for (let resolved = true; resolved;) {
246
+ resolved = false;
247
+ for (const { fn, call } of this.valueCalls)
248
+ resolved = this.resolve(fn, call) || resolved;
249
+ for (const { fn, call } of this.callbackCalls)
250
+ resolved = this.resolveCallback(fn, call) || resolved;
251
+ }
252
+ changed = this.settleReturns() || this.edgeCount !== before;
253
+ }
254
+ const queue = [...this.boxings].map((e) => this.site(e));
255
+ for (const slot of queue)
256
+ this.held.add(slot);
257
+ while (queue.length > 0) {
258
+ const slot = queue.pop();
259
+ for (const next of this.edges.get(slot) ?? [])
260
+ if (!this.held.has(next)) {
261
+ this.held.add(next);
262
+ queue.push(next);
263
+ }
264
+ }
265
+ let issue = null;
266
+ for (const fn of this.mod.functions) {
267
+ this.flow(fn, (found) => (issue ??= found));
268
+ if (issue !== null)
269
+ return issue;
270
+ }
271
+ return null;
272
+ }
273
+ // ── Types and slots ──
274
+ /** Whether values of `t` are, or contain, dynamic values. */
275
+ dynish(t, depth = 0, within = new Set()) {
276
+ if (DYN_KINDS.has(t.kind))
277
+ return true;
278
+ // A type too deep to look through counts as one that holds them.
279
+ if (depth > 32)
280
+ return true;
281
+ const part = (p, inside = within) => this.dynish(p, depth + 1, inside);
282
+ switch (t.kind) {
283
+ case "array":
284
+ case "set":
285
+ return part(t.elem);
286
+ case "map":
287
+ return part(t.key) || part(t.value);
288
+ case "union":
289
+ case "record": {
290
+ // A record or union type that holds itself holds dynamic values
291
+ // when its other parts do. Only a result that assumed nothing about
292
+ // an enclosing type is kept.
293
+ const key = t.kind === "union" ? `u:${t.unionId}` : `r:${t.shapeId}`;
294
+ if (within.has(key))
295
+ return false;
296
+ const known = this.dynParts.get(key);
297
+ if (known !== undefined)
298
+ return known;
299
+ const inside = new Set(within).add(key);
300
+ const result = t.kind === "union"
301
+ ? (this.unions.get(t.unionId) ?? []).some((arm) => part(arm, inside))
302
+ : ((this.mod.records ?? [])
303
+ .find((r) => r.id === t.shapeId)
304
+ ?.fields.some((f) => part(f.type, inside)) ?? false);
305
+ if (within.size === 0)
306
+ this.dynParts.set(key, result);
307
+ return result;
308
+ }
309
+ default:
310
+ return false;
311
+ }
312
+ }
313
+ /** Whether a checked cast to `t` takes no member of the value that can
314
+ * hold the field's array: a class instance comes back as itself, a scalar
315
+ * or a function is converted, and a dynamic value stays one; a record is
316
+ * built from the members its fields name, and an array, Map or Set from
317
+ * the elements, each converted by its own type. The members and elements
318
+ * convert this way too, the field's name names none, and none holds a
319
+ * dynamic value, which would not be followed. A record or union type that
320
+ * holds itself recovers when its other parts do. */
321
+ recovers(t, depth = 0, within = new Set()) {
322
+ if (depth > 32)
323
+ return false;
324
+ const part = (p, inside = within) => !this.dynish(p) && this.recovers(p, depth + 1, inside);
325
+ switch (t.kind) {
326
+ case "array":
327
+ case "set":
328
+ return part(t.elem);
329
+ case "map":
330
+ return part(t.key) && part(t.value);
331
+ case "union":
332
+ case "record": {
333
+ // Only a result that assumed nothing about an enclosing type is
334
+ // kept.
335
+ const key = t.kind === "union" ? `u:${t.unionId}` : `r:${t.shapeId}`;
336
+ if (within.has(key))
337
+ return true;
338
+ const known = this.recoveringParts.get(key);
339
+ if (known !== undefined)
340
+ return known;
341
+ const inside = new Set(within).add(key);
342
+ let result;
343
+ if (t.kind === "union")
344
+ result = (this.unions.get(t.unionId) ?? []).every((arm) => this.recovers(arm, depth + 1, inside));
345
+ else {
346
+ const shape = (this.mod.records ?? []).find((r) => r.id === t.shapeId);
347
+ result =
348
+ shape !== undefined &&
349
+ shape.fields.every((f) => f.name !== this.field && part(f.type, inside));
350
+ }
351
+ if (within.size === 0)
352
+ this.recoveringParts.set(key, result);
353
+ return result;
354
+ }
355
+ default:
356
+ return true;
357
+ }
358
+ }
359
+ /** Whether the graph follows values of `t`: dynamic values, and function
360
+ * values, which calls through values need. */
361
+ followed(t) {
362
+ return t.kind === "func" || this.dynish(t);
363
+ }
364
+ rootOf(className) {
365
+ let name = className;
366
+ for (let base = this.bases.get(name); base !== undefined; base = this.bases.get(name))
367
+ name = base;
368
+ return name;
369
+ }
370
+ localSlot(fn, id) {
371
+ return id.startsWith("%g.") ? `g:${id}` : `l:${fn.name}\0${id}`;
372
+ }
373
+ site(e) {
374
+ let slot = this.sites.get(e);
375
+ if (slot === undefined)
376
+ this.sites.set(e, (slot = `x:${this.sites.size}`));
377
+ return slot;
378
+ }
379
+ /** A dynamic value's slots and the slots of what it holds: a member read
380
+ * from it may be any of them. */
381
+ deep(slots) {
382
+ return [...slots, ...slots.map((s) => `c:${s}`)];
383
+ }
384
+ recordSlots(t) {
385
+ if (t.kind !== "record")
386
+ return [];
387
+ return (this.recordFields.get(t.shapeId) ?? []).map((f) => `s:${t.shapeId}\0${f}`);
388
+ }
389
+ /** The slots the value of `e` may come from. */
390
+ slotsOf(fn, e) {
391
+ const children = () => {
392
+ const out = [];
393
+ everyExprChild(e, (child) => {
394
+ out.push(...this.slotsOf(fn, child));
395
+ return true;
396
+ }, () => true);
397
+ return out;
398
+ };
399
+ switch (e.kind) {
400
+ case "varRef":
401
+ return [this.localSlot(fn, e.localId)];
402
+ case "dynFrom":
403
+ case "caughtToDyn":
404
+ if (this.boxings.has(e))
405
+ return [this.site(e)];
406
+ return [...this.slotsOf(fn, e.value), ...this.recordSlots(e.value.type)];
407
+ case "closure":
408
+ return [this.site(e)];
409
+ case "call":
410
+ // Normalization boxes the instance of a capsule at its own class.
411
+ if (e.callee === NORMALIZE && e.args[0] !== undefined)
412
+ return this.slotsOf(fn, e.args[0]);
413
+ return this.results(fn, e);
414
+ case "virtualCall":
415
+ return this.results(fn, e);
416
+ case "callValue":
417
+ return [this.site(e)];
418
+ case "dynCall":
419
+ // An iterator step gives what the iterator iterates.
420
+ return e.calleeName === ITERATOR_METHOD && e.receiver !== undefined
421
+ ? [this.site(e), ...this.deep(this.slotsOf(fn, e.receiver))]
422
+ : [this.site(e)];
423
+ case "fieldGet":
424
+ return [`f:${this.rootOf(e.className)}\0${e.field}`];
425
+ case "recordGet":
426
+ return e.obj.type.kind === "record" ? [`s:${e.obj.type.shapeId}\0${e.field}`] : [];
427
+ case "arrayGet":
428
+ return this.slotsOf(fn, e.arr).map((s) => `c:${s}`);
429
+ case "mapIntrinsic":
430
+ case "setIntrinsic":
431
+ case "arrIntrinsic":
432
+ return this.slotsOf(fn, e.receiver).map((s) => `c:${s}`);
433
+ case "dynKeyGet":
434
+ case "dynIterN":
435
+ return this.deep(this.slotsOf(fn, e.value));
436
+ case "dynInvoke":
437
+ if (ELEMENT_METHODS.has(e.method) || CALLBACK_METHODS.get(e.method) === "members")
438
+ return this.deep(this.slotsOf(fn, e.recv));
439
+ return CALLBACK_METHODS.get(e.method) === "results" ? [this.site(e)] : [];
440
+ case "dynCheck":
441
+ return this.followed(e.type) ? this.deep(this.slotsOf(fn, e.value)) : [];
442
+ case "libCall":
443
+ if (e.fn === "dyn.this")
444
+ return [`t:${fn.name}`];
445
+ if ((KEYED_READS.has(e.fn) || ITERATES.has(e.fn)) && e.args[0] !== undefined)
446
+ return this.deep(this.slotsOf(fn, e.args[0]));
447
+ if ((e.fn === "js.toDyn" || e.fn === "js.fromDyn") && e.args[0] !== undefined)
448
+ return this.slotsOf(fn, e.args[0]);
449
+ return [];
450
+ case "arrayLit":
451
+ case "dynObjLit":
452
+ case "dynArrLit":
453
+ case "recordLit":
454
+ case "setNew":
455
+ case "mapNew":
456
+ return [this.site(e)];
457
+ default:
458
+ return PASS_THROUGH.has(e.kind) ? children() : [];
459
+ }
460
+ }
461
+ /** The slots a call's value may come from: its callees' results, and the
462
+ * arguments at the parameters they return. */
463
+ results(fn, e) {
464
+ const slots = [];
465
+ for (const { callee, offset } of this.callees(e)) {
466
+ slots.push(`r:${callee}`);
467
+ for (const i of this.returnedParams.get(callee) ?? [])
468
+ if (e.args[i - offset] !== undefined)
469
+ slots.push(...this.slotsOf(fn, e.args[i - offset]));
470
+ }
471
+ return slots;
472
+ }
473
+ /** Decides each function's returns: a returned slot that holds only what
474
+ * the function's parameters came with (a parameter, or a local every
475
+ * value of which comes from such slots) makes those parameters returned;
476
+ * any other returned slot flows to the function's result. Returns whether
477
+ * a parameter became returned. */
478
+ settleReturns() {
479
+ let changed = false;
480
+ for (const [name, returned] of this.returns) {
481
+ const fn = this.functions.get(name);
482
+ const params = new Map(fn.params.map((p, i) => [this.localSlot(fn, p.localId), i]));
483
+ const own = new Set(fn.locals.map((l) => this.localSlot(fn, l.id)));
484
+ // The carriers: parameters, and locals all of whose sources are
485
+ // carriers.
486
+ const carriers = new Set(params.keys());
487
+ for (let grew = true; grew;) {
488
+ grew = false;
489
+ for (const slot of own) {
490
+ if (carriers.has(slot))
491
+ continue;
492
+ const sources = this.sources.get(slot);
493
+ if (sources !== undefined &&
494
+ sources.size > 0 &&
495
+ [...sources].every((s) => carriers.has(s))) {
496
+ carriers.add(slot);
497
+ grew = true;
498
+ }
499
+ }
500
+ }
501
+ let set = this.returnedParams.get(name);
502
+ for (const slots of returned)
503
+ for (const slot of slots) {
504
+ if (!carriers.has(slot)) {
505
+ this.edge(slot, `r:${name}`);
506
+ continue;
507
+ }
508
+ // The parameters the carrier's values come from.
509
+ const queue = [slot];
510
+ const seen = new Set(queue);
511
+ while (queue.length > 0) {
512
+ const at = queue.pop();
513
+ const index = params.get(at);
514
+ if (index !== undefined) {
515
+ if (set === undefined)
516
+ this.returnedParams.set(name, (set = new Set()));
517
+ if (!set.has(index)) {
518
+ set.add(index);
519
+ changed = true;
520
+ }
521
+ }
522
+ for (const from of this.sources.get(at) ?? [])
523
+ if (carriers.has(from) && !seen.has(from)) {
524
+ seen.add(from);
525
+ queue.push(from);
526
+ }
527
+ }
528
+ }
529
+ }
530
+ return changed;
531
+ }
532
+ edge(from, to) {
533
+ let list = this.edges.get(from);
534
+ if (!list)
535
+ this.edges.set(from, (list = new Set()));
536
+ if (list.has(to))
537
+ return false;
538
+ list.add(to);
539
+ this.edgeCount++;
540
+ let back = this.sources.get(to);
541
+ if (!back)
542
+ this.sources.set(to, (back = new Set()));
543
+ back.add(from);
544
+ return true;
545
+ }
546
+ holds(fn, e) {
547
+ return this.slotsOf(fn, e).some((s) => this.held.has(s));
548
+ }
549
+ /** Whether `e`, or a member of it, may be a closure's value: a method
550
+ * call on it may run that closure with it as `this`. */
551
+ mayHoldFunction(fn, e) {
552
+ return this.closuresAt(this.deep(this.slotsOf(fn, e)));
553
+ }
554
+ // ── Calls ──
555
+ /** The functions a call, construction or method call may run, with the
556
+ * offset of its first argument in their parameters. */
557
+ callees(e) {
558
+ switch (e.kind) {
559
+ case "call":
560
+ return [{ callee: e.callee, offset: 0 }];
561
+ case "new":
562
+ return [{ callee: `%${e.className}.constructor`, offset: 1 }];
563
+ case "virtualCall": {
564
+ const impls = e.targets !== undefined
565
+ ? e.targets.map((c) => `%${c}.${e.method}`)
566
+ : (this.methodImpls.get(e.method) ?? []);
567
+ return impls.map((callee) => ({ callee, offset: 0 }));
568
+ }
569
+ default:
570
+ return [];
571
+ }
572
+ }
573
+ /** Connects a call through a value to the closures that reach its
574
+ * callee: its receiver to their `this`, its arguments to their
575
+ * parameters that take dynamic or function values (a typed parameter
576
+ * takes its argument through a checked cast), and their results to the
577
+ * call's. Returns whether it added an edge. */
578
+ resolve(fn, call) {
579
+ let targets = this.targets.get(call);
580
+ if (targets === undefined)
581
+ this.targets.set(call, (targets = new Set()));
582
+ this.closuresAt(this.slotsOf(fn, call.callee), targets);
583
+ let changed = false;
584
+ const site = this.site(call);
585
+ for (const name of targets) {
586
+ const target = this.functions.get(name);
587
+ if (target === undefined)
588
+ continue;
589
+ changed = this.edge(`r:${name}`, site) || changed;
590
+ if (call.kind === "dynCall" && call.receiver !== undefined)
591
+ for (const from of this.slotsOf(fn, call.receiver))
592
+ changed = this.edge(from, `t:${name}`) || changed;
593
+ call.args.forEach((arg, i) => {
594
+ const param = target.params[i];
595
+ if (param === undefined || !this.followed(param.type) || !this.followed(arg.type))
596
+ return;
597
+ for (const from of this.slotsOf(fn, arg))
598
+ changed = this.edge(from, this.localSlot(target, param.localId)) || changed;
599
+ });
600
+ }
601
+ return changed;
602
+ }
603
+ /** Adds to `into` the functions of the closures whose values may reach
604
+ * `slots`; returns whether there is one. */
605
+ closuresAt(slots, into) {
606
+ const seen = new Set(slots);
607
+ const queue = [...slots];
608
+ let found = false;
609
+ while (queue.length > 0) {
610
+ const slot = queue.pop();
611
+ const closure = this.closures.get(slot);
612
+ if (closure !== undefined) {
613
+ found = true;
614
+ if (into === undefined)
615
+ return true;
616
+ into.add(closure);
617
+ }
618
+ for (const from of this.sources.get(slot) ?? [])
619
+ if (!seen.has(from)) {
620
+ seen.add(from);
621
+ queue.push(from);
622
+ }
623
+ }
624
+ return found;
625
+ }
626
+ /** Connects a callback method call to the closures that reach its first
627
+ * argument: the receiver's members to their first two parameters, the
628
+ * receiver to their third, and for `map` their results to the call's.
629
+ * Returns whether it added an edge. */
630
+ resolveCallback(fn, call) {
631
+ let targets = this.targets.get(call);
632
+ if (targets === undefined)
633
+ this.targets.set(call, (targets = new Set()));
634
+ const callback = call.args[0];
635
+ if (callback === undefined)
636
+ return false;
637
+ this.closuresAt(this.slotsOf(fn, callback), targets);
638
+ const receiver = this.slotsOf(fn, call.recv);
639
+ const members = this.deep(receiver);
640
+ let changed = false;
641
+ for (const name of targets) {
642
+ const target = this.functions.get(name);
643
+ if (target === undefined)
644
+ continue;
645
+ if (CALLBACK_METHODS.get(call.method) === "results")
646
+ changed = this.edge(`r:${name}`, this.site(call)) || changed;
647
+ [members, members, receiver].forEach((slots, i) => {
648
+ const param = target.params[i];
649
+ if (param === undefined || !this.followed(param.type))
650
+ return;
651
+ for (const from of slots)
652
+ changed = this.edge(from, this.localSlot(target, param.localId)) || changed;
653
+ });
654
+ }
655
+ return changed;
656
+ }
657
+ // ── The walk ──
658
+ /** Builds the slot graph (`check` null), or reports the first operation
659
+ * that takes a held dynamic value where generic code may read or write the
660
+ * field. */
661
+ flow(fn, check) {
662
+ const hold = (to, value) => {
663
+ if (check !== null || (!this.followed(value.type) && !this.boxings.has(value)))
664
+ return;
665
+ for (const from of this.slotsOf(fn, value))
666
+ this.edge(from, to);
667
+ };
668
+ const holdIn = (container, value) => {
669
+ for (const slot of this.slotsOf(fn, container))
670
+ hold(`c:${slot}`, value);
671
+ };
672
+ const report = (value, loc, what) => {
673
+ if (check !== null && this.holds(fn, value))
674
+ check({
675
+ loc,
676
+ reason: `an instance, or a value that can hold one, becomes a dynamic value that reaches ${what}, where a dynamic view of an inline field would read it as a new array each time`,
677
+ });
678
+ };
679
+ // A keyed read or write names the field, or any member when its key is
680
+ // not a literal.
681
+ const keyed = (receiver, key, loc, what) => {
682
+ if (key === undefined || key.kind !== "strLit" || key.value === this.field)
683
+ report(receiver, loc, `${what} of a member that may be the field`);
684
+ };
685
+ // A write may also be an array's: an element, or its length.
686
+ const keyedWrite = (receiver, key, loc, what) => {
687
+ keyed(receiver, key, loc, what);
688
+ if (key?.kind === "strLit" && (key.value === "length" || /^(0|[1-9][0-9]*)$/.test(key.value)))
689
+ report(receiver, loc, `${what} of an array element or length`);
690
+ };
691
+ const args = (call) => {
692
+ const callees = this.callees(call);
693
+ for (const { callee, offset } of callees) {
694
+ const target = this.functions.get(callee);
695
+ call.args.forEach((arg, i) => {
696
+ const param = target?.params[i + offset];
697
+ if (target === undefined || param === undefined)
698
+ return report(arg, call.loc, `a call to ${callee}`);
699
+ hold(this.localSlot(target, param.localId), arg);
700
+ });
701
+ }
702
+ if (callees.length === 0)
703
+ for (const arg of call.args)
704
+ report(arg, call.loc, "a method call");
705
+ };
706
+ // A call through a value no compiled function reaches may run library
707
+ // code.
708
+ const valueCall = (call) => {
709
+ if (check === null) {
710
+ this.valueCalls.push({ fn, call });
711
+ return;
712
+ }
713
+ if ((this.targets.get(call)?.size ?? 0) > 0)
714
+ return;
715
+ // An iterator that is no compiled function's is the runtime's, over
716
+ // an array, a string or a collection.
717
+ if (call.kind === "dynCall" && call.calleeName === ITERATOR_METHOD)
718
+ return;
719
+ const what = "a call through a value no compiled function reaches";
720
+ for (const a of call.args)
721
+ report(a, call.loc, what);
722
+ if (call.kind === "dynCall" && call.receiver !== undefined)
723
+ report(call.receiver, call.loc, what);
724
+ };
725
+ // A callback method of an array, Map or Set runs its callback, which a
726
+ // compiled function must be; the receiver's own method of that name
727
+ // instead, a function it holds, may be any code.
728
+ const callbackCall = (call) => {
729
+ if (check === null) {
730
+ this.callbackCalls.push({ fn, call });
731
+ return;
732
+ }
733
+ const what = `the dynamic method call '${call.method}'`;
734
+ if ((this.targets.get(call)?.size ?? 0) === 0)
735
+ report(call.recv, call.loc, `${what} with a callback no compiled function reaches`);
736
+ else if (this.mayHoldFunction(fn, call.recv))
737
+ report(call.recv, call.loc, `${what} on a value that may hold a function`);
738
+ for (const a of call.args.slice(1))
739
+ report(a, call.loc, what);
740
+ };
741
+ const expr = (e) => {
742
+ switch (e.kind) {
743
+ case "assignExpr":
744
+ hold(this.localSlot(fn, e.localId), e.value);
745
+ break;
746
+ case "call":
747
+ case "new":
748
+ case "virtualCall":
749
+ args(e);
750
+ break;
751
+ case "callValue":
752
+ case "dynCall":
753
+ valueCall(e);
754
+ break;
755
+ case "closure": {
756
+ if (check !== null)
757
+ break;
758
+ this.closures.set(this.site(e), e.fnName);
759
+ const lifted = this.functions.get(e.fnName);
760
+ // A captured local is one binding on both sides.
761
+ e.captures.forEach((id, i) => {
762
+ const inner = lifted?.captures?.[i];
763
+ if (inner === undefined)
764
+ return;
765
+ const outer = this.localSlot(fn, id);
766
+ const captured = this.localSlot(lifted, inner.localId);
767
+ this.edge(outer, captured);
768
+ this.edge(captured, outer);
769
+ });
770
+ break;
771
+ }
772
+ case "recordLit":
773
+ if (e.type.kind === "record") {
774
+ const shape = e.type.shapeId;
775
+ for (const f of e.fields)
776
+ hold(`s:${shape}\0${f.name}`, f.value);
777
+ }
778
+ break;
779
+ case "arrayLit":
780
+ for (const x of e.elems)
781
+ hold(`c:${this.site(e)}`, x);
782
+ break;
783
+ case "dynArrLit":
784
+ for (const x of e.elems)
785
+ hold(this.site(e), x);
786
+ break;
787
+ case "dynObjLit":
788
+ for (const f of e.fields ?? [])
789
+ hold(this.site(e), f.value);
790
+ break;
791
+ case "mapNew":
792
+ for (const { key, value } of e.seed ?? []) {
793
+ hold(`c:${this.site(e)}`, key);
794
+ hold(`c:${this.site(e)}`, value);
795
+ }
796
+ break;
797
+ case "setNew":
798
+ // The seed's elements become the Set's.
799
+ if (e.seed && check === null)
800
+ for (const from of this.slotsOf(fn, e.seed))
801
+ this.edge(`c:${from}`, `c:${this.site(e)}`);
802
+ break;
803
+ case "arrIntrinsic":
804
+ case "mapIntrinsic":
805
+ case "setIntrinsic":
806
+ for (const a of e.args)
807
+ holdIn(e.receiver, a);
808
+ break;
809
+ case "dynKeyGet":
810
+ keyed(e.value, e.key, e.loc, "a keyed read");
811
+ break;
812
+ case "dynCheck":
813
+ // A cast to a class gives the instance back; a cast to a record,
814
+ // array or collection type builds it from the members it names
815
+ // or the elements.
816
+ if (!this.recovers(e.type))
817
+ report(e.value, e.loc, "a checked cast to a structured type");
818
+ break;
819
+ case "dynInvoke":
820
+ if (CALLBACK_METHODS.has(e.method)) {
821
+ callbackCall(e);
822
+ break;
823
+ }
824
+ if (!ELEMENT_METHODS.has(e.method))
825
+ report(e.recv, e.loc, `the dynamic method call '${e.method}'`);
826
+ else if (check !== null && this.mayHoldFunction(fn, e.recv))
827
+ report(e.recv, e.loc, `the dynamic method call '${e.method}' on a value that may hold a function`);
828
+ if (!CLONING_METHODS.has(e.method))
829
+ for (const a of e.args)
830
+ report(a, e.loc, `the dynamic method call '${e.method}'`);
831
+ break;
832
+ case "libCall":
833
+ if (KEYED_READS.has(e.fn))
834
+ keyed(e.args[0], e.args[1], e.loc, `the library call ${e.fn}`);
835
+ else if (KEYED_WRITES.has(e.fn)) {
836
+ keyedWrite(e.args[0], e.args[1], e.loc, `the library call ${e.fn}`);
837
+ if (e.args[2] !== undefined)
838
+ for (const slot of this.slotsOf(fn, e.args[0]))
839
+ hold(slot, e.args[2]);
840
+ }
841
+ else if (!READS.has(e.fn) && !ITERATES.has(e.fn) && !readsArguments(e))
842
+ for (const a of e.args)
843
+ report(a, e.loc, `the library call ${e.fn}`);
844
+ break;
845
+ case "intrinsic":
846
+ // Printing reads its arguments; publishing freezes them.
847
+ if (!e.name.startsWith("console.") && e.name !== "threads.publish")
848
+ for (const a of e.args)
849
+ report(a, e.loc, `'${e.name}'`);
850
+ break;
851
+ default:
852
+ if (!PASS_THROUGH.has(e.kind) && !OBSERVE.has(e.kind) && !MODELLED.has(e.kind))
853
+ everyExprChild(e, (child) => {
854
+ report(child, e.loc, `a '${e.kind}' expression`);
855
+ return true;
856
+ }, () => true);
857
+ }
858
+ return everyExprChild(e, expr, stmt);
859
+ };
860
+ const stmt = (s) => {
861
+ switch (s.kind) {
862
+ case "varDecl":
863
+ if (s.init)
864
+ hold(this.localSlot(fn, s.localId), s.init);
865
+ break;
866
+ case "assign":
867
+ hold(this.localSlot(fn, s.localId), s.value);
868
+ break;
869
+ case "return":
870
+ if (s.value !== null &&
871
+ check === null &&
872
+ (this.followed(s.value.type) || this.boxings.has(s.value))) {
873
+ let list = this.returns.get(fn.name);
874
+ if (!list)
875
+ this.returns.set(fn.name, (list = []));
876
+ list.push(this.slotsOf(fn, s.value));
877
+ }
878
+ break;
879
+ case "fieldSet":
880
+ hold(`f:${this.rootOf(s.className)}\0${s.field}`, s.value);
881
+ break;
882
+ case "recordSet":
883
+ hold(`s:${s.shapeId}\0${s.field}`, s.value);
884
+ break;
885
+ case "arraySet":
886
+ holdIn(s.arr, s.value);
887
+ break;
888
+ case "forOf":
889
+ if (check === null)
890
+ for (const from of this.slotsOf(fn, s.iterable))
891
+ for (const slot of [from, `c:${from}`])
892
+ this.edge(slot, this.localSlot(fn, s.localId));
893
+ break;
894
+ case "throw":
895
+ hold("e:", s.value);
896
+ break;
897
+ case "tryCatch":
898
+ if (check === null && s.catchLocalId !== null)
899
+ this.edge("e:", this.localSlot(fn, s.catchLocalId));
900
+ break;
901
+ case "recordKeySet":
902
+ report(s.value, s.loc, "a dynamically keyed property");
903
+ break;
904
+ }
905
+ return everyStmtChild(s, expr, stmt);
906
+ };
907
+ for (const s of fn.body)
908
+ stmt(s);
909
+ }
910
+ }
911
+ /** Expressions the walk follows or checks itself. */
912
+ const MODELLED = new Set([
913
+ "varRef",
914
+ "assignExpr",
915
+ "call",
916
+ "new",
917
+ "virtualCall",
918
+ "callValue",
919
+ "closure",
920
+ "recordLit",
921
+ "arrayLit",
922
+ "dynArrLit",
923
+ "dynObjLit",
924
+ "mapNew",
925
+ "setNew",
926
+ "arrIntrinsic",
927
+ "mapIntrinsic",
928
+ "setIntrinsic",
929
+ "arrayGet",
930
+ "arrayHas",
931
+ "arrayState",
932
+ "fieldGet",
933
+ "recordGet",
934
+ "dynKeyGet",
935
+ "dynIterN",
936
+ "dynCheck",
937
+ "dynCall",
938
+ "dynInvoke",
939
+ "dynFrom",
940
+ "caughtToDyn",
941
+ "libCall",
942
+ "intrinsic",
943
+ ]);
944
+ //# sourceMappingURL=inline-array-views.js.map