redscript-mc 2.0.0 → 2.1.0

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 (629) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +12 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +245 -0
  22. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  23. package/dist/src/__tests__/mc-version.test.js +154 -0
  24. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  25. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  26. package/dist/src/__tests__/modules.test.d.ts +7 -0
  27. package/dist/src/__tests__/modules.test.js +333 -0
  28. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  30. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  31. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  32. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  33. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  34. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  35. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  36. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  37. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  38. package/dist/src/__tests__/option.test.d.ts +14 -0
  39. package/dist/src/__tests__/option.test.js +275 -0
  40. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  41. package/dist/src/__tests__/schedule.test.js +98 -0
  42. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  43. package/dist/src/__tests__/sourcemap.test.js +227 -0
  44. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  45. package/dist/src/__tests__/tuple.test.js +202 -0
  46. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  47. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  48. package/dist/src/ast/types.d.ts +56 -2
  49. package/dist/src/cache/deps.d.ts +41 -0
  50. package/dist/src/cache/deps.js +158 -0
  51. package/dist/src/cache/incremental.d.ts +35 -0
  52. package/dist/src/cache/incremental.js +165 -0
  53. package/dist/src/cache/index.d.ts +37 -0
  54. package/dist/src/cache/index.js +152 -0
  55. package/dist/src/cli.js +76 -45
  56. package/dist/src/compile.d.ts +2 -2
  57. package/dist/src/compile.js +1 -1
  58. package/dist/src/diagnostics/index.d.ts +1 -1
  59. package/dist/src/diagnostics/index.js +8 -11
  60. package/dist/src/emit/compile.d.ts +29 -0
  61. package/dist/src/emit/compile.js +143 -0
  62. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  63. package/dist/{src2 → src}/emit/index.js +59 -8
  64. package/dist/src/emit/modules.d.ts +29 -0
  65. package/dist/src/emit/modules.js +492 -0
  66. package/dist/src/emit/sourcemap.d.ts +53 -0
  67. package/dist/src/emit/sourcemap.js +73 -0
  68. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  69. package/dist/{src2 → src}/hir/lower.js +22 -1
  70. package/dist/src/hir/monomorphize.d.ts +22 -0
  71. package/dist/src/hir/monomorphize.js +379 -0
  72. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  73. package/dist/src/index.d.ts +19 -2
  74. package/dist/src/index.js +36 -14
  75. package/dist/src/lexer/index.d.ts +1 -1
  76. package/dist/src/lexer/index.js +1 -0
  77. package/dist/src/lir/budget.d.ts +37 -0
  78. package/dist/src/lir/budget.js +280 -0
  79. package/dist/{src2 → src}/lir/lower.js +19 -0
  80. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  81. package/dist/src/lsp/main.d.ts +8 -0
  82. package/dist/src/lsp/main.js +11 -0
  83. package/dist/src/lsp/server.d.ts +11 -0
  84. package/dist/src/lsp/server.js +352 -0
  85. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  86. package/dist/{src2 → src}/mir/lower.js +244 -10
  87. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  88. package/dist/src/optimizer/coroutine.d.ts +34 -0
  89. package/dist/src/optimizer/coroutine.js +789 -0
  90. package/dist/src/optimizer/dce.d.ts +8 -34
  91. package/dist/src/optimizer/dce.js +146 -629
  92. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  93. package/dist/src/optimizer/interprocedural.js +186 -0
  94. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  95. package/dist/src/optimizer/lir/const_imm.js +139 -0
  96. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  97. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  98. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  99. package/dist/src/optimizer/lir/peephole.js +52 -0
  100. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  101. package/dist/src/optimizer/lir/pipeline.js +34 -0
  102. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  103. package/dist/src/optimizer/nbt-batch.js +51 -0
  104. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  105. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  106. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  107. package/dist/src/optimizer/selector-cache.js +100 -0
  108. package/dist/src/optimizer/unroll.d.ts +32 -0
  109. package/dist/src/optimizer/unroll.js +348 -0
  110. package/dist/src/parser/index.d.ts +8 -0
  111. package/dist/src/parser/index.js +204 -14
  112. package/dist/src/repl.d.ts +1 -1
  113. package/dist/src/typechecker/index.d.ts +4 -0
  114. package/dist/src/typechecker/index.js +198 -13
  115. package/dist/src/types/mc-version.d.ts +24 -0
  116. package/dist/src/types/mc-version.js +49 -0
  117. package/docs/ROADMAP.md +395 -0
  118. package/docs/compiler-pipeline-redesign.md +27 -10
  119. package/editors/vscode/out/extension.js +25176 -8000
  120. package/editors/vscode/package-lock.json +90 -6
  121. package/editors/vscode/package.json +3 -2
  122. package/editors/vscode/src/extension.ts +97 -67
  123. package/examples/showcase.mcrs +3 -3
  124. package/jest.config.js +1 -1
  125. package/package.json +9 -3
  126. package/src/__tests__/budget.test.ts +297 -0
  127. package/src/__tests__/diagnostics.test.ts +2 -3
  128. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  129. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  130. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  131. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  132. package/src/__tests__/enum.test.ts +425 -0
  133. package/src/__tests__/generics.test.ts +390 -0
  134. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  135. package/src/__tests__/incremental.test.ts +337 -0
  136. package/src/__tests__/lsp.test.ts +270 -0
  137. package/src/__tests__/mc-version.test.ts +178 -0
  138. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  139. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  140. package/src/__tests__/modules.test.ts +365 -0
  141. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  142. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  143. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  144. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  145. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  146. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  147. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  148. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  149. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  150. package/src/__tests__/option.test.ts +299 -0
  151. package/src/__tests__/schedule.test.ts +105 -0
  152. package/src/__tests__/sourcemap.test.ts +254 -0
  153. package/src/__tests__/tuple.test.ts +220 -0
  154. package/src/__tests__/typechecker-strict.test.ts +216 -0
  155. package/src/ast/types.ts +33 -2
  156. package/src/cache/deps.ts +132 -0
  157. package/src/cache/incremental.ts +173 -0
  158. package/src/cache/index.ts +135 -0
  159. package/src/cli.ts +88 -45
  160. package/src/compile.ts +2 -2
  161. package/src/diagnostics/index.ts +8 -11
  162. package/src/emit/compile.ts +177 -0
  163. package/{src2 → src}/emit/index.ts +72 -8
  164. package/src/emit/modules.ts +581 -0
  165. package/src/emit/sourcemap.ts +101 -0
  166. package/{src2 → src}/hir/lower.ts +29 -2
  167. package/src/hir/monomorphize.ts +416 -0
  168. package/{src2 → src}/hir/types.ts +15 -3
  169. package/src/index.ts +29 -10
  170. package/src/lexer/index.ts +2 -1
  171. package/src/lir/budget.ts +321 -0
  172. package/{src2 → src}/lir/lower.ts +32 -1
  173. package/{src2 → src}/lir/types.ts +7 -3
  174. package/src/lsp/main.ts +9 -0
  175. package/src/lsp/server.ts +414 -0
  176. package/{src2 → src}/mir/lower.ts +251 -8
  177. package/{src2 → src}/mir/types.ts +12 -1
  178. package/src/optimizer/coroutine.ts +996 -0
  179. package/{src2 → src}/optimizer/dce.ts +2 -1
  180. package/src/optimizer/interprocedural.ts +177 -0
  181. package/src/optimizer/lir/const_imm.ts +143 -0
  182. package/src/optimizer/lir/dead_slot.ts +123 -0
  183. package/src/optimizer/lir/peephole.ts +57 -0
  184. package/src/optimizer/lir/pipeline.ts +37 -0
  185. package/src/optimizer/nbt-batch.ts +50 -0
  186. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  187. package/src/optimizer/selector-cache.ts +103 -0
  188. package/src/optimizer/unroll.ts +386 -0
  189. package/src/parser/index.ts +212 -15
  190. package/src/repl.ts +1 -1
  191. package/src/stdlib/math.mcrs +4 -4
  192. package/src/templates/quest.mcrs +4 -4
  193. package/src/typechecker/index.ts +215 -15
  194. package/src/types/mc-version.ts +46 -0
  195. package/tsconfig.json +1 -1
  196. package/.claude/commands/build-test.md +0 -10
  197. package/.claude/commands/deploy-demo.md +0 -12
  198. package/.claude/commands/stage-status.md +0 -13
  199. package/.claude/settings.json +0 -12
  200. package/CLAUDE.md +0 -231
  201. package/dist/__tests__/cli.test.js +0 -278
  202. package/dist/__tests__/codegen.test.js +0 -152
  203. package/dist/__tests__/compile-all.test.d.ts +0 -10
  204. package/dist/__tests__/compile-all.test.js +0 -108
  205. package/dist/__tests__/dce.test.js +0 -138
  206. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  207. package/dist/__tests__/diagnostics.test.js +0 -149
  208. package/dist/__tests__/e2e.test.d.ts +0 -6
  209. package/dist/__tests__/e2e.test.js +0 -1847
  210. package/dist/__tests__/entity-types.test.js +0 -203
  211. package/dist/__tests__/formatter.test.js +0 -40
  212. package/dist/__tests__/lexer.test.js +0 -343
  213. package/dist/__tests__/lowering.test.js +0 -1015
  214. package/dist/__tests__/macro.test.d.ts +0 -8
  215. package/dist/__tests__/macro.test.js +0 -305
  216. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  217. package/dist/__tests__/mc-integration.test.js +0 -819
  218. package/dist/__tests__/mc-syntax.test.js +0 -124
  219. package/dist/__tests__/nbt.test.js +0 -82
  220. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  221. package/dist/__tests__/optimizer.test.d.ts +0 -1
  222. package/dist/__tests__/optimizer.test.js +0 -149
  223. package/dist/__tests__/parser.test.d.ts +0 -1
  224. package/dist/__tests__/parser.test.js +0 -807
  225. package/dist/__tests__/repl.test.d.ts +0 -1
  226. package/dist/__tests__/repl.test.js +0 -27
  227. package/dist/__tests__/runtime.test.d.ts +0 -1
  228. package/dist/__tests__/runtime.test.js +0 -289
  229. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  230. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  231. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  232. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  233. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  234. package/dist/__tests__/stdlib-math.test.js +0 -352
  235. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  236. package/dist/__tests__/stdlib-vec.test.js +0 -264
  237. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  238. package/dist/__tests__/structure-optimizer.test.js +0 -33
  239. package/dist/__tests__/typechecker.test.d.ts +0 -1
  240. package/dist/__tests__/typechecker.test.js +0 -552
  241. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  242. package/dist/__tests__/var-allocator.test.js +0 -69
  243. package/dist/ast/types.d.ts +0 -514
  244. package/dist/ast/types.js +0 -9
  245. package/dist/builtins/metadata.d.ts +0 -36
  246. package/dist/builtins/metadata.js +0 -1014
  247. package/dist/cli.d.ts +0 -11
  248. package/dist/codegen/cmdblock/index.d.ts +0 -26
  249. package/dist/codegen/cmdblock/index.js +0 -45
  250. package/dist/codegen/mcfunction/index.d.ts +0 -40
  251. package/dist/codegen/mcfunction/index.js +0 -606
  252. package/dist/codegen/structure/index.d.ts +0 -24
  253. package/dist/codegen/structure/index.js +0 -279
  254. package/dist/codegen/var-allocator.d.ts +0 -45
  255. package/dist/codegen/var-allocator.js +0 -104
  256. package/dist/compile.d.ts +0 -68
  257. package/dist/data/arena/function/__load.mcfunction +0 -6
  258. package/dist/data/arena/function/__tick.mcfunction +0 -2
  259. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  260. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  261. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  262. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  263. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  264. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  265. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  266. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  267. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  268. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  269. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  270. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  271. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  272. package/dist/data/counter/function/__load.mcfunction +0 -5
  273. package/dist/data/counter/function/__tick.mcfunction +0 -2
  274. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  275. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  276. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  277. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  278. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  279. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  280. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  281. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  282. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  283. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  284. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  285. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  286. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  287. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  288. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  289. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  290. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  291. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  292. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  293. package/dist/data/gcd3/function/test.mcfunction +0 -7
  294. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  295. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  296. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  297. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  298. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  299. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  300. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  301. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  302. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  303. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  304. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  305. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  306. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  307. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  308. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  309. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  310. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  311. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  312. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  313. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  314. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  315. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  316. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  317. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  318. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  319. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  320. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  321. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  322. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  323. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  324. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  325. package/dist/data/mathtest/function/test.mcfunction +0 -5
  326. package/dist/data/minecraft/tags/function/load.json +0 -5
  327. package/dist/data/minecraft/tags/function/tick.json +0 -5
  328. package/dist/data/mypack/function/__load.mcfunction +0 -13
  329. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  330. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  331. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  332. package/dist/data/mypack/function/abs.mcfunction +0 -6
  333. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  334. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  335. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  336. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  337. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  338. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  339. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  340. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  341. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  342. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  343. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  346. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  347. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  348. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  352. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  353. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  354. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  357. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  358. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  359. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  360. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  361. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  365. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  366. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  367. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  368. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  369. package/dist/data/quiz/function/__load.mcfunction +0 -16
  370. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  371. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  372. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  373. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  374. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  375. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  376. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  377. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  378. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  379. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  380. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  381. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  382. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  383. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  384. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  386. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  387. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  388. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  389. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  390. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  391. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  392. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  393. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  394. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  395. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  396. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  397. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  398. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  399. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  400. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  402. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  403. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  404. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  405. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  406. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  407. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  408. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  409. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  410. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  411. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  412. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  413. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  414. package/dist/data/runtime/function/__load.mcfunction +0 -5
  415. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  416. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  417. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  418. package/dist/data/shop/function/__load.mcfunction +0 -7
  419. package/dist/data/shop/function/__tick.mcfunction +0 -3
  420. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  421. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  422. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  423. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  424. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  425. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  426. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  427. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  429. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  430. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  431. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  432. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  433. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  434. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  435. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  436. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  437. package/dist/data/turret/function/__load.mcfunction +0 -5
  438. package/dist/data/turret/function/__tick.mcfunction +0 -4
  439. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  440. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  441. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  442. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  443. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  444. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  445. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  446. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  447. package/dist/diagnostics/index.d.ts +0 -44
  448. package/dist/diagnostics/index.js +0 -140
  449. package/dist/events/types.d.ts +0 -35
  450. package/dist/events/types.js +0 -59
  451. package/dist/formatter/index.d.ts +0 -1
  452. package/dist/formatter/index.js +0 -26
  453. package/dist/gcd2.map.json +0 -15
  454. package/dist/gcd3.map.json +0 -17
  455. package/dist/gcd_test.map.json +0 -15
  456. package/dist/index.d.ts +0 -62
  457. package/dist/ir/builder.d.ts +0 -33
  458. package/dist/ir/builder.js +0 -99
  459. package/dist/ir/types.d.ts +0 -132
  460. package/dist/ir/types.js +0 -15
  461. package/dist/isqrttest.map.json +0 -15
  462. package/dist/lexer/index.d.ts +0 -37
  463. package/dist/lexer/index.js +0 -569
  464. package/dist/lowering/index.d.ts +0 -188
  465. package/dist/lowering/index.js +0 -3405
  466. package/dist/mathtest.map.json +0 -6
  467. package/dist/mc-test/client.d.ts +0 -128
  468. package/dist/mc-test/client.js +0 -174
  469. package/dist/mc-test/runner.d.ts +0 -28
  470. package/dist/mc-test/runner.js +0 -150
  471. package/dist/mc-test/setup.d.ts +0 -11
  472. package/dist/mc-test/setup.js +0 -98
  473. package/dist/mc-validator/index.d.ts +0 -17
  474. package/dist/mc-validator/index.js +0 -322
  475. package/dist/mypack.map.json +0 -27
  476. package/dist/nbt/index.d.ts +0 -86
  477. package/dist/nbt/index.js +0 -250
  478. package/dist/optimizer/commands.d.ts +0 -38
  479. package/dist/optimizer/commands.js +0 -451
  480. package/dist/optimizer/dce.d.ts +0 -34
  481. package/dist/optimizer/dce.js +0 -639
  482. package/dist/optimizer/passes.d.ts +0 -34
  483. package/dist/optimizer/passes.js +0 -243
  484. package/dist/optimizer/structure.d.ts +0 -9
  485. package/dist/optimizer/structure.js +0 -356
  486. package/dist/pack.mcmeta +0 -6
  487. package/dist/parser/index.d.ts +0 -93
  488. package/dist/parser/index.js +0 -1687
  489. package/dist/repl.d.ts +0 -16
  490. package/dist/repl.js +0 -165
  491. package/dist/reqtest.map.json +0 -4
  492. package/dist/reqtest2.map.json +0 -4
  493. package/dist/runtime/index.d.ts +0 -107
  494. package/dist/runtime/index.js +0 -1409
  495. package/dist/runtime.map.json +0 -7
  496. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  497. package/dist/src/__tests__/codegen.test.js +0 -152
  498. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  499. package/dist/src/__tests__/e2e.test.js +0 -1789
  500. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  501. package/dist/src/__tests__/entity-types.test.js +0 -203
  502. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  503. package/dist/src/__tests__/lowering.test.js +0 -1015
  504. package/dist/src/__tests__/macro.test.d.ts +0 -8
  505. package/dist/src/__tests__/macro.test.js +0 -306
  506. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  507. package/dist/src/__tests__/nbt.test.js +0 -82
  508. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  509. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  510. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  511. package/dist/src/__tests__/optimizer.test.js +0 -149
  512. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  513. package/dist/src/__tests__/runtime.test.js +0 -289
  514. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  515. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  516. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  517. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  518. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  519. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  520. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  521. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  522. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  523. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  524. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  525. package/dist/src/__tests__/var-allocator.test.js +0 -69
  526. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  527. package/dist/src/codegen/cmdblock/index.js +0 -45
  528. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  529. package/dist/src/codegen/mcfunction/index.js +0 -606
  530. package/dist/src/codegen/structure/index.d.ts +0 -24
  531. package/dist/src/codegen/structure/index.js +0 -279
  532. package/dist/src/codegen/var-allocator.d.ts +0 -45
  533. package/dist/src/codegen/var-allocator.js +0 -104
  534. package/dist/src/ir/builder.d.ts +0 -33
  535. package/dist/src/ir/builder.js +0 -99
  536. package/dist/src/ir/types.d.ts +0 -132
  537. package/dist/src/ir/types.js +0 -15
  538. package/dist/src/lowering/index.d.ts +0 -188
  539. package/dist/src/lowering/index.js +0 -3405
  540. package/dist/src/optimizer/commands.d.ts +0 -38
  541. package/dist/src/optimizer/commands.js +0 -451
  542. package/dist/src/optimizer/passes.d.ts +0 -34
  543. package/dist/src/optimizer/passes.js +0 -243
  544. package/dist/src/optimizer/structure.d.ts +0 -9
  545. package/dist/src/optimizer/structure.js +0 -356
  546. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  547. package/dist/src2/emit/compile.d.ts +0 -19
  548. package/dist/src2/emit/compile.js +0 -80
  549. package/dist/src2/optimizer/dce.d.ts +0 -8
  550. package/dist/src2/optimizer/dce.js +0 -155
  551. package/dist/swap_test.map.json +0 -14
  552. package/dist/tsconfig.tsbuildinfo +0 -1
  553. package/dist/typechecker/index.d.ts +0 -61
  554. package/dist/typechecker/index.js +0 -1034
  555. package/dist/types/entity-hierarchy.d.ts +0 -29
  556. package/dist/types/entity-hierarchy.js +0 -107
  557. package/src2/emit/compile.ts +0 -99
  558. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  559. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  560. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  561. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  562. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  563. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  564. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  565. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  566. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  567. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  568. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  569. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  570. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  571. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  572. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  576. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  578. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  579. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  580. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  581. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  582. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  583. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  584. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  585. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  586. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  587. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  588. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  589. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  590. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  592. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  593. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  594. /package/dist/{src2 → src}/hir/types.js +0 -0
  595. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  596. /package/dist/{src2 → src}/lir/types.js +0 -0
  597. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  598. /package/dist/{src2 → src}/lir/verify.js +0 -0
  599. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  600. /package/dist/{src2 → src}/mir/macro.js +0 -0
  601. /package/dist/{src2 → src}/mir/types.js +0 -0
  602. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  603. /package/dist/{src2 → src}/mir/verify.js +0 -0
  604. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  605. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  606. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  607. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  608. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  609. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  610. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  611. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  612. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  613. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  614. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  615. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  616. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  617. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  618. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  619. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  620. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  621. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  622. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  623. /package/{src2 → src}/lir/verify.ts +0 -0
  624. /package/{src2 → src}/mir/macro.ts +0 -0
  625. /package/{src2 → src}/mir/verify.ts +0 -0
  626. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  627. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  628. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  629. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Interprocedural Constant Propagation — MIR module-level optimization pass.
3
+ *
4
+ * For each call site where all arguments are compile-time constants, creates
5
+ * a specialized clone of the callee with the parameters substituted as
6
+ * constants, then runs constant folding on the clone.
7
+ *
8
+ * Specialized function naming: `original__const_N1_N2_...` where N1, N2 are
9
+ * the constant argument values.
10
+ *
11
+ * This pass iterates to fixpoint to handle transitively specialized callees.
12
+ */
13
+ import type { MIRModule } from '../mir/types';
14
+ export declare function interproceduralConstProp(mod: MIRModule): MIRModule;
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /**
3
+ * Interprocedural Constant Propagation — MIR module-level optimization pass.
4
+ *
5
+ * For each call site where all arguments are compile-time constants, creates
6
+ * a specialized clone of the callee with the parameters substituted as
7
+ * constants, then runs constant folding on the clone.
8
+ *
9
+ * Specialized function naming: `original__const_N1_N2_...` where N1, N2 are
10
+ * the constant argument values.
11
+ *
12
+ * This pass iterates to fixpoint to handle transitively specialized callees.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.interproceduralConstProp = interproceduralConstProp;
16
+ const constant_fold_1 = require("./constant_fold");
17
+ function interproceduralConstProp(mod) {
18
+ let current = mod;
19
+ // Iterate to fixpoint (new specializations may enable further specializations)
20
+ for (let i = 0; i < 10; i++) {
21
+ const next = runOnePass(current);
22
+ if (next.functions.length === current.functions.length &&
23
+ JSON.stringify(next.functions.map(f => f.name)) === JSON.stringify(current.functions.map(f => f.name))) {
24
+ // No new specializations
25
+ return next;
26
+ }
27
+ current = next;
28
+ }
29
+ return current;
30
+ }
31
+ function runOnePass(mod) {
32
+ const fnMap = new Map(mod.functions.map(f => [f.name, f]));
33
+ const newFunctions = [...mod.functions];
34
+ const added = new Set();
35
+ for (const fn of mod.functions) {
36
+ for (const block of fn.blocks) {
37
+ for (const instr of block.instrs) {
38
+ if (instr.kind !== 'call')
39
+ continue;
40
+ if (instr.args.length === 0)
41
+ continue;
42
+ if (!instr.args.every(a => a.kind === 'const'))
43
+ continue;
44
+ const callee = fnMap.get(instr.fn);
45
+ if (!callee)
46
+ continue;
47
+ if (callee.isMacro)
48
+ continue;
49
+ if (callee.name === fn.name)
50
+ continue; // no direct recursion at call site
51
+ if (callee.params.length !== instr.args.length)
52
+ continue;
53
+ // Skip if the callee is self-recursive (would cause infinite specialization)
54
+ if (isSelfRecursive(callee))
55
+ continue;
56
+ // Only specialize single-block (loop-free) functions — loop bodies mutate
57
+ // variables in ways that make constant-param substitution unsafe.
58
+ if (callee.blocks.length > 1)
59
+ continue;
60
+ const constArgs = instr.args;
61
+ const mangledName = mangleName(instr.fn, constArgs.map(a => a.value));
62
+ if (fnMap.has(mangledName) || added.has(mangledName))
63
+ continue;
64
+ // Create specialized clone
65
+ const specialized = specialize(callee, constArgs.map(a => a.value), mangledName);
66
+ newFunctions.push(specialized);
67
+ added.add(mangledName);
68
+ fnMap.set(mangledName, specialized);
69
+ }
70
+ }
71
+ }
72
+ if (added.size === 0)
73
+ return mod;
74
+ // Rewrite call sites to use specialized names
75
+ const updatedFunctions = newFunctions.map(fn => rewriteCallSites(fn, fnMap));
76
+ return { ...mod, functions: updatedFunctions };
77
+ }
78
+ /** Returns true if the function contains a call to itself (direct recursion). */
79
+ function isSelfRecursive(fn) {
80
+ for (const block of fn.blocks) {
81
+ for (const instr of block.instrs) {
82
+ if (instr.kind === 'call' && instr.fn === fn.name)
83
+ return true;
84
+ if (instr.kind === 'call_macro' && instr.fn === fn.name)
85
+ return true;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+ function mangleName(name, args) {
91
+ return `${name}__const_${args.map(v => v < 0 ? `n${Math.abs(v)}` : String(v)).join('_')}`;
92
+ }
93
+ function specialize(fn, args, newName) {
94
+ // Build substitution map: param.name → const operand
95
+ const sub = new Map();
96
+ for (let i = 0; i < fn.params.length; i++) {
97
+ sub.set(fn.params[i].name, { kind: 'const', value: args[i] });
98
+ }
99
+ const newBlocks = fn.blocks.map(block => substituteBlock(block, sub));
100
+ const specialized = {
101
+ ...fn,
102
+ name: newName,
103
+ params: [], // no params — all specialized
104
+ blocks: newBlocks,
105
+ isMacro: false,
106
+ };
107
+ // Run constant folding on the specialized function
108
+ return (0, constant_fold_1.constantFold)(specialized);
109
+ }
110
+ function substituteBlock(block, sub) {
111
+ const instrs = block.instrs.map(instr => substituteInstr(instr, sub));
112
+ const term = substituteInstr(block.term, sub);
113
+ return { ...block, instrs, term };
114
+ }
115
+ function substituteOp(op, sub) {
116
+ if (op.kind === 'temp') {
117
+ const replacement = sub.get(op.name);
118
+ if (replacement !== undefined)
119
+ return replacement;
120
+ }
121
+ return op;
122
+ }
123
+ function substituteInstr(instr, sub) {
124
+ switch (instr.kind) {
125
+ case 'copy': return { ...instr, src: substituteOp(instr.src, sub) };
126
+ case 'neg':
127
+ case 'not': return { ...instr, src: substituteOp(instr.src, sub) };
128
+ case 'add':
129
+ case 'sub':
130
+ case 'mul':
131
+ case 'div':
132
+ case 'mod':
133
+ case 'and':
134
+ case 'or':
135
+ return { ...instr, a: substituteOp(instr.a, sub), b: substituteOp(instr.b, sub) };
136
+ case 'cmp':
137
+ return { ...instr, a: substituteOp(instr.a, sub), b: substituteOp(instr.b, sub) };
138
+ case 'nbt_write':
139
+ return { ...instr, src: substituteOp(instr.src, sub) };
140
+ case 'call':
141
+ return { ...instr, args: instr.args.map(a => substituteOp(a, sub)) };
142
+ case 'call_macro':
143
+ return { ...instr, args: instr.args.map(a => ({ ...a, value: substituteOp(a.value, sub) })) };
144
+ case 'branch':
145
+ return { ...instr, cond: substituteOp(instr.cond, sub) };
146
+ case 'return':
147
+ return { ...instr, value: instr.value ? substituteOp(instr.value, sub) : null };
148
+ default:
149
+ return instr;
150
+ }
151
+ }
152
+ function rewriteCallSites(fn, fnMap) {
153
+ return {
154
+ ...fn,
155
+ blocks: fn.blocks.map(block => ({
156
+ ...block,
157
+ instrs: block.instrs.map(instr => {
158
+ if (instr.kind !== 'call')
159
+ return instr;
160
+ if (!instr.args.every(a => a.kind === 'const'))
161
+ return instr;
162
+ const callee = fnMap.get(instr.fn);
163
+ if (!callee)
164
+ return instr;
165
+ if (callee.isMacro)
166
+ return instr;
167
+ if (callee.name === fn.name)
168
+ return instr;
169
+ if (callee.params.length !== instr.args.length)
170
+ return instr;
171
+ const constArgs = instr.args;
172
+ const mangledName = mangleName(instr.fn, constArgs.map(a => a.value));
173
+ if (!fnMap.has(mangledName))
174
+ return instr;
175
+ return { ...instr, fn: mangledName, args: [] };
176
+ }),
177
+ term: (() => {
178
+ const term = block.term;
179
+ if (term.kind !== 'call')
180
+ return term;
181
+ return term;
182
+ })(),
183
+ })),
184
+ };
185
+ }
186
+ //# sourceMappingURL=interprocedural.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Constant Immediate Folding — LIR optimization pass.
3
+ *
4
+ * Peephole: finds score_set($__const_C, C) immediately followed by
5
+ * score_add/score_sub(dst, $__const_C), where $__const_C has no other
6
+ * uses in the function, and replaces the pair with a single
7
+ * `scoreboard players add/remove` raw command.
8
+ *
9
+ * This saves one command per arithmetic-with-constant operation.
10
+ */
11
+ import type { LIRFunction } from '../../lir/types';
12
+ export declare function constImmFold(fn: LIRFunction): LIRFunction;
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * Constant Immediate Folding — LIR optimization pass.
4
+ *
5
+ * Peephole: finds score_set($__const_C, C) immediately followed by
6
+ * score_add/score_sub(dst, $__const_C), where $__const_C has no other
7
+ * uses in the function, and replaces the pair with a single
8
+ * `scoreboard players add/remove` raw command.
9
+ *
10
+ * This saves one command per arithmetic-with-constant operation.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.constImmFold = constImmFold;
14
+ function slotKey(s) {
15
+ return `${s.player}\0${s.obj}`;
16
+ }
17
+ /** Count how many times a slot is used as a source operand. */
18
+ function countSlotUses(instrs, target) {
19
+ let count = 0;
20
+ for (const instr of instrs) {
21
+ for (const s of getReadSlots(instr)) {
22
+ if (slotKey(s) === target)
23
+ count++;
24
+ }
25
+ }
26
+ return count;
27
+ }
28
+ function extractSlotsFromRaw(cmd) {
29
+ const slots = [];
30
+ const re = /(\$[\w.]+)\s+(\S+)/g;
31
+ let m;
32
+ while ((m = re.exec(cmd)) !== null) {
33
+ slots.push({ player: m[1], obj: m[2] });
34
+ }
35
+ return slots;
36
+ }
37
+ function getReadSlots(instr) {
38
+ switch (instr.kind) {
39
+ case 'score_copy': return [instr.src];
40
+ case 'score_add':
41
+ case 'score_sub':
42
+ case 'score_mul':
43
+ case 'score_div':
44
+ case 'score_mod':
45
+ case 'score_min':
46
+ case 'score_max':
47
+ return [instr.src];
48
+ case 'score_swap': return [instr.a, instr.b];
49
+ case 'store_cmd_to_score': return getReadSlots(instr.cmd);
50
+ case 'store_score_to_nbt': return [instr.src];
51
+ case 'return_value': return [instr.slot];
52
+ case 'call_if_matches':
53
+ case 'call_unless_matches':
54
+ return [instr.slot];
55
+ case 'call_if_score':
56
+ case 'call_unless_score':
57
+ return [instr.a, instr.b];
58
+ case 'raw': return extractSlotsFromRaw(instr.cmd);
59
+ case 'macro_line': return extractSlotsFromRaw(instr.template);
60
+ default: return [];
61
+ }
62
+ }
63
+ function constImmFold(fn) {
64
+ const instrs = fn.instructions;
65
+ if (instrs.length < 2)
66
+ return fn;
67
+ // Pre-compute use counts for all const slots
68
+ const useCounts = new Map();
69
+ for (const instr of instrs) {
70
+ for (const s of getReadSlots(instr)) {
71
+ const key = slotKey(s);
72
+ useCounts.set(key, (useCounts.get(key) || 0) + 1);
73
+ }
74
+ }
75
+ const result = [];
76
+ let changed = false;
77
+ let i = 0;
78
+ while (i < instrs.length) {
79
+ const curr = instrs[i];
80
+ const next = instrs[i + 1];
81
+ // Pattern: score_set(constSlot, C) + score_add/sub(dst, constSlot)
82
+ if (next &&
83
+ curr.kind === 'score_set' &&
84
+ curr.dst.player.startsWith('$__const_') &&
85
+ (next.kind === 'score_add' || next.kind === 'score_sub') &&
86
+ slotKey(next.src) === slotKey(curr.dst) &&
87
+ (useCounts.get(slotKey(curr.dst)) || 0) === 1) {
88
+ const C = curr.value;
89
+ const dst = next.dst;
90
+ if (C === 0 && next.kind === 'score_add') {
91
+ // add 0 is a no-op — skip both
92
+ changed = true;
93
+ i += 2;
94
+ continue;
95
+ }
96
+ if (C === 0 && next.kind === 'score_sub') {
97
+ // sub 0 is a no-op — skip both
98
+ changed = true;
99
+ i += 2;
100
+ continue;
101
+ }
102
+ // Determine add vs remove
103
+ let op;
104
+ let val;
105
+ if (next.kind === 'score_add') {
106
+ if (C > 0) {
107
+ op = 'add';
108
+ val = C;
109
+ }
110
+ else {
111
+ op = 'remove';
112
+ val = -C;
113
+ }
114
+ }
115
+ else {
116
+ // score_sub
117
+ if (C > 0) {
118
+ op = 'remove';
119
+ val = C;
120
+ }
121
+ else {
122
+ op = 'add';
123
+ val = -C;
124
+ }
125
+ }
126
+ result.push({
127
+ kind: 'raw',
128
+ cmd: `scoreboard players ${op} ${dst.player} ${dst.obj} ${val}`,
129
+ });
130
+ changed = true;
131
+ i += 2;
132
+ continue;
133
+ }
134
+ result.push(curr);
135
+ i++;
136
+ }
137
+ return changed ? { ...fn, instructions: result } : fn;
138
+ }
139
+ //# sourceMappingURL=const_imm.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Dead Slot Elimination — LIR optimization pass.
3
+ *
4
+ * Removes score_set / score_copy instructions where the destination slot
5
+ * is never read anywhere in the function.
6
+ *
7
+ * Preserves writes to:
8
+ * - $ret (return value)
9
+ * - $p0, $p1, … (parameter passing slots)
10
+ * - slots used in side-effectful instructions (calls, stores, nbt ops, raw)
11
+ */
12
+ import type { LIRFunction, LIRModule } from '../../lir/types';
13
+ export declare function deadSlotElim(fn: LIRFunction): LIRFunction;
14
+ export declare function deadSlotElimModule(mod: LIRModule): LIRModule;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * Dead Slot Elimination — LIR optimization pass.
4
+ *
5
+ * Removes score_set / score_copy instructions where the destination slot
6
+ * is never read anywhere in the function.
7
+ *
8
+ * Preserves writes to:
9
+ * - $ret (return value)
10
+ * - $p0, $p1, … (parameter passing slots)
11
+ * - slots used in side-effectful instructions (calls, stores, nbt ops, raw)
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.deadSlotElim = deadSlotElim;
15
+ exports.deadSlotElimModule = deadSlotElimModule;
16
+ /** Canonical key for a slot (player + obj). */
17
+ function slotKey(s) {
18
+ return `${s.player}\0${s.obj}`;
19
+ }
20
+ /**
21
+ * Extract slot references from a raw MC command string.
22
+ * Matches patterns like `$player_name objective_name` used in scoreboard commands.
23
+ */
24
+ function extractSlotsFromRaw(cmd) {
25
+ const slots = [];
26
+ // Match $<player> <obj> patterns (scoreboard slot references)
27
+ const re = /(\$[\w.]+)\s+(\S+)/g;
28
+ let m;
29
+ while ((m = re.exec(cmd)) !== null) {
30
+ slots.push({ player: m[1], obj: m[2] });
31
+ }
32
+ return slots;
33
+ }
34
+ /** Collect all slots that are *read* (used as source) by an instruction. */
35
+ function getReadSlots(instr) {
36
+ switch (instr.kind) {
37
+ case 'score_copy': return [instr.src];
38
+ case 'score_add':
39
+ case 'score_sub':
40
+ case 'score_mul':
41
+ case 'score_div':
42
+ case 'score_mod':
43
+ case 'score_min':
44
+ case 'score_max':
45
+ return [instr.src];
46
+ case 'score_swap': return [instr.a, instr.b];
47
+ case 'store_cmd_to_score': return getReadSlots(instr.cmd);
48
+ case 'store_score_to_nbt': return [instr.src];
49
+ case 'store_nbt_to_score': return [];
50
+ case 'return_value': return [instr.slot];
51
+ case 'call_if_matches':
52
+ case 'call_unless_matches':
53
+ return [instr.slot];
54
+ case 'call_if_score':
55
+ case 'call_unless_score':
56
+ return [instr.a, instr.b];
57
+ case 'raw': return extractSlotsFromRaw(instr.cmd);
58
+ case 'macro_line': return extractSlotsFromRaw(instr.template);
59
+ default: return [];
60
+ }
61
+ }
62
+ /** Returns the destination slot if the instruction is a pure write (no side effects). */
63
+ function getPureWriteDst(instr) {
64
+ switch (instr.kind) {
65
+ case 'score_set': return instr.dst;
66
+ case 'score_copy': return instr.dst;
67
+ default: return null;
68
+ }
69
+ }
70
+ /** True if a slot should never be eliminated (externally visible). */
71
+ function isProtectedSlot(s) {
72
+ const p = s.player;
73
+ if (p === '$ret' || p.startsWith('$ret_') || /^\$p\d+$/.test(p))
74
+ return true;
75
+ // Option slots: __opt_ prefix ensures they're always written to scoreboard
76
+ // even when the variable appears unused locally
77
+ if (p.includes('__opt_'))
78
+ return true;
79
+ return false;
80
+ }
81
+ function deadSlotElim(fn) {
82
+ // 1. Collect all read slots across the function
83
+ const readSet = new Set();
84
+ for (const instr of fn.instructions) {
85
+ for (const s of getReadSlots(instr)) {
86
+ readSet.add(slotKey(s));
87
+ }
88
+ }
89
+ // 2. Filter out pure writes to slots that are never read
90
+ const filtered = fn.instructions.filter(instr => {
91
+ const dst = getPureWriteDst(instr);
92
+ if (dst === null)
93
+ return true; // not a pure write → keep
94
+ if (isProtectedSlot(dst))
95
+ return true;
96
+ return readSet.has(slotKey(dst));
97
+ });
98
+ if (filtered.length === fn.instructions.length)
99
+ return fn;
100
+ return { ...fn, instructions: filtered };
101
+ }
102
+ function deadSlotElimModule(mod) {
103
+ // Collect all slots read across ALL functions (cross-function visibility)
104
+ const globalReadSet = new Set();
105
+ for (const fn of mod.functions) {
106
+ for (const instr of fn.instructions) {
107
+ for (const s of getReadSlots(instr)) {
108
+ globalReadSet.add(slotKey(s));
109
+ }
110
+ }
111
+ }
112
+ let changed = false;
113
+ const functions = mod.functions.map(fn => {
114
+ const filtered = fn.instructions.filter(instr => {
115
+ const dst = getPureWriteDst(instr);
116
+ if (dst === null)
117
+ return true;
118
+ if (isProtectedSlot(dst))
119
+ return true;
120
+ return globalReadSet.has(slotKey(dst));
121
+ });
122
+ if (filtered.length !== fn.instructions.length)
123
+ changed = true;
124
+ if (filtered.length === fn.instructions.length)
125
+ return fn;
126
+ return { ...fn, instructions: filtered };
127
+ });
128
+ return changed ? { ...mod, functions } : mod;
129
+ }
130
+ //# sourceMappingURL=dead_slot.js.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Execute-Store Peephole Pass — LIR optimization pass.
3
+ *
4
+ * Merges a `call_context` immediately followed by `score_set(dst, value)`
5
+ * into a single `store_cmd_to_score` instruction:
6
+ *
7
+ * execute [subcommands] run function ns:fn ← call_context
8
+ * scoreboard players set $result __ns N ← score_set
9
+ *
10
+ * becomes:
11
+ *
12
+ * execute store result score $result __ns [subcommands] run function ns:fn
13
+ *
14
+ * This saves one command when the caller only needs to know whether the
15
+ * execute chain ran (success = 1) or to capture the function's return value.
16
+ *
17
+ * Safety: only merges when the two instructions are immediately adjacent
18
+ * (no instructions between them).
19
+ */
20
+ import type { LIRFunction } from '../../lir/types';
21
+ export declare function execStorePeephole(fn: LIRFunction): LIRFunction;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * Execute-Store Peephole Pass — LIR optimization pass.
4
+ *
5
+ * Merges a `call_context` immediately followed by `score_set(dst, value)`
6
+ * into a single `store_cmd_to_score` instruction:
7
+ *
8
+ * execute [subcommands] run function ns:fn ← call_context
9
+ * scoreboard players set $result __ns N ← score_set
10
+ *
11
+ * becomes:
12
+ *
13
+ * execute store result score $result __ns [subcommands] run function ns:fn
14
+ *
15
+ * This saves one command when the caller only needs to know whether the
16
+ * execute chain ran (success = 1) or to capture the function's return value.
17
+ *
18
+ * Safety: only merges when the two instructions are immediately adjacent
19
+ * (no instructions between them).
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.execStorePeephole = execStorePeephole;
23
+ function execStorePeephole(fn) {
24
+ const instrs = fn.instructions;
25
+ if (instrs.length < 2)
26
+ return fn;
27
+ const result = [];
28
+ let changed = false;
29
+ let i = 0;
30
+ while (i < instrs.length) {
31
+ const curr = instrs[i];
32
+ const next = instrs[i + 1];
33
+ // Pattern: call_context immediately followed by score_set
34
+ if (next &&
35
+ curr.kind === 'call_context' &&
36
+ next.kind === 'score_set') {
37
+ // Merge: execute store result score <dst> [subcommands] run function <fn>
38
+ result.push({
39
+ kind: 'store_cmd_to_score',
40
+ dst: next.dst,
41
+ cmd: curr,
42
+ });
43
+ changed = true;
44
+ i += 2;
45
+ continue;
46
+ }
47
+ result.push(curr);
48
+ i++;
49
+ }
50
+ return changed ? { ...fn, instructions: result } : fn;
51
+ }
52
+ //# sourceMappingURL=peephole.js.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * LIR Optimization Pipeline — runs all LIR passes on a module.
3
+ *
4
+ * Pass order: dead_slot → const_imm
5
+ * Dead slot runs first to remove unused writes, exposing more
6
+ * single-use const slots for const_imm to fold.
7
+ */
8
+ import type { LIRFunction, LIRModule } from '../../lir/types';
9
+ export type LIRPass = (fn: LIRFunction) => LIRFunction;
10
+ export declare function lirOptimizeModule(mod: LIRModule): LIRModule;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /**
3
+ * LIR Optimization Pipeline — runs all LIR passes on a module.
4
+ *
5
+ * Pass order: dead_slot → const_imm
6
+ * Dead slot runs first to remove unused writes, exposing more
7
+ * single-use const slots for const_imm to fold.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.lirOptimizeModule = lirOptimizeModule;
11
+ const dead_slot_1 = require("./dead_slot");
12
+ const const_imm_1 = require("./const_imm");
13
+ const peephole_1 = require("./peephole");
14
+ const perFunctionPasses = [
15
+ peephole_1.execStorePeephole,
16
+ const_imm_1.constImmFold,
17
+ ];
18
+ function lirOptimizeModule(mod) {
19
+ // Module-level pass: dead slot elimination (cross-function analysis)
20
+ let result = (0, dead_slot_1.deadSlotElimModule)(mod);
21
+ // Per-function passes
22
+ let changed = false;
23
+ const functions = result.functions.map(fn => {
24
+ let current = fn;
25
+ for (const pass of perFunctionPasses) {
26
+ current = pass(current);
27
+ }
28
+ if (current !== fn)
29
+ changed = true;
30
+ return current;
31
+ });
32
+ return changed ? { ...result, functions } : result;
33
+ }
34
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * NBT Batch Read — MIR optimization pass.
3
+ *
4
+ * Eliminates redundant nbt_read instructions within a basic block:
5
+ * if the same (ns, path, scale) is read twice with no intervening nbt_write
6
+ * to that ns, the second read is replaced with a copy from the first read's dst.
7
+ *
8
+ * This reduces expensive `data get` commands in generated .mcfunction files.
9
+ */
10
+ import type { MIRFunction } from '../mir/types';
11
+ export declare function nbtBatchRead(fn: MIRFunction): MIRFunction;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * NBT Batch Read — MIR optimization pass.
4
+ *
5
+ * Eliminates redundant nbt_read instructions within a basic block:
6
+ * if the same (ns, path, scale) is read twice with no intervening nbt_write
7
+ * to that ns, the second read is replaced with a copy from the first read's dst.
8
+ *
9
+ * This reduces expensive `data get` commands in generated .mcfunction files.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.nbtBatchRead = nbtBatchRead;
13
+ function nbtBatchRead(fn) {
14
+ return {
15
+ ...fn,
16
+ blocks: fn.blocks.map(deduplicateBlock),
17
+ };
18
+ }
19
+ function deduplicateBlock(block) {
20
+ // Map from "ns\0path\0scale" → dst temp of the first read
21
+ const cache = new Map();
22
+ const instrs = [];
23
+ for (const instr of block.instrs) {
24
+ if (instr.kind === 'nbt_read') {
25
+ const key = `${instr.ns}\0${instr.path}\0${instr.scale}`;
26
+ const cached = cache.get(key);
27
+ if (cached !== undefined) {
28
+ // Replace with copy from cached temp
29
+ instrs.push({ kind: 'copy', dst: instr.dst, src: { kind: 'temp', name: cached } });
30
+ }
31
+ else {
32
+ cache.set(key, instr.dst);
33
+ instrs.push(instr);
34
+ }
35
+ }
36
+ else if (instr.kind === 'nbt_write') {
37
+ // Invalidate all cached reads for this ns
38
+ for (const key of [...cache.keys()]) {
39
+ if (key.startsWith(instr.ns + '\0')) {
40
+ cache.delete(key);
41
+ }
42
+ }
43
+ instrs.push(instr);
44
+ }
45
+ else {
46
+ instrs.push(instr);
47
+ }
48
+ }
49
+ return { ...block, instrs };
50
+ }
51
+ //# sourceMappingURL=nbt-batch.js.map