superacli 1.1.5 → 1.1.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 (1081) hide show
  1. package/README.md +77 -53
  2. package/__tests__/azd-plugin.test.js +109 -0
  3. package/__tests__/config.test.js +4 -3
  4. package/__tests__/discover.test.js +59 -0
  5. package/__tests__/goose-plugin.test.js +149 -0
  6. package/__tests__/help-json.test.js +2 -0
  7. package/__tests__/openhands-plugin.test.js +106 -0
  8. package/__tests__/plugin-cocoindex-code-uninstall.test.js +19 -0
  9. package/__tests__/plugin-cocoindex-code.test.js +37 -0
  10. package/__tests__/plugin-install-guidance.test.js +81 -0
  11. package/__tests__/plugins-registry.test.js +44 -0
  12. package/__tests__/plugins-store.test.js +40 -5
  13. package/__tests__/process-adapter.test.js +50 -1
  14. package/__tests__/resend-plugin.test.js +22 -1
  15. package/__tests__/server-app.test.js +1 -0
  16. package/__tests__/server-routes-commands.test.js +20 -2
  17. package/__tests__/server-routes-plugins.test.js +130 -0
  18. package/__tests__/skills.test.js +26 -0
  19. package/__tests__/squirrelscan-plugin.test.js +129 -0
  20. package/__tests__/uipath-plugin.test.js +104 -0
  21. package/__tests__/uipathcli-plugin.test.js +95 -0
  22. package/cli/adapters/mcp.js +2 -0
  23. package/cli/adapters/process.js +49 -2
  24. package/cli/config.js +240 -3
  25. package/cli/discover.js +157 -0
  26. package/cli/help-json.js +16 -1
  27. package/cli/plugin-install-guidance.js +92 -37
  28. package/cli/plugins-manager.js +1 -0
  29. package/cli/plugins-registry.js +74 -8
  30. package/cli/plugins-store.js +78 -17
  31. package/cli/skills-mcp.js +1 -1
  32. package/cli/skills.js +39 -2
  33. package/cli/supercli.js +87 -11
  34. package/docs/feature-gaps.md +8 -8
  35. package/docs/features/azd-uipath-plugins.md +43 -0
  36. package/docs/features/server-plugins.md +62 -0
  37. package/docs/features/skills.md +9 -5
  38. package/docs/{supported-harnesses.md → plugins-available.md} +4 -3
  39. package/docs/{plugin-harness-guide.md → plugins-how-to.md} +1 -1
  40. package/docs/plugins.md +26 -20
  41. package/docs/server-plugins-usage-guide.md +182 -0
  42. package/docs/skills-catalog.md +12 -10
  43. package/package.json +1 -1
  44. package/plugins/agent-browser/README.md +69 -0
  45. package/plugins/agent-browser/plugin.json +111 -0
  46. package/plugins/agent-browser/skills/quickstart/SKILL.md +66 -0
  47. package/plugins/aider/README.md +53 -0
  48. package/plugins/aider/plugin.json +105 -0
  49. package/plugins/aider/scripts/aider-wrapper.js +243 -0
  50. package/plugins/aider/scripts/setup-aider.js +37 -0
  51. package/plugins/aider/skills/dry-run-review.md +24 -0
  52. package/plugins/aider/skills/model-and-provider.md +24 -0
  53. package/plugins/aider/skills/one-shot-edits.md +30 -0
  54. package/plugins/aider/skills/quickstart/SKILL.md +51 -0
  55. package/plugins/azd/README.md +28 -0
  56. package/plugins/azd/plugin.json +87 -0
  57. package/plugins/azd/skills/quickstart/SKILL.md +41 -0
  58. package/plugins/blogwatcher/README.md +3 -3
  59. package/plugins/boxlite/Dockerfile +9 -0
  60. package/plugins/boxlite/README.md +62 -0
  61. package/plugins/boxlite/plugin.json +201 -0
  62. package/plugins/boxlite/scripts/run-boxlite.js +106 -0
  63. package/plugins/boxlite/skills/quickstart/SKILL.md +40 -0
  64. package/plugins/cass/plugin.json +150 -0
  65. package/plugins/cass/scripts/setup-cass.js +47 -0
  66. package/plugins/cass/skills/quickstart/SKILL.md +46 -0
  67. package/plugins/clever/README.md +46 -0
  68. package/plugins/clever/plugin.json +119 -0
  69. package/plugins/clever/scripts/setup-clever.js +28 -0
  70. package/plugins/clever/skills/auth-and-profile.md +29 -0
  71. package/plugins/clever/skills/passthrough-safety.md +21 -0
  72. package/plugins/clever/skills/quickstart/SKILL.md +45 -0
  73. package/plugins/clever/skills/resource-inventory.md +24 -0
  74. package/plugins/clix/README.md +4 -4
  75. package/plugins/cocoindex-code/README.md +64 -0
  76. package/plugins/cocoindex-code/plugin.json +81 -0
  77. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-310.pyc +0 -0
  78. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-311.pyc +0 -0
  79. package/plugins/cocoindex-code/scripts/post-install.js +61 -0
  80. package/plugins/cocoindex-code/scripts/post-uninstall.js +25 -0
  81. package/plugins/cocoindex-code/scripts/query.py +88 -0
  82. package/plugins/cocoindex-code/scripts/run-query.js +50 -0
  83. package/plugins/cocoindex-code/skills/quickstart/SKILL.md +73 -0
  84. package/plugins/copilot/README.md +24 -0
  85. package/plugins/copilot/plugin.json +80 -0
  86. package/plugins/copilot/skills/quickstart/SKILL.md +44 -0
  87. package/plugins/gemini/README.md +24 -0
  88. package/plugins/gemini/plugin.json +98 -0
  89. package/plugins/gemini/skills/quickstart/SKILL.md +44 -0
  90. package/plugins/gifcap/plugin.json +119 -0
  91. package/plugins/gifcap/scripts/setup-gifcap.js +44 -0
  92. package/plugins/gifcap/skills/quickstart/SKILL.md +34 -0
  93. package/plugins/gifcap/test-record-quiet.gif +0 -0
  94. package/plugins/gifcap/test-record.gif +0 -0
  95. package/plugins/goose/README.md +36 -0
  96. package/plugins/goose/plugin.json +183 -0
  97. package/plugins/goose/skills/quickstart/SKILL.md +44 -0
  98. package/plugins/json-server/README.md +58 -0
  99. package/plugins/json-server/plugin.json +113 -0
  100. package/plugins/json-server/skills/quickstart/SKILL.md +57 -0
  101. package/plugins/lightpanda/README.md +145 -0
  102. package/plugins/lightpanda/package-lock.json +1375 -0
  103. package/plugins/lightpanda/package.json +12 -0
  104. package/plugins/lightpanda/plugin.json +116 -0
  105. package/plugins/lightpanda/scripts/lightpanda-contacts.js +494 -0
  106. package/plugins/lightpanda/scripts/lightpanda-generic-extract.js +403 -0
  107. package/plugins/lightpanda/scripts/lightpanda-wrapper.js +480 -0
  108. package/plugins/lightpanda/scripts/setup-lightpanda.js +39 -0
  109. package/plugins/lightpanda/skills/contact-discovery.md +51 -0
  110. package/plugins/lightpanda/skills/generic-extraction.md +66 -0
  111. package/plugins/lightpanda/skills/quickstart/SKILL.md +103 -0
  112. package/plugins/lightpanda/skills/resilient-navigation.md +42 -0
  113. package/plugins/monty/README.md +2 -2
  114. package/plugins/nullclaw/README.md +3 -3
  115. package/plugins/offline-ai/README.md +23 -0
  116. package/plugins/offline-ai/plugin.json +82 -0
  117. package/plugins/offline-ai/skills/quickstart/SKILL.md +43 -0
  118. package/plugins/openhands/README.md +25 -0
  119. package/plugins/openhands/plugin.json +116 -0
  120. package/plugins/openhands/skills/quickstart/SKILL.md +26 -0
  121. package/plugins/plandex/README.md +25 -0
  122. package/plugins/plandex/plugin.json +130 -0
  123. package/plugins/plandex/skills/quickstart/SKILL.md +50 -0
  124. package/plugins/plugins.json +190 -2
  125. package/plugins/resend/plugin.json +279 -2
  126. package/plugins/resend/skills/quickstart/SKILL.md +32 -13
  127. package/plugins/squirrelscan/Dockerfile +5 -0
  128. package/plugins/squirrelscan/README.md +47 -0
  129. package/plugins/squirrelscan/plugin.json +493 -0
  130. package/plugins/squirrelscan/scripts/post-install.js +33 -0
  131. package/plugins/squirrelscan/scripts/post-uninstall.js +25 -0
  132. package/plugins/squirrelscan/scripts/run-squirrel.js +73 -0
  133. package/plugins/squirrelscan/skills/audit-workflow/SKILL.md +33 -0
  134. package/plugins/squirrelscan/skills/publish-report/SKILL.md +33 -0
  135. package/plugins/squirrelscan/skills/quickstart/SKILL.md +41 -0
  136. package/plugins/uipath/README.md +27 -0
  137. package/plugins/uipath/plugin.json +86 -0
  138. package/plugins/uipath/skills/quickstart/SKILL.md +47 -0
  139. package/plugins/uipathcli/README.md +28 -0
  140. package/plugins/uipathcli/plugin.json +120 -0
  141. package/plugins/uipathcli/scripts/run-uipath-cli.js +49 -0
  142. package/plugins/uipathcli/skills/quickstart/SKILL.md +22 -0
  143. package/plugins/xurl/README.md +4 -4
  144. package/server/app.js +5 -2
  145. package/server/public/app.js +3 -0
  146. package/server/routes/commands.js +95 -12
  147. package/server/routes/plugins.js +262 -0
  148. package/server/services/pluginsService.js +303 -0
  149. package/server/views/command-edit.ejs +196 -14
  150. package/server/views/partials/head.ejs +1 -0
  151. package/server/views/plugins.ejs +264 -0
  152. package/tests/test-plugins-registry.js +30 -0
  153. package/tests/test-resend-smoke.sh +7 -3
  154. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +0 -20
  155. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +0 -1
  156. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +0 -21
  157. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +0 -1
  158. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +0 -22
  159. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +0 -1
  160. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +0 -23
  161. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +0 -1
  162. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +0 -24
  163. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +0 -1
  164. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +0 -24
  165. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +0 -1
  166. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +0 -24
  167. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +0 -1
  168. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +0 -24
  169. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +0 -1
  170. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +0 -24
  171. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +0 -1
  172. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +0 -24
  173. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +0 -1
  174. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +0 -24
  175. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +0 -1
  176. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +0 -24
  177. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +0 -1
  178. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +0 -24
  179. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +0 -1
  180. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +0 -25
  181. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +0 -1
  182. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +0 -25
  183. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +0 -1
  184. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +0 -25
  185. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +0 -1
  186. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +0 -26
  187. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +0 -1
  188. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +0 -27
  189. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +0 -1
  190. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +0 -28
  191. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +0 -1
  192. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +0 -29
  193. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +0 -1
  194. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +0 -30
  195. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +0 -1
  196. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +0 -31
  197. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +0 -1
  198. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +0 -32
  199. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +0 -1
  200. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +0 -32
  201. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +0 -1
  202. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +0 -32
  203. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +0 -1
  204. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +0 -32
  205. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +0 -1
  206. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +0 -32
  207. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +0 -1
  208. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +0 -32
  209. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +0 -1
  210. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +0 -32
  211. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +0 -1
  212. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +0 -32
  213. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +0 -1
  214. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +0 -32
  215. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +0 -1
  216. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +0 -32
  217. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +0 -1
  218. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +0 -32
  219. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +0 -1
  220. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +0 -32
  221. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +0 -1
  222. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +0 -32
  223. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +0 -1
  224. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +0 -32
  225. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +0 -1
  226. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +0 -33
  227. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +0 -1
  228. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +0 -33
  229. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +0 -1
  230. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +0 -34
  231. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +0 -1
  232. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +0 -34
  233. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +0 -1
  234. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +0 -35
  235. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +0 -1
  236. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +0 -36
  237. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +0 -1
  238. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +0 -37
  239. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +0 -1
  240. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +0 -38
  241. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +0 -1
  242. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +0 -39
  243. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +0 -1
  244. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +0 -40
  245. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +0 -1
  246. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +0 -41
  247. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +0 -1
  248. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +0 -42
  249. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +0 -1
  250. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +0 -43
  251. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +0 -1
  252. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +0 -44
  253. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +0 -1
  254. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +0 -45
  255. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +0 -1
  256. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +0 -46
  257. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +0 -1
  258. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +0 -47
  259. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +0 -1
  260. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +0 -48
  261. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +0 -1
  262. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +0 -49
  263. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +0 -1
  264. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +0 -50
  265. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +0 -1
  266. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +0 -51
  267. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +0 -1
  268. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +0 -52
  269. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +0 -1
  270. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +0 -53
  271. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +0 -1
  272. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +0 -54
  273. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +0 -1
  274. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +0 -55
  275. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +0 -1
  276. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +0 -56
  277. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +0 -1
  278. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +0 -57
  279. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +0 -1
  280. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +0 -57
  281. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +0 -1
  282. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +0 -57
  283. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +0 -1
  284. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +0 -57
  285. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +0 -1
  286. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +0 -57
  287. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +0 -1
  288. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +0 -57
  289. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +0 -1
  290. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +0 -57
  291. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +0 -1
  292. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +0 -57
  293. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +0 -1
  294. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +0 -57
  295. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +0 -1
  296. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +0 -57
  297. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +0 -1
  298. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +0 -57
  299. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +0 -1
  300. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +0 -57
  301. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +0 -1
  302. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +0 -57
  303. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +0 -1
  304. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +0 -57
  305. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +0 -1
  306. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +0 -57
  307. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +0 -1
  308. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +0 -57
  309. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +0 -1
  310. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +0 -57
  311. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +0 -1
  312. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +0 -57
  313. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +0 -1
  314. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +0 -57
  315. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +0 -1
  316. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +0 -57
  317. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +0 -1
  318. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +0 -57
  319. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +0 -1
  320. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +0 -57
  321. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +0 -1
  322. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +0 -57
  323. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +0 -1
  324. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +0 -57
  325. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +0 -1
  326. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +0 -57
  327. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +0 -1
  328. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +0 -57
  329. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +0 -1
  330. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +0 -57
  331. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +0 -1
  332. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +0 -57
  333. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +0 -1
  334. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +0 -57
  335. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +0 -1
  336. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +0 -57
  337. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +0 -1
  338. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +0 -58
  339. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +0 -1
  340. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +0 -59
  341. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +0 -1
  342. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +0 -60
  343. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +0 -1
  344. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +0 -60
  345. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +0 -1
  346. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +0 -60
  347. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +0 -1
  348. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +0 -60
  349. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +0 -1
  350. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +0 -60
  351. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +0 -1
  352. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +0 -60
  353. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +0 -1
  354. package/.beads/config.yaml +0 -4
  355. package/.beads/issues.jsonl +0 -60
  356. package/.beads/metadata.json +0 -4
  357. package/docs/mcp-cheatsheet.md +0 -324
  358. package/docs/visual-overview.md +0 -21
  359. package/ref-monty/.cargo/config.toml +0 -3
  360. package/ref-monty/.claude/settings.json +0 -60
  361. package/ref-monty/.claude/skills/fastmod/SKILL.md +0 -22
  362. package/ref-monty/.claude/skills/python-playground/SKILL.md +0 -47
  363. package/ref-monty/.codecov.yml +0 -12
  364. package/ref-monty/.github/actions/build-pgo-wheel/action.yml +0 -72
  365. package/ref-monty/.github/workflows/ci.yml +0 -776
  366. package/ref-monty/.github/workflows/codspeed.yml +0 -45
  367. package/ref-monty/.github/workflows/init-npm-packages.yml +0 -82
  368. package/ref-monty/.pre-commit-config.yaml +0 -47
  369. package/ref-monty/.python-version +0 -1
  370. package/ref-monty/.rustfmt.toml +0 -4
  371. package/ref-monty/.zed/settings.json +0 -11
  372. package/ref-monty/CLAUDE.md +0 -535
  373. package/ref-monty/Cargo.lock +0 -3798
  374. package/ref-monty/Cargo.toml +0 -87
  375. package/ref-monty/LICENSE +0 -21
  376. package/ref-monty/Makefile +0 -216
  377. package/ref-monty/README.md +0 -430
  378. package/ref-monty/RELEASING.md +0 -47
  379. package/ref-monty/crates/fuzz/Cargo.toml +0 -30
  380. package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +0 -37
  381. package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +0 -552
  382. package/ref-monty/crates/monty/Cargo.toml +0 -68
  383. package/ref-monty/crates/monty/benches/main.rs +0 -247
  384. package/ref-monty/crates/monty/build.rs +0 -10
  385. package/ref-monty/crates/monty/src/args.rs +0 -733
  386. package/ref-monty/crates/monty/src/asyncio.rs +0 -179
  387. package/ref-monty/crates/monty/src/builtins/abs.rs +0 -55
  388. package/ref-monty/crates/monty/src/builtins/all.rs +0 -30
  389. package/ref-monty/crates/monty/src/builtins/any.rs +0 -30
  390. package/ref-monty/crates/monty/src/builtins/bin.rs +0 -59
  391. package/ref-monty/crates/monty/src/builtins/chr.rs +0 -46
  392. package/ref-monty/crates/monty/src/builtins/divmod.rs +0 -164
  393. package/ref-monty/crates/monty/src/builtins/enumerate.rs +0 -52
  394. package/ref-monty/crates/monty/src/builtins/filter.rs +0 -67
  395. package/ref-monty/crates/monty/src/builtins/getattr.rs +0 -65
  396. package/ref-monty/crates/monty/src/builtins/hash.rs +0 -28
  397. package/ref-monty/crates/monty/src/builtins/hex.rs +0 -58
  398. package/ref-monty/crates/monty/src/builtins/id.rs +0 -24
  399. package/ref-monty/crates/monty/src/builtins/isinstance.rs +0 -68
  400. package/ref-monty/crates/monty/src/builtins/len.rs +0 -25
  401. package/ref-monty/crates/monty/src/builtins/map.rs +0 -98
  402. package/ref-monty/crates/monty/src/builtins/min_max.rs +0 -113
  403. package/ref-monty/crates/monty/src/builtins/mod.rs +0 -246
  404. package/ref-monty/crates/monty/src/builtins/next.rs +0 -21
  405. package/ref-monty/crates/monty/src/builtins/oct.rs +0 -59
  406. package/ref-monty/crates/monty/src/builtins/ord.rs +0 -67
  407. package/ref-monty/crates/monty/src/builtins/pow.rs +0 -365
  408. package/ref-monty/crates/monty/src/builtins/print.rs +0 -141
  409. package/ref-monty/crates/monty/src/builtins/repr.rs +0 -16
  410. package/ref-monty/crates/monty/src/builtins/reversed.rs +0 -28
  411. package/ref-monty/crates/monty/src/builtins/round.rs +0 -174
  412. package/ref-monty/crates/monty/src/builtins/sorted.rs +0 -151
  413. package/ref-monty/crates/monty/src/builtins/sum.rs +0 -66
  414. package/ref-monty/crates/monty/src/builtins/type_.rs +0 -16
  415. package/ref-monty/crates/monty/src/builtins/zip.rs +0 -77
  416. package/ref-monty/crates/monty/src/bytecode/builder.rs +0 -699
  417. package/ref-monty/crates/monty/src/bytecode/code.rs +0 -310
  418. package/ref-monty/crates/monty/src/bytecode/compiler.rs +0 -3206
  419. package/ref-monty/crates/monty/src/bytecode/mod.rs +0 -24
  420. package/ref-monty/crates/monty/src/bytecode/op.rs +0 -617
  421. package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +0 -1058
  422. package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +0 -63
  423. package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +0 -487
  424. package/ref-monty/crates/monty/src/bytecode/vm/call.rs +0 -767
  425. package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +0 -741
  426. package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +0 -147
  427. package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +0 -297
  428. package/ref-monty/crates/monty/src/bytecode/vm/format.rs +0 -132
  429. package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +0 -1958
  430. package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +0 -620
  431. package/ref-monty/crates/monty/src/exception_private.rs +0 -1513
  432. package/ref-monty/crates/monty/src/exception_public.rs +0 -346
  433. package/ref-monty/crates/monty/src/expressions.rs +0 -694
  434. package/ref-monty/crates/monty/src/fstring.rs +0 -854
  435. package/ref-monty/crates/monty/src/function.rs +0 -119
  436. package/ref-monty/crates/monty/src/heap.rs +0 -1073
  437. package/ref-monty/crates/monty/src/heap_data.rs +0 -985
  438. package/ref-monty/crates/monty/src/heap_traits.rs +0 -312
  439. package/ref-monty/crates/monty/src/intern.rs +0 -837
  440. package/ref-monty/crates/monty/src/io.rs +0 -106
  441. package/ref-monty/crates/monty/src/lib.rs +0 -52
  442. package/ref-monty/crates/monty/src/modules/asyncio.rs +0 -144
  443. package/ref-monty/crates/monty/src/modules/math.rs +0 -1453
  444. package/ref-monty/crates/monty/src/modules/mod.rs +0 -120
  445. package/ref-monty/crates/monty/src/modules/os.rs +0 -116
  446. package/ref-monty/crates/monty/src/modules/pathlib.rs +0 -33
  447. package/ref-monty/crates/monty/src/modules/re.rs +0 -606
  448. package/ref-monty/crates/monty/src/modules/sys.rs +0 -60
  449. package/ref-monty/crates/monty/src/modules/typing.rs +0 -70
  450. package/ref-monty/crates/monty/src/namespace.rs +0 -21
  451. package/ref-monty/crates/monty/src/object.rs +0 -1040
  452. package/ref-monty/crates/monty/src/os.rs +0 -215
  453. package/ref-monty/crates/monty/src/parse.rs +0 -1730
  454. package/ref-monty/crates/monty/src/prepare.rs +0 -3015
  455. package/ref-monty/crates/monty/src/repl.rs +0 -1109
  456. package/ref-monty/crates/monty/src/resource.rs +0 -559
  457. package/ref-monty/crates/monty/src/run.rs +0 -457
  458. package/ref-monty/crates/monty/src/run_progress.rs +0 -821
  459. package/ref-monty/crates/monty/src/signature.rs +0 -651
  460. package/ref-monty/crates/monty/src/sorting.rs +0 -100
  461. package/ref-monty/crates/monty/src/types/bytes.rs +0 -2356
  462. package/ref-monty/crates/monty/src/types/dataclass.rs +0 -345
  463. package/ref-monty/crates/monty/src/types/dict.rs +0 -879
  464. package/ref-monty/crates/monty/src/types/dict_view.rs +0 -619
  465. package/ref-monty/crates/monty/src/types/iter.rs +0 -799
  466. package/ref-monty/crates/monty/src/types/list.rs +0 -929
  467. package/ref-monty/crates/monty/src/types/long_int.rs +0 -211
  468. package/ref-monty/crates/monty/src/types/mod.rs +0 -48
  469. package/ref-monty/crates/monty/src/types/module.rs +0 -146
  470. package/ref-monty/crates/monty/src/types/namedtuple.rs +0 -261
  471. package/ref-monty/crates/monty/src/types/path.rs +0 -596
  472. package/ref-monty/crates/monty/src/types/property.rs +0 -35
  473. package/ref-monty/crates/monty/src/types/py_trait.rs +0 -322
  474. package/ref-monty/crates/monty/src/types/range.rs +0 -285
  475. package/ref-monty/crates/monty/src/types/re_match.rs +0 -522
  476. package/ref-monty/crates/monty/src/types/re_pattern.rs +0 -726
  477. package/ref-monty/crates/monty/src/types/set.rs +0 -1373
  478. package/ref-monty/crates/monty/src/types/slice.rs +0 -257
  479. package/ref-monty/crates/monty/src/types/str.rs +0 -2051
  480. package/ref-monty/crates/monty/src/types/tuple.rs +0 -376
  481. package/ref-monty/crates/monty/src/types/type.rs +0 -407
  482. package/ref-monty/crates/monty/src/value.rs +0 -2558
  483. package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +0 -3
  484. package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +0 -3
  485. package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +0 -3
  486. package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +0 -3
  487. package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +0 -3
  488. package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +0 -3
  489. package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +0 -3
  490. package/ref-monty/crates/monty/test_cases/args__id_too_many.py +0 -2
  491. package/ref-monty/crates/monty/test_cases/args__len_no_args.py +0 -2
  492. package/ref-monty/crates/monty/test_cases/args__len_too_many.py +0 -2
  493. package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +0 -9
  494. package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +0 -9
  495. package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +0 -3
  496. package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +0 -3
  497. package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +0 -3
  498. package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +0 -3
  499. package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +0 -2
  500. package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +0 -2
  501. package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +0 -2
  502. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +0 -2
  503. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +0 -2
  504. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +0 -2
  505. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +0 -9
  506. package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +0 -2
  507. package/ref-monty/crates/monty/test_cases/assert__fail.py +0 -2
  508. package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +0 -2
  509. package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +0 -3
  510. package/ref-monty/crates/monty/test_cases/assert__ops.py +0 -11
  511. package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +0 -47
  512. package/ref-monty/crates/monty/test_cases/async__basic.py +0 -10
  513. package/ref-monty/crates/monty/test_cases/async__closure.py +0 -14
  514. package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +0 -16
  515. package/ref-monty/crates/monty/test_cases/async__exception.py +0 -10
  516. package/ref-monty/crates/monty/test_cases/async__ext_call.py +0 -73
  517. package/ref-monty/crates/monty/test_cases/async__gather_all.py +0 -85
  518. package/ref-monty/crates/monty/test_cases/async__nested_await.py +0 -15
  519. package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +0 -37
  520. package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +0 -10
  521. package/ref-monty/crates/monty/test_cases/async__not_imported.py +0 -14
  522. package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +0 -27
  523. package/ref-monty/crates/monty/test_cases/async__return_types.py +0 -31
  524. package/ref-monty/crates/monty/test_cases/async__sequential.py +0 -16
  525. package/ref-monty/crates/monty/test_cases/async__traceback.py +0 -19
  526. package/ref-monty/crates/monty/test_cases/async__with_args.py +0 -14
  527. package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +0 -9
  528. package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +0 -9
  529. package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +0 -12
  530. package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +0 -10
  531. package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +0 -10
  532. package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +0 -68
  533. package/ref-monty/crates/monty/test_cases/bool__ops.py +0 -20
  534. package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +0 -2
  535. package/ref-monty/crates/monty/test_cases/builtin__filter.py +0 -62
  536. package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +0 -11
  537. package/ref-monty/crates/monty/test_cases/builtin__getattr.py +0 -84
  538. package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +0 -42
  539. package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +0 -66
  540. package/ref-monty/crates/monty/test_cases/builtin__map.py +0 -74
  541. package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +0 -11
  542. package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +0 -154
  543. package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +0 -148
  544. package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +0 -10
  545. package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +0 -9
  546. package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +0 -12
  547. package/ref-monty/crates/monty/test_cases/builtin__repr.py +0 -3
  548. package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +0 -73
  549. package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +0 -18
  550. package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +0 -10
  551. package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +0 -10
  552. package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +0 -10
  553. package/ref-monty/crates/monty/test_cases/bytes__methods.py +0 -394
  554. package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +0 -9
  555. package/ref-monty/crates/monty/test_cases/bytes__ops.py +0 -90
  556. package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +0 -10
  557. package/ref-monty/crates/monty/test_cases/call_object.py +0 -3
  558. package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +0 -79
  559. package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +0 -81
  560. package/ref-monty/crates/monty/test_cases/closure__pep448.py +0 -203
  561. package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +0 -13
  562. package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +0 -120
  563. package/ref-monty/crates/monty/test_cases/comprehension__all.py +0 -208
  564. package/ref-monty/crates/monty/test_cases/comprehension__scope.py +0 -7
  565. package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +0 -14
  566. package/ref-monty/crates/monty/test_cases/dataclass__basic.py +0 -238
  567. package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +0 -12
  568. package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +0 -12
  569. package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +0 -11
  570. package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +0 -3
  571. package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +0 -2
  572. package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +0 -3
  573. package/ref-monty/crates/monty/test_cases/dict__methods.py +0 -151
  574. package/ref-monty/crates/monty/test_cases/dict__ops.py +0 -133
  575. package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +0 -4
  576. package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +0 -9
  577. package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +0 -3
  578. package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +0 -2
  579. package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +0 -2
  580. package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +0 -2
  581. package/ref-monty/crates/monty/test_cases/dict__views.py +0 -165
  582. package/ref-monty/crates/monty/test_cases/edge__all.py +0 -26
  583. package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +0 -2
  584. package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +0 -2
  585. package/ref-monty/crates/monty/test_cases/exc__args.py +0 -16
  586. package/ref-monty/crates/monty/test_cases/exc__str.py +0 -15
  587. package/ref-monty/crates/monty/test_cases/execute_ok__all.py +0 -54
  588. package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +0 -2
  589. package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +0 -2
  590. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +0 -2
  591. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +0 -2
  592. package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +0 -2
  593. package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +0 -4
  594. package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +0 -2
  595. package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +0 -2
  596. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +0 -4
  597. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +0 -3
  598. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +0 -4
  599. package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +0 -22
  600. package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +0 -17
  601. package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +0 -7
  602. package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +0 -34
  603. package/ref-monty/crates/monty/test_cases/ext_call__basic.py +0 -99
  604. package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +0 -37
  605. package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +0 -17
  606. package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +0 -16
  607. package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +0 -26
  608. package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +0 -18
  609. package/ref-monty/crates/monty/test_cases/ext_call__elif.py +0 -171
  610. package/ref-monty/crates/monty/test_cases/ext_call__exc.py +0 -4
  611. package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +0 -39
  612. package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +0 -17
  613. package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +0 -31
  614. package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +0 -171
  615. package/ref-monty/crates/monty/test_cases/ext_call__for.py +0 -114
  616. package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +0 -12
  617. package/ref-monty/crates/monty/test_cases/ext_call__if.py +0 -135
  618. package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +0 -37
  619. package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +0 -14
  620. package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +0 -40
  621. package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +0 -7
  622. package/ref-monty/crates/monty/test_cases/ext_call__literals.py +0 -17
  623. package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +0 -32
  624. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +0 -69
  625. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +0 -4
  626. package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +0 -14
  627. package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +0 -19
  628. package/ref-monty/crates/monty/test_cases/ext_call__return.py +0 -28
  629. package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +0 -25
  630. package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +0 -7
  631. package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +0 -28
  632. package/ref-monty/crates/monty/test_cases/ext_call__try.py +0 -280
  633. package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +0 -10
  634. package/ref-monty/crates/monty/test_cases/ext_call__unary.py +0 -13
  635. package/ref-monty/crates/monty/test_cases/frozenset__ops.py +0 -178
  636. package/ref-monty/crates/monty/test_cases/fstring__all.py +0 -236
  637. package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +0 -3
  638. package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +0 -3
  639. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +0 -3
  640. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +0 -3
  641. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +0 -4
  642. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +0 -4
  643. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +0 -4
  644. package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +0 -3
  645. package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +0 -6
  646. package/ref-monty/crates/monty/test_cases/function__call_unpack.py +0 -42
  647. package/ref-monty/crates/monty/test_cases/function__defaults.py +0 -117
  648. package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +0 -7
  649. package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +0 -7
  650. package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +0 -9
  651. package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +0 -7
  652. package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +0 -7
  653. package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +0 -9
  654. package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +0 -7
  655. package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +0 -7
  656. package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +0 -7
  657. package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +0 -7
  658. package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +0 -7
  659. package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +0 -7
  660. package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +0 -7
  661. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +0 -7
  662. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +0 -9
  663. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +0 -13
  664. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +0 -7
  665. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +0 -6
  666. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +0 -8
  667. package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +0 -6
  668. package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +0 -6
  669. package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +0 -6
  670. package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +0 -173
  671. package/ref-monty/crates/monty/test_cases/function__ops.py +0 -294
  672. package/ref-monty/crates/monty/test_cases/function__return_none.py +0 -42
  673. package/ref-monty/crates/monty/test_cases/function__signatures.py +0 -47
  674. package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +0 -6
  675. package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +0 -6
  676. package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +0 -6
  677. package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +0 -6
  678. package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +0 -6
  679. package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +0 -6
  680. package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +0 -7
  681. package/ref-monty/crates/monty/test_cases/global__ops.py +0 -163
  682. package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +0 -2
  683. package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +0 -2
  684. package/ref-monty/crates/monty/test_cases/hash__ops.py +0 -153
  685. package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +0 -3
  686. package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +0 -5
  687. package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +0 -3
  688. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +0 -10
  689. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +0 -6
  690. package/ref-monty/crates/monty/test_cases/id__ops.py +0 -97
  691. package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +0 -3
  692. package/ref-monty/crates/monty/test_cases/if__elif_else.py +0 -207
  693. package/ref-monty/crates/monty/test_cases/if__raise_elif.py +0 -11
  694. package/ref-monty/crates/monty/test_cases/if__raise_else.py +0 -13
  695. package/ref-monty/crates/monty/test_cases/if__raise_if.py +0 -9
  696. package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +0 -18
  697. package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +0 -16
  698. package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +0 -55
  699. package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +0 -9
  700. package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +0 -9
  701. package/ref-monty/crates/monty/test_cases/import__local_scope.py +0 -68
  702. package/ref-monty/crates/monty/test_cases/import__os.py +0 -25
  703. package/ref-monty/crates/monty/test_cases/import__relative_error.py +0 -9
  704. package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +0 -9
  705. package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +0 -14
  706. package/ref-monty/crates/monty/test_cases/import__star_error.py +0 -11
  707. package/ref-monty/crates/monty/test_cases/import__sys.py +0 -47
  708. package/ref-monty/crates/monty/test_cases/import__sys_monty.py +0 -28
  709. package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +0 -37
  710. package/ref-monty/crates/monty/test_cases/import__typing.py +0 -25
  711. package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +0 -4
  712. package/ref-monty/crates/monty/test_cases/int__bigint.py +0 -467
  713. package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +0 -260
  714. package/ref-monty/crates/monty/test_cases/int__ops.py +0 -219
  715. package/ref-monty/crates/monty/test_cases/int__overflow_division.py +0 -84
  716. package/ref-monty/crates/monty/test_cases/is_variant__all.py +0 -36
  717. package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +0 -2
  718. package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +0 -2
  719. package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +0 -4
  720. package/ref-monty/crates/monty/test_cases/iter__for.py +0 -243
  721. package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +0 -66
  722. package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +0 -20
  723. package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +0 -7
  724. package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +0 -3
  725. package/ref-monty/crates/monty/test_cases/lambda__all.py +0 -145
  726. package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +0 -7
  727. package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +0 -3
  728. package/ref-monty/crates/monty/test_cases/list__index_not_found.py +0 -9
  729. package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +0 -10
  730. package/ref-monty/crates/monty/test_cases/list__ops.py +0 -473
  731. package/ref-monty/crates/monty/test_cases/list__pop_empty.py +0 -9
  732. package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +0 -9
  733. package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +0 -9
  734. package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +0 -9
  735. package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +0 -13
  736. package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +0 -13
  737. package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +0 -10
  738. package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +0 -10
  739. package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +0 -2
  740. package/ref-monty/crates/monty/test_cases/longint__index_error.py +0 -3
  741. package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +0 -3
  742. package/ref-monty/crates/monty/test_cases/loop__break_continue.py +0 -113
  743. package/ref-monty/crates/monty/test_cases/loop__break_finally.py +0 -69
  744. package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +0 -13
  745. package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +0 -11
  746. package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +0 -55
  747. package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +0 -9
  748. package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +0 -81
  749. package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +0 -13
  750. package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +0 -11
  751. package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +0 -60
  752. package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +0 -9
  753. package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +0 -11
  754. package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +0 -11
  755. package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +0 -11
  756. package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +0 -11
  757. package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +0 -11
  758. package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +0 -11
  759. package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +0 -11
  760. package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +0 -11
  761. package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +0 -11
  762. package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +0 -11
  763. package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +0 -11
  764. package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +0 -11
  765. package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +0 -11
  766. package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +0 -11
  767. package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +0 -11
  768. package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +0 -11
  769. package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +0 -11
  770. package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +0 -11
  771. package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +0 -11
  772. package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +0 -11
  773. package/ref-monty/crates/monty/test_cases/math__module.py +0 -1432
  774. package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +0 -11
  775. package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +0 -11
  776. package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +0 -11
  777. package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +0 -11
  778. package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +0 -11
  779. package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +0 -259
  780. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +0 -19
  781. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +0 -12
  782. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +0 -9
  783. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +0 -9
  784. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +0 -16
  785. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +0 -9
  786. package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +0 -10
  787. package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +0 -11
  788. package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +0 -34
  789. package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +0 -3
  790. package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +0 -353
  791. package/ref-monty/crates/monty/test_cases/os__environ.py +0 -40
  792. package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +0 -5
  793. package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +0 -5
  794. package/ref-monty/crates/monty/test_cases/parse_error__complex.py +0 -3
  795. package/ref-monty/crates/monty/test_cases/pathlib__import.py +0 -11
  796. package/ref-monty/crates/monty/test_cases/pathlib__os.py +0 -136
  797. package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +0 -12
  798. package/ref-monty/crates/monty/test_cases/pathlib__pure.py +0 -81
  799. package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +0 -5
  800. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +0 -6
  801. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +0 -5
  802. package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +0 -6
  803. package/ref-monty/crates/monty/test_cases/range__error_no_args.py +0 -2
  804. package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +0 -2
  805. package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +0 -2
  806. package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +0 -10
  807. package/ref-monty/crates/monty/test_cases/range__ops.py +0 -236
  808. package/ref-monty/crates/monty/test_cases/re__basic.py +0 -756
  809. package/ref-monty/crates/monty/test_cases/re__grouping.py +0 -241
  810. package/ref-monty/crates/monty/test_cases/re__match.py +0 -148
  811. package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +0 -26
  812. package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +0 -23
  813. package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +0 -46
  814. package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +0 -12
  815. package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +0 -13
  816. package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +0 -18
  817. package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +0 -12
  818. package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +0 -5
  819. package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +0 -5
  820. package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +0 -14
  821. package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +0 -6
  822. package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +0 -16
  823. package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +0 -18
  824. package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +0 -25
  825. package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +0 -4
  826. package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +0 -27
  827. package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +0 -6
  828. package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +0 -5
  829. package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +0 -5
  830. package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +0 -5
  831. package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +0 -5
  832. package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +0 -4
  833. package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +0 -37
  834. package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +0 -34
  835. package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +0 -31
  836. package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +0 -4
  837. package/ref-monty/crates/monty/test_cases/refcount__single_list.py +0 -3
  838. package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +0 -24
  839. package/ref-monty/crates/monty/test_cases/set__ops.py +0 -191
  840. package/ref-monty/crates/monty/test_cases/set__review_bugs.py +0 -35
  841. package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +0 -2
  842. package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +0 -2
  843. package/ref-monty/crates/monty/test_cases/slice__kwargs.py +0 -9
  844. package/ref-monty/crates/monty/test_cases/slice__no_args.py +0 -9
  845. package/ref-monty/crates/monty/test_cases/slice__ops.py +0 -149
  846. package/ref-monty/crates/monty/test_cases/slice__step_zero.py +0 -9
  847. package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +0 -9
  848. package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +0 -9
  849. package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +0 -9
  850. package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +0 -9
  851. package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +0 -9
  852. package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +0 -10
  853. package/ref-monty/crates/monty/test_cases/str__index_not_found.py +0 -9
  854. package/ref-monty/crates/monty/test_cases/str__join_no_args.py +0 -9
  855. package/ref-monty/crates/monty/test_cases/str__join_non_string.py +0 -9
  856. package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +0 -9
  857. package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +0 -9
  858. package/ref-monty/crates/monty/test_cases/str__methods.py +0 -327
  859. package/ref-monty/crates/monty/test_cases/str__ops.py +0 -162
  860. package/ref-monty/crates/monty/test_cases/str__partition_empty.py +0 -9
  861. package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +0 -9
  862. package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +0 -9
  863. package/ref-monty/crates/monty/test_cases/sys__types.py +0 -7
  864. package/ref-monty/crates/monty/test_cases/traceback__division_error.py +0 -30
  865. package/ref-monty/crates/monty/test_cases/traceback__index_error.py +0 -17
  866. package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +0 -10
  867. package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +0 -29
  868. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +0 -10
  869. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +0 -24
  870. package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +0 -9
  871. package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +0 -23
  872. package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +0 -11
  873. package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +0 -16
  874. package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +0 -16
  875. package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +0 -16
  876. package/ref-monty/crates/monty/test_cases/try_except__all.py +0 -472
  877. package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +0 -2
  878. package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +0 -5
  879. package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +0 -3
  880. package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +0 -9
  881. package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +0 -10
  882. package/ref-monty/crates/monty/test_cases/tuple__methods.py +0 -19
  883. package/ref-monty/crates/monty/test_cases/tuple__ops.py +0 -133
  884. package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +0 -2
  885. package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +0 -9
  886. package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +0 -2
  887. package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +0 -9
  888. package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +0 -11
  889. package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +0 -2
  890. package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +0 -9
  891. package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +0 -9
  892. package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +0 -9
  893. package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +0 -2
  894. package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +0 -2
  895. package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +0 -9
  896. package/ref-monty/crates/monty/test_cases/type__ops.py +0 -200
  897. package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +0 -3
  898. package/ref-monty/crates/monty/test_cases/type__shadow_int.py +0 -9
  899. package/ref-monty/crates/monty/test_cases/type__shadow_len.py +0 -3
  900. package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +0 -2
  901. package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +0 -2
  902. package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +0 -2
  903. package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +0 -2
  904. package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +0 -3
  905. package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +0 -2
  906. package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +0 -2
  907. package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +0 -2
  908. package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +0 -2
  909. package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +0 -2
  910. package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +0 -6
  911. package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +0 -2
  912. package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +0 -3
  913. package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +0 -3
  914. package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +0 -4
  915. package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +0 -3
  916. package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +0 -4
  917. package/ref-monty/crates/monty/test_cases/typing__types.py +0 -24
  918. package/ref-monty/crates/monty/test_cases/unpack__nested.py +0 -48
  919. package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +0 -9
  920. package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +0 -9
  921. package/ref-monty/crates/monty/test_cases/unpack__ops.py +0 -153
  922. package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +0 -9
  923. package/ref-monty/crates/monty/test_cases/unpack__too_many.py +0 -9
  924. package/ref-monty/crates/monty/test_cases/version__cpython.py +0 -4
  925. package/ref-monty/crates/monty/test_cases/walrus__all.py +0 -178
  926. package/ref-monty/crates/monty/test_cases/while__all.py +0 -206
  927. package/ref-monty/crates/monty/tests/asyncio.rs +0 -764
  928. package/ref-monty/crates/monty/tests/binary_serde.rs +0 -185
  929. package/ref-monty/crates/monty/tests/bytecode_limits.rs +0 -248
  930. package/ref-monty/crates/monty/tests/datatest_runner.rs +0 -2029
  931. package/ref-monty/crates/monty/tests/inputs.rs +0 -420
  932. package/ref-monty/crates/monty/tests/json_serde.rs +0 -250
  933. package/ref-monty/crates/monty/tests/main.rs +0 -71
  934. package/ref-monty/crates/monty/tests/math_module.rs +0 -114
  935. package/ref-monty/crates/monty/tests/name_lookup.rs +0 -482
  936. package/ref-monty/crates/monty/tests/os_tests.rs +0 -459
  937. package/ref-monty/crates/monty/tests/parse_errors.rs +0 -441
  938. package/ref-monty/crates/monty/tests/print_writer.rs +0 -238
  939. package/ref-monty/crates/monty/tests/py_object.rs +0 -121
  940. package/ref-monty/crates/monty/tests/regex.rs +0 -90
  941. package/ref-monty/crates/monty/tests/repl.rs +0 -344
  942. package/ref-monty/crates/monty/tests/resource_limits.rs +0 -1826
  943. package/ref-monty/crates/monty/tests/try_from.rs +0 -167
  944. package/ref-monty/crates/monty-cli/Cargo.toml +0 -25
  945. package/ref-monty/crates/monty-cli/src/main.rs +0 -541
  946. package/ref-monty/crates/monty-js/.cargo/config.toml +0 -2
  947. package/ref-monty/crates/monty-js/.prettierignore +0 -8
  948. package/ref-monty/crates/monty-js/Cargo.toml +0 -32
  949. package/ref-monty/crates/monty-js/README.md +0 -207
  950. package/ref-monty/crates/monty-js/__test__/async.spec.ts +0 -350
  951. package/ref-monty/crates/monty-js/__test__/basic.spec.ts +0 -114
  952. package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +0 -427
  953. package/ref-monty/crates/monty-js/__test__/external.spec.ts +0 -354
  954. package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +0 -143
  955. package/ref-monty/crates/monty-js/__test__/limits.spec.ts +0 -162
  956. package/ref-monty/crates/monty-js/__test__/package.json +0 -3
  957. package/ref-monty/crates/monty-js/__test__/print.spec.ts +0 -229
  958. package/ref-monty/crates/monty-js/__test__/repl.spec.ts +0 -34
  959. package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +0 -205
  960. package/ref-monty/crates/monty-js/__test__/start.spec.ts +0 -443
  961. package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +0 -147
  962. package/ref-monty/crates/monty-js/__test__/types.spec.ts +0 -319
  963. package/ref-monty/crates/monty-js/build.rs +0 -61
  964. package/ref-monty/crates/monty-js/index-header.d.ts +0 -3
  965. package/ref-monty/crates/monty-js/package-lock.json +0 -4694
  966. package/ref-monty/crates/monty-js/package.json +0 -100
  967. package/ref-monty/crates/monty-js/scripts/smoke-test.sh +0 -69
  968. package/ref-monty/crates/monty-js/smoke-test/package.json +0 -17
  969. package/ref-monty/crates/monty-js/smoke-test/test.ts +0 -171
  970. package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +0 -11
  971. package/ref-monty/crates/monty-js/src/convert.rs +0 -648
  972. package/ref-monty/crates/monty-js/src/exceptions.rs +0 -293
  973. package/ref-monty/crates/monty-js/src/lib.rs +0 -41
  974. package/ref-monty/crates/monty-js/src/limits.rs +0 -53
  975. package/ref-monty/crates/monty-js/src/monty_cls.rs +0 -1407
  976. package/ref-monty/crates/monty-js/tsconfig.json +0 -17
  977. package/ref-monty/crates/monty-js/wrapper.ts +0 -701
  978. package/ref-monty/crates/monty-python/Cargo.toml +0 -38
  979. package/ref-monty/crates/monty-python/README.md +0 -134
  980. package/ref-monty/crates/monty-python/build.rs +0 -4
  981. package/ref-monty/crates/monty-python/example.py +0 -40
  982. package/ref-monty/crates/monty-python/exercise.py +0 -46
  983. package/ref-monty/crates/monty-python/pyproject.toml +0 -57
  984. package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +0 -281
  985. package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +0 -677
  986. package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +0 -933
  987. package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
  988. package/ref-monty/crates/monty-python/src/convert.rs +0 -273
  989. package/ref-monty/crates/monty-python/src/dataclass.rs +0 -461
  990. package/ref-monty/crates/monty-python/src/exceptions.rs +0 -557
  991. package/ref-monty/crates/monty-python/src/external.rs +0 -165
  992. package/ref-monty/crates/monty-python/src/lib.rs +0 -77
  993. package/ref-monty/crates/monty-python/src/limits.rs +0 -142
  994. package/ref-monty/crates/monty-python/src/monty_cls.rs +0 -1650
  995. package/ref-monty/crates/monty-python/src/repl.rs +0 -470
  996. package/ref-monty/crates/monty-python/src/serialization.rs +0 -761
  997. package/ref-monty/crates/monty-python/tests/test_async.py +0 -1201
  998. package/ref-monty/crates/monty-python/tests/test_basic.py +0 -66
  999. package/ref-monty/crates/monty-python/tests/test_dataclasses.py +0 -971
  1000. package/ref-monty/crates/monty-python/tests/test_exceptions.py +0 -361
  1001. package/ref-monty/crates/monty-python/tests/test_external.py +0 -367
  1002. package/ref-monty/crates/monty-python/tests/test_inputs.py +0 -126
  1003. package/ref-monty/crates/monty-python/tests/test_limits.py +0 -257
  1004. package/ref-monty/crates/monty-python/tests/test_os_access.py +0 -1286
  1005. package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +0 -731
  1006. package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +0 -483
  1007. package/ref-monty/crates/monty-python/tests/test_os_calls.py +0 -819
  1008. package/ref-monty/crates/monty-python/tests/test_print.py +0 -208
  1009. package/ref-monty/crates/monty-python/tests/test_re.py +0 -170
  1010. package/ref-monty/crates/monty-python/tests/test_readme_examples.py +0 -20
  1011. package/ref-monty/crates/monty-python/tests/test_repl.py +0 -749
  1012. package/ref-monty/crates/monty-python/tests/test_serialize.py +0 -284
  1013. package/ref-monty/crates/monty-python/tests/test_start.py +0 -346
  1014. package/ref-monty/crates/monty-python/tests/test_threading.py +0 -163
  1015. package/ref-monty/crates/monty-python/tests/test_type_check.py +0 -344
  1016. package/ref-monty/crates/monty-python/tests/test_types.py +0 -553
  1017. package/ref-monty/crates/monty-type-checking/Cargo.toml +0 -32
  1018. package/ref-monty/crates/monty-type-checking/src/db.rs +0 -116
  1019. package/ref-monty/crates/monty-type-checking/src/lib.rs +0 -4
  1020. package/ref-monty/crates/monty-type-checking/src/type_check.rs +0 -280
  1021. package/ref-monty/crates/monty-type-checking/tests/bad_types.py +0 -109
  1022. package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +0 -21
  1023. package/ref-monty/crates/monty-type-checking/tests/good_types.py +0 -475
  1024. package/ref-monty/crates/monty-type-checking/tests/main.rs +0 -205
  1025. package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +0 -56
  1026. package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +0 -41
  1027. package/ref-monty/crates/monty-typeshed/Cargo.toml +0 -29
  1028. package/ref-monty/crates/monty-typeshed/README.md +0 -11
  1029. package/ref-monty/crates/monty-typeshed/build.rs +0 -101
  1030. package/ref-monty/crates/monty-typeshed/custom/README.md +0 -1
  1031. package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +0 -138
  1032. package/ref-monty/crates/monty-typeshed/custom/os.pyi +0 -87
  1033. package/ref-monty/crates/monty-typeshed/custom/sys.pyi +0 -33
  1034. package/ref-monty/crates/monty-typeshed/src/lib.rs +0 -56
  1035. package/ref-monty/crates/monty-typeshed/update.py +0 -321
  1036. package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +0 -1
  1037. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +0 -20
  1038. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +0 -105
  1039. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +0 -394
  1040. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +0 -138
  1041. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +0 -1434
  1042. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +0 -527
  1043. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +0 -2
  1044. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +0 -502
  1045. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +0 -376
  1046. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +0 -149
  1047. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +0 -87
  1048. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +0 -395
  1049. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +0 -8
  1050. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +0 -337
  1051. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +0 -33
  1052. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +0 -741
  1053. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +0 -1217
  1054. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +0 -716
  1055. package/ref-monty/docs/usage-guide.md +0 -117
  1056. package/ref-monty/examples/README.md +0 -3
  1057. package/ref-monty/examples/expense_analysis/README.md +0 -3
  1058. package/ref-monty/examples/expense_analysis/data.py +0 -124
  1059. package/ref-monty/examples/expense_analysis/main.py +0 -115
  1060. package/ref-monty/examples/sql_playground/README.md +0 -20
  1061. package/ref-monty/examples/sql_playground/external_functions.py +0 -129
  1062. package/ref-monty/examples/sql_playground/main.py +0 -81
  1063. package/ref-monty/examples/sql_playground/sandbox_code.py +0 -82
  1064. package/ref-monty/examples/sql_playground/type_stubs.pyi +0 -14
  1065. package/ref-monty/examples/web_scraper/README.md +0 -15
  1066. package/ref-monty/examples/web_scraper/browser.py +0 -56
  1067. package/ref-monty/examples/web_scraper/example_code.py +0 -59
  1068. package/ref-monty/examples/web_scraper/external_functions.py +0 -324
  1069. package/ref-monty/examples/web_scraper/main.py +0 -193
  1070. package/ref-monty/examples/web_scraper/sub_agent.py +0 -79
  1071. package/ref-monty/monty-npm.md +0 -235
  1072. package/ref-monty/pyproject.toml +0 -162
  1073. package/ref-monty/scripts/check_imports.py +0 -91
  1074. package/ref-monty/scripts/codecov_diff.py +0 -412
  1075. package/ref-monty/scripts/complete_tests.py +0 -146
  1076. package/ref-monty/scripts/flamegraph_to_text.py +0 -208
  1077. package/ref-monty/scripts/iter_test_methods.py +0 -540
  1078. package/ref-monty/scripts/run_traceback.py +0 -180
  1079. package/ref-monty/scripts/startup_performance.py +0 -130
  1080. package/ref-monty/uv.lock +0 -1779
  1081. /package/docs/{plugin-examples.md → plugins-examples.md} +0 -0
@@ -1,985 +0,0 @@
1
- use std::{
2
- borrow::Cow,
3
- fmt::Write,
4
- hash::{DefaultHasher, Hash, Hasher},
5
- mem::discriminant,
6
- };
7
-
8
- use ahash::AHashSet;
9
- use num_integer::Integer;
10
-
11
- use crate::{
12
- ExcType, ResourceError, ResourceTracker,
13
- args::ArgValues,
14
- asyncio::{Coroutine, GatherFuture, GatherItem},
15
- bytecode::{CallResult, VM},
16
- defer_drop,
17
- exception_private::{RunResult, SimpleException},
18
- heap::{Heap, HeapId},
19
- intern::{FunctionId, Interns},
20
- types::{
21
- Bytes, Dataclass, Dict, DictItemsView, DictKeysView, DictValuesView, FrozenSet, List, LongInt, Module,
22
- MontyIter, NamedTuple, Path, PyTrait, Range, ReMatch, RePattern, Set, Slice, Str, Tuple, Type,
23
- },
24
- value::{EitherStr, Value},
25
- };
26
-
27
- /// HeapData captures every runtime value that must live in the arena.
28
- ///
29
- /// Each variant wraps a type that implements `PyTrait`, providing
30
- /// Python-compatible operations. The trait is manually implemented to dispatch
31
- /// to the appropriate variant's implementation.
32
- #[derive(Debug, serde::Serialize, serde::Deserialize)]
33
- pub(crate) enum HeapData {
34
- Str(Str),
35
- Bytes(Bytes),
36
- List(List),
37
- Tuple(Tuple),
38
- NamedTuple(NamedTuple),
39
- Dict(Dict),
40
- DictKeysView(DictKeysView),
41
- DictItemsView(DictItemsView),
42
- DictValuesView(DictValuesView),
43
- Set(Set),
44
- FrozenSet(FrozenSet),
45
- Closure(Closure),
46
- FunctionDefaults(FunctionDefaults),
47
- /// A cell wrapping a single mutable value for closure support.
48
- ///
49
- /// Cells enable nonlocal variable access by providing a heap-allocated
50
- /// container that can be shared between a function and its nested functions.
51
- /// Both the outer function and inner function hold references to the same
52
- /// cell, allowing modifications to propagate across scope boundaries.
53
- Cell(CellValue),
54
- /// A range object (e.g., `range(10)` or `range(1, 10, 2)`).
55
- ///
56
- /// Stored on the heap to keep `Value` enum small (16 bytes). Range objects
57
- /// are immutable and hashable.
58
- Range(Range),
59
- /// A slice object (e.g., `slice(1, 10, 2)` or from `x[1:10:2]`).
60
- ///
61
- /// Stored on the heap to keep `Value` enum small. Slice objects represent
62
- /// start:stop:step indices for sequence slicing operations.
63
- Slice(Slice),
64
- /// An exception instance (e.g., `ValueError('message')`).
65
- ///
66
- /// Stored on the heap to keep `Value` enum small (16 bytes). Exceptions
67
- /// are created when exception types are called or when `raise` is executed.
68
- Exception(SimpleException),
69
- /// A dataclass instance with fields and method references.
70
- ///
71
- /// Contains a class name, a Dict of field name -> value mappings, and a set
72
- /// of method names that trigger external function calls when invoked.
73
- Dataclass(Dataclass),
74
- /// An iterator for for-loop iteration and the `iter()` type constructor.
75
- ///
76
- /// Created by the `GetIter` opcode or `iter()` builtin, advanced by `ForIter`.
77
- /// Stores iteration state for lists, tuples, strings, ranges, dicts, and sets.
78
- Iter(MontyIter),
79
- /// An arbitrary precision integer (LongInt).
80
- ///
81
- /// Stored on the heap to keep `Value` enum at 16 bytes. Python has one `int` type,
82
- /// so LongInt is an implementation detail - we use `Value::Int(i64)` for performance
83
- /// when values fit, and promote to LongInt on overflow. When LongInt results fit back
84
- /// in i64, they are demoted back to `Value::Int` for performance.
85
- LongInt(LongInt),
86
- /// A Python module (e.g., `sys`, `typing`).
87
- ///
88
- /// Modules have a name and a dictionary of attributes. They are created by
89
- /// import statements and can have refs to other heap values in their attributes.
90
- Module(Module),
91
- /// A coroutine object from an async function call.
92
- ///
93
- /// Contains pre-bound arguments and captured cells, ready to be awaited.
94
- /// When awaited, a new frame is pushed using the stored namespace.
95
- Coroutine(Coroutine),
96
- /// A gather() result tracking multiple coroutines/tasks.
97
- ///
98
- /// Created by asyncio.gather() and spawns tasks when awaited.
99
- GatherFuture(GatherFuture),
100
- /// A filesystem path from `pathlib.Path`.
101
- ///
102
- /// Stored on the heap to provide Python-compatible path operations.
103
- /// Pure methods (name, parent, etc.) are handled directly by the VM.
104
- /// I/O methods (exists, read_text, etc.) yield external function calls.
105
- Path(Path),
106
- /// A compiled regex pattern from `re.compile()`.
107
- ///
108
- /// Contains the original pattern string, flags, and compiled regex engine.
109
- /// Leaf type: no heap references, not GC-tracked.
110
- RePattern(Box<RePattern>),
111
- /// A regex match result from a successful regex operation.
112
- ///
113
- /// Contains the matched text, capture groups, positions, and input string.
114
- /// Leaf type: no heap references, not GC-tracked.
115
- ReMatch(ReMatch),
116
- /// Reference to an external function whose name was not found in the intern table.
117
- ///
118
- /// Created when the host resolves a `NameLookup` to a callable whose name does not
119
- /// match any interned string (e.g., the host returns a function with a different
120
- /// `__name__` than the variable it was assigned to). When called, the VM yields
121
- /// `FrameExit::ExternalCall` with an `EitherStr::Heap` containing this name.
122
- ExtFunction(String),
123
- }
124
-
125
- impl HeapData {
126
- /// Returns whether this heap data type can participate in reference cycles.
127
- ///
128
- /// Only container types that can hold references to other heap objects need to be
129
- /// tracked for GC purposes. Leaf types like Str, Bytes, Range, and Exception cannot
130
- /// form cycles and should not count toward the GC allocation threshold.
131
- ///
132
- /// This optimization allows programs that allocate many leaf objects (like strings)
133
- /// to avoid triggering unnecessary GC cycles.
134
- #[inline]
135
- pub(crate) fn is_gc_tracked(&self) -> bool {
136
- matches!(
137
- self,
138
- Self::List(_)
139
- | Self::Tuple(_)
140
- | Self::NamedTuple(_)
141
- | Self::Dict(_)
142
- | Self::DictKeysView(_)
143
- | Self::DictItemsView(_)
144
- | Self::DictValuesView(_)
145
- | Self::Set(_)
146
- | Self::FrozenSet(_)
147
- | Self::Closure(_)
148
- | Self::FunctionDefaults(_)
149
- | Self::Cell(_)
150
- | Self::Dataclass(_)
151
- | Self::Iter(_)
152
- | Self::Module(_)
153
- | Self::Coroutine(_)
154
- | Self::GatherFuture(_)
155
- )
156
- }
157
-
158
- /// Returns whether this heap data currently contains any heap references (`Value::Ref`).
159
- ///
160
- /// Used during allocation to determine if this data could create reference cycles.
161
- /// When true, `mark_potential_cycle()` should be called to enable GC.
162
- ///
163
- /// Note: This is separate from `is_gc_tracked()` - a container may be GC-tracked
164
- /// (capable of holding refs) but not currently contain any refs.
165
- #[inline]
166
- pub(crate) fn has_refs(&self) -> bool {
167
- match self {
168
- Self::List(list) => list.contains_refs(),
169
- Self::Tuple(tuple) => tuple.contains_refs(),
170
- Self::NamedTuple(nt) => nt.contains_refs(),
171
- Self::Dict(dict) => dict.has_refs(),
172
- Self::DictKeysView(_) | Self::DictItemsView(_) | Self::DictValuesView(_) => true,
173
- Self::Set(set) => set.has_refs(),
174
- Self::FrozenSet(fset) => fset.has_refs(),
175
- // Closures always have refs when they have captured cells (HeapIds)
176
- Self::Closure(closure) => {
177
- !closure.cells.is_empty() || closure.defaults.iter().any(|v| matches!(v, Value::Ref(_)))
178
- }
179
- Self::FunctionDefaults(fd) => fd.defaults.iter().any(|v| matches!(v, Value::Ref(_))),
180
- Self::Cell(cell) => matches!(&cell.0, Value::Ref(_)),
181
- Self::Dataclass(dc) => dc.has_refs(),
182
- Self::Iter(iter) => iter.has_refs(),
183
- Self::Module(m) => m.has_refs(),
184
- // Coroutines have refs from namespace values (params, cell/free vars)
185
- Self::Coroutine(coro) => coro.namespace.iter().any(|v| matches!(v, Value::Ref(_))),
186
- // GatherFutures have refs from coroutine items and results
187
- Self::GatherFuture(gather) => {
188
- gather.items.iter().any(|item| matches!(item, GatherItem::Coroutine(_)))
189
- || gather
190
- .results
191
- .iter()
192
- .any(|r| r.as_ref().is_some_and(|v| matches!(v, Value::Ref(_))))
193
- }
194
- // Leaf types cannot have refs
195
- _ => false,
196
- }
197
- }
198
-
199
- /// Returns true if this heap data is a coroutine.
200
- #[inline]
201
- pub fn is_coroutine(&self) -> bool {
202
- matches!(self, Self::Coroutine(_))
203
- }
204
-
205
- /// Re-cast this as `HeapDataMut` for mutation.
206
- ///
207
- /// This is an important part of the Heap invariants: we never allow `&mut HeapData`
208
- /// outside of the heap module to prevent heap data changing type during execution.
209
- pub(crate) fn to_mut(&mut self) -> HeapDataMut<'_> {
210
- match self {
211
- Self::Str(s) => HeapDataMut::Str(s),
212
- Self::Bytes(b) => HeapDataMut::Bytes(b),
213
- Self::List(l) => HeapDataMut::List(l),
214
- Self::Tuple(t) => HeapDataMut::Tuple(t),
215
- Self::NamedTuple(nt) => HeapDataMut::NamedTuple(nt),
216
- Self::Dict(d) => HeapDataMut::Dict(d),
217
- Self::DictKeysView(view) => HeapDataMut::DictKeysView(view),
218
- Self::DictItemsView(view) => HeapDataMut::DictItemsView(view),
219
- Self::DictValuesView(view) => HeapDataMut::DictValuesView(view),
220
- Self::Set(s) => HeapDataMut::Set(s),
221
- Self::FrozenSet(fs) => HeapDataMut::FrozenSet(fs),
222
- Self::Closure(closure) => HeapDataMut::Closure(closure),
223
- Self::FunctionDefaults(fd) => HeapDataMut::FunctionDefaults(fd),
224
- Self::Cell(cell) => HeapDataMut::Cell(cell),
225
- Self::Range(r) => HeapDataMut::Range(r),
226
- Self::Slice(s) => HeapDataMut::Slice(s),
227
- Self::Exception(e) => HeapDataMut::Exception(e),
228
- Self::Dataclass(dc) => HeapDataMut::Dataclass(dc),
229
- Self::Iter(iter) => HeapDataMut::Iter(iter),
230
- Self::LongInt(li) => HeapDataMut::LongInt(li),
231
- Self::Module(m) => HeapDataMut::Module(m),
232
- Self::Coroutine(coro) => HeapDataMut::Coroutine(coro),
233
- Self::GatherFuture(gather) => HeapDataMut::GatherFuture(gather),
234
- Self::Path(p) => HeapDataMut::Path(p),
235
- Self::ReMatch(m) => HeapDataMut::ReMatch(m),
236
- Self::RePattern(p) => HeapDataMut::RePattern(p),
237
- Self::ExtFunction(s) => HeapDataMut::ExtFunction(s),
238
- }
239
- }
240
- }
241
-
242
- /// Mutable reference to `HeapData` inner values
243
- #[derive(Debug)]
244
- pub(crate) enum HeapDataMut<'a> {
245
- Str(&'a mut Str),
246
- Bytes(&'a mut Bytes),
247
- List(&'a mut List),
248
- Tuple(&'a mut Tuple),
249
- NamedTuple(&'a mut NamedTuple),
250
- Dict(&'a mut Dict),
251
- DictKeysView(&'a mut DictKeysView),
252
- DictItemsView(&'a mut DictItemsView),
253
- DictValuesView(&'a mut DictValuesView),
254
- Set(&'a mut Set),
255
- FrozenSet(&'a mut FrozenSet),
256
- Closure(&'a mut Closure),
257
- FunctionDefaults(&'a mut FunctionDefaults),
258
- /// A cell wrapping a single mutable value for closure support.
259
- ///
260
- /// Cells enable nonlocal variable access by providing a heap-allocated
261
- /// container that can be shared between a function and its nested functions.
262
- /// Both the outer function and inner function hold references to the same
263
- /// cell, allowing modifications to propagate across scope boundaries.
264
- Cell(&'a mut CellValue),
265
- /// A range object (e.g., `range(10)` or `range(1, 10, 2)`).
266
- ///
267
- /// Stored on the heap to keep `Value` enum small (16 bytes). Range objects
268
- /// are immutable and hashable.
269
- Range(&'a mut Range),
270
- /// A slice object (e.g., `slice(1, 10, 2)` or from `x[1:10:2]`).
271
- ///
272
- /// Stored on the heap to keep `Value` enum small. Slice objects represent
273
- /// start:stop:step indices for sequence slicing operations.
274
- Slice(&'a mut Slice),
275
- /// An exception instance (e.g., `ValueError('message')`).
276
- ///
277
- /// Stored on the heap to keep `Value` enum small (16 bytes). Exceptions
278
- /// are created when exception types are called or when `raise` is executed.
279
- Exception(&'a mut SimpleException),
280
- /// A dataclass instance with fields and method references.
281
- ///
282
- /// Contains a class name, a Dict of field name -> value mappings, and a set
283
- /// of method names that trigger external function calls when invoked.
284
- Dataclass(&'a mut Dataclass),
285
- /// An iterator for for-loop iteration and the `iter()` type constructor.
286
- ///
287
- /// Created by the `GetIter` opcode or `iter()` builtin, advanced by `ForIter`.
288
- /// Stores iteration state for lists, tuples, strings, ranges, dicts, and sets.
289
- Iter(&'a mut MontyIter),
290
- /// An arbitrary precision integer (LongInt).
291
- ///
292
- /// Stored on the heap to keep `Value` enum at 16 bytes. Python has one `int` type,
293
- /// so LongInt is an implementation detail - we use `Value::Int(i64)` for performance
294
- /// when values fit, and promote to LongInt on overflow. When LongInt results fit back
295
- /// in i64, they are demoted back to `Value::Int` for performance.
296
- LongInt(&'a mut LongInt),
297
- /// A Python module (e.g., `sys`, `typing`).
298
- ///
299
- /// Modules have a name and a dictionary of attributes. They are created by
300
- /// import statements and can have refs to other heap values in their attributes.
301
- Module(&'a mut Module),
302
- /// A coroutine object from an async function call.
303
- ///
304
- /// Contains pre-bound arguments and captured cells, ready to be awaited.
305
- /// When awaited, a new frame is pushed using the stored namespace.
306
- Coroutine(&'a mut Coroutine),
307
- /// A gather() result tracking multiple coroutines/tasks.
308
- ///
309
- /// Created by asyncio.gather() and spawns tasks when awaited.
310
- GatherFuture(&'a mut GatherFuture),
311
- /// A filesystem path from `pathlib.Path`.
312
- ///
313
- /// Stored on the heap to provide Python-compatible path operations.
314
- /// Pure methods (name, parent, etc.) are handled directly by the VM.
315
- /// I/O methods (exists, read_text, etc.) yield external function calls.
316
- Path(&'a mut Path),
317
- /// A regex match result from `re.match()`, `re.search()`, etc.
318
- ///
319
- /// Stores matched text, capture groups, and positions. All data is owned
320
- /// (no heap references), so reference counting is trivial.
321
- ReMatch(&'a mut ReMatch),
322
- /// A compiled regex pattern from `re.compile()`.
323
- ///
324
- /// Wraps a compiled regex with the original pattern string and flags.
325
- /// Custom serde serializes only the pattern and flags, recompiling on deserialize.
326
- RePattern(&'a mut RePattern),
327
- /// Reference to an external function where the name was not interned.
328
- ///
329
- /// Created when the host resolves a name lookup to a callable whose name
330
- /// does not match any interned string (e.g., the host returns a function
331
- /// with a different `__name__` than the variable it was assigned to).
332
- ExtFunction(&'a mut String),
333
- }
334
-
335
- /// Thin wrapper around `Value` which is used in the `Cell` variant above.
336
- ///
337
- /// The inner value is the cell's mutable payload.
338
- #[derive(Debug, serde::Serialize, serde::Deserialize)]
339
- #[serde(transparent)]
340
- #[repr(transparent)]
341
- pub(crate) struct CellValue(pub(crate) Value);
342
-
343
- impl std::ops::Deref for CellValue {
344
- type Target = Value;
345
-
346
- fn deref(&self) -> &Self::Target {
347
- &self.0
348
- }
349
- }
350
-
351
- /// A closure: a function that captures variables from enclosing scopes.
352
- ///
353
- /// Contains a reference to the function definition, a vector of captured cell HeapIds,
354
- /// and evaluated default values (if any). When the closure is called, these cells are
355
- /// passed to the RunFrame for variable access. When the closure is dropped, we must
356
- /// decrement the ref count on each captured cell and each default value.
357
- #[derive(Debug, serde::Serialize, serde::Deserialize)]
358
- pub(crate) struct Closure {
359
- /// The function definition being captured.
360
- pub func_id: FunctionId,
361
- /// Captured cells from enclosing scopes.
362
- pub cells: Vec<HeapId>,
363
- /// Evaluated default parameter values (if any).
364
- pub defaults: Vec<Value>,
365
- }
366
-
367
- /// A function with evaluated default parameter values (non-closure).
368
- ///
369
- /// Contains a reference to the function definition and the evaluated default values.
370
- /// When the function is called, defaults are cloned for missing optional parameters.
371
- /// When dropped, we must decrement the ref count on each default value.
372
- #[derive(Debug, serde::Serialize, serde::Deserialize)]
373
- pub(crate) struct FunctionDefaults {
374
- /// The function definition being captured.
375
- pub func_id: FunctionId,
376
- /// Evaluated default parameter values (if any).
377
- pub defaults: Vec<Value>,
378
- }
379
-
380
- impl HeapDataMut<'_> {
381
- /// Computes hash for immutable heap types that can be used as dict keys.
382
- ///
383
- /// Returns `Ok(Some(hash))` for immutable types (Str, Bytes, Tuple of hashables).
384
- /// Returns `Ok(None)` for mutable types (List, Dict) which cannot be dict keys.
385
- /// Returns `Err(ResourceError::Recursion)` if the recursion limit is exceeded
386
- /// while hashing deeply nested containers (e.g., tuples of tuples).
387
- ///
388
- /// This is called lazily when the value is first used as a dict key,
389
- /// avoiding unnecessary hash computation for values that are never used as keys.
390
- pub fn compute_hash_if_immutable(
391
- &self,
392
- heap: &mut Heap<impl ResourceTracker>,
393
- interns: &Interns,
394
- ) -> Result<Option<u64>, ResourceError> {
395
- match self {
396
- // Hash just the actual string or bytes content for consistency with Value::InternString/InternBytes
397
- // hence we don't include the discriminant
398
- Self::Str(s) => {
399
- let mut hasher = DefaultHasher::new();
400
- s.as_str().hash(&mut hasher);
401
- Ok(Some(hasher.finish()))
402
- }
403
- Self::Bytes(b) => {
404
- let mut hasher = DefaultHasher::new();
405
- b.as_slice().hash(&mut hasher);
406
- Ok(Some(hasher.finish()))
407
- }
408
- Self::FrozenSet(fs) => {
409
- // FrozenSet hash is XOR of element hashes (order-independent)
410
- // Recursion depth is checked inside compute_hash
411
- fs.compute_hash(heap, interns)
412
- }
413
- Self::Tuple(t) => {
414
- let token = heap.incr_recursion_depth()?;
415
- crate::defer_drop!(token, heap);
416
- let mut hasher = DefaultHasher::new();
417
- discriminant(self).hash(&mut hasher);
418
- // Tuple is hashable only if all elements are hashable
419
- for obj in t.as_slice() {
420
- match obj.py_hash(heap, interns)? {
421
- Some(h) => h.hash(&mut hasher),
422
- None => return Ok(None),
423
- }
424
- }
425
- Ok(Some(hasher.finish()))
426
- }
427
- Self::NamedTuple(nt) => {
428
- let token = heap.incr_recursion_depth()?;
429
- crate::defer_drop!(token, heap);
430
- let mut hasher = DefaultHasher::new();
431
- discriminant(self).hash(&mut hasher);
432
- // Hash only by elements (not type_name) to match equality semantics
433
- for obj in nt.as_vec() {
434
- match obj.py_hash(heap, interns)? {
435
- Some(h) => h.hash(&mut hasher),
436
- None => return Ok(None),
437
- }
438
- }
439
- Ok(Some(hasher.finish()))
440
- }
441
- Self::Closure(closure) => {
442
- let mut hasher = DefaultHasher::new();
443
- discriminant(self).hash(&mut hasher);
444
- // TODO, this is NOT proper hashing, we should somehow hash the function properly
445
- closure.func_id.hash(&mut hasher);
446
- Ok(Some(hasher.finish()))
447
- }
448
- Self::FunctionDefaults(fd) => {
449
- let mut hasher = DefaultHasher::new();
450
- discriminant(self).hash(&mut hasher);
451
- // TODO, this is NOT proper hashing, we should somehow hash the function properly
452
- fd.func_id.hash(&mut hasher);
453
- Ok(Some(hasher.finish()))
454
- }
455
- Self::Range(range) => {
456
- let mut hasher = DefaultHasher::new();
457
- discriminant(self).hash(&mut hasher);
458
- range.start.hash(&mut hasher);
459
- range.stop.hash(&mut hasher);
460
- range.step.hash(&mut hasher);
461
- Ok(Some(hasher.finish()))
462
- }
463
- // Dataclass hashability depends on the mutable flag
464
- // Recursion depth is checked inside compute_hash
465
- Self::Dataclass(dc) => dc.compute_hash(heap, interns),
466
- // Slices are immutable and hashable (like in CPython)
467
- Self::Slice(slice) => {
468
- let mut hasher = DefaultHasher::new();
469
- discriminant(self).hash(&mut hasher);
470
- slice.start.hash(&mut hasher);
471
- slice.stop.hash(&mut hasher);
472
- slice.step.hash(&mut hasher);
473
- Ok(Some(hasher.finish()))
474
- }
475
- // Path is immutable and hashable
476
- Self::Path(path) => {
477
- let mut hasher = DefaultHasher::new();
478
- discriminant(self).hash(&mut hasher);
479
- path.as_str().hash(&mut hasher);
480
- Ok(Some(hasher.finish()))
481
- }
482
- // LongInt is immutable and hashable
483
- Self::LongInt(li) => Ok(Some(li.hash())),
484
- // ExtFunction is hashable by name
485
- Self::ExtFunction(name) => {
486
- let mut hasher = DefaultHasher::new();
487
- discriminant(self).hash(&mut hasher);
488
- name.hash(&mut hasher);
489
- Ok(Some(hasher.finish()))
490
- }
491
- // other types cannot be hashed (Cell is handled specially in get_or_compute_hash)
492
- _ => Ok(None),
493
- }
494
- }
495
- }
496
-
497
- /// Shared dispatch macro for `PyTrait` methods on `HeapData` and `HeapDataMut`.
498
- ///
499
- /// Both enums have identical variants (owned vs borrowed) and identical dispatch
500
- /// logic. This macro eliminates the duplication by generating the match arms for
501
- /// each method. The caller provides `self` and the method body for each variant.
502
- macro_rules! impl_py_trait_dispatch {
503
- ($self_ty:ty) => {
504
- impl PyTrait for $self_ty {
505
- fn py_type(&self, heap: &Heap<impl ResourceTracker>) -> Type {
506
- match self {
507
- Self::Str(s) => s.py_type(heap),
508
- Self::Bytes(b) => b.py_type(heap),
509
- Self::List(l) => l.py_type(heap),
510
- Self::Tuple(t) => t.py_type(heap),
511
- Self::NamedTuple(nt) => nt.py_type(heap),
512
- Self::Dict(d) => d.py_type(heap),
513
- Self::DictKeysView(view) => view.py_type(heap),
514
- Self::DictItemsView(view) => view.py_type(heap),
515
- Self::DictValuesView(view) => view.py_type(heap),
516
- Self::Set(s) => s.py_type(heap),
517
- Self::FrozenSet(fs) => fs.py_type(heap),
518
- Self::Closure(_) | Self::FunctionDefaults(_) | Self::ExtFunction(_) => Type::Function,
519
- Self::Cell(_) => Type::Cell,
520
- Self::Range(_) => Type::Range,
521
- Self::Slice(_) => Type::Slice,
522
- Self::Exception(e) => e.py_type(),
523
- Self::Dataclass(dc) => dc.py_type(heap),
524
- Self::Iter(_) => Type::Iterator,
525
- // LongInt is still `int` in Python - it's an implementation detail
526
- Self::LongInt(_) => Type::Int,
527
- Self::Module(_) => Type::Module,
528
- Self::Coroutine(_) | Self::GatherFuture(_) => Type::Coroutine,
529
- Self::Path(p) => p.py_type(heap),
530
- Self::ReMatch(m) => m.py_type(heap),
531
- Self::RePattern(p) => p.py_type(heap),
532
- }
533
- }
534
-
535
- fn py_estimate_size(&self) -> usize {
536
- match self {
537
- Self::Str(s) => s.py_estimate_size(),
538
- Self::Bytes(b) => b.py_estimate_size(),
539
- Self::List(l) => l.py_estimate_size(),
540
- Self::Tuple(t) => t.py_estimate_size(),
541
- Self::NamedTuple(nt) => nt.py_estimate_size(),
542
- Self::Dict(d) => d.py_estimate_size(),
543
- Self::DictKeysView(view) => view.py_estimate_size(),
544
- Self::DictItemsView(view) => view.py_estimate_size(),
545
- Self::DictValuesView(view) => view.py_estimate_size(),
546
- Self::Set(s) => s.py_estimate_size(),
547
- Self::FrozenSet(fs) => fs.py_estimate_size(),
548
- // TODO: should include size of captured cells and defaults
549
- Self::Closure(_) | Self::FunctionDefaults(_) => 0,
550
- Self::Cell(cell) => std::mem::size_of::<Value>() + cell.0.py_estimate_size(),
551
- Self::Range(_) => std::mem::size_of::<Range>(),
552
- Self::Slice(s) => s.py_estimate_size(),
553
- Self::Exception(e) => std::mem::size_of::<SimpleException>() + e.arg().map_or(0, String::len),
554
- Self::Dataclass(dc) => dc.py_estimate_size(),
555
- Self::Iter(_) => std::mem::size_of::<MontyIter>(),
556
- Self::LongInt(li) => li.estimate_size(),
557
- Self::Module(m) => std::mem::size_of::<Module>() + m.attrs().py_estimate_size(),
558
- Self::Coroutine(coro) => {
559
- std::mem::size_of::<Coroutine>() + coro.namespace.len() * std::mem::size_of::<Value>()
560
- }
561
- Self::GatherFuture(gather) => {
562
- std::mem::size_of::<GatherFuture>()
563
- + gather.items.len() * std::mem::size_of::<crate::asyncio::GatherItem>()
564
- + gather.results.len() * std::mem::size_of::<Option<Value>>()
565
- + gather.pending_calls.len() * std::mem::size_of::<crate::asyncio::CallId>()
566
- }
567
- Self::Path(p) => p.py_estimate_size(),
568
- Self::ReMatch(m) => m.py_estimate_size(),
569
- Self::RePattern(p) => p.py_estimate_size(),
570
- Self::ExtFunction(s) => std::mem::size_of::<String>() + s.len(),
571
- }
572
- }
573
-
574
- fn py_len(&self, vm: &VM<'_, '_, impl ResourceTracker>) -> Option<usize> {
575
- match self {
576
- Self::Str(s) => s.py_len(vm),
577
- Self::Bytes(b) => b.py_len(vm),
578
- Self::List(l) => l.py_len(vm),
579
- Self::Tuple(t) => t.py_len(vm),
580
- Self::NamedTuple(nt) => nt.py_len(vm),
581
- Self::Dict(d) => d.py_len(vm),
582
- Self::DictKeysView(view) => view.py_len(vm),
583
- Self::DictItemsView(view) => view.py_len(vm),
584
- Self::DictValuesView(view) => view.py_len(vm),
585
- Self::Set(s) => s.py_len(vm),
586
- Self::FrozenSet(fs) => fs.py_len(vm),
587
- Self::Range(r) => Some(r.len()),
588
- // other types don't have length
589
- _ => None,
590
- }
591
- }
592
-
593
- fn py_eq(&self, other: &Self, vm: &mut VM<'_, '_, impl ResourceTracker>) -> Result<bool, ResourceError> {
594
- match (self, other) {
595
- (Self::Str(a), Self::Str(b)) => a.py_eq(b, vm),
596
- (Self::Bytes(a), Self::Bytes(b)) => a.py_eq(b, vm),
597
- (Self::List(a), Self::List(b)) => a.py_eq(b, vm),
598
- (Self::Tuple(a), Self::Tuple(b)) => a.py_eq(b, vm),
599
- (Self::NamedTuple(a), Self::NamedTuple(b)) => a.py_eq(b, vm),
600
- // NamedTuple can compare with Tuple by elements (matching CPython behavior)
601
- (Self::NamedTuple(nt), Self::Tuple(t)) | (Self::Tuple(t), Self::NamedTuple(nt)) => {
602
- let nt_items = nt.as_vec();
603
- let t_items = t.as_slice();
604
- if nt_items.len() != t_items.len() {
605
- return Ok(false);
606
- }
607
- // Helper function pattern: acquire token, call helper, drop token.
608
- // Cannot use defer_drop! here because the helper needs &mut VM.
609
- let token = vm.heap.incr_recursion_depth()?;
610
- defer_drop!(token, vm);
611
- for (a, b) in nt_items.iter().zip(t_items.iter()) {
612
- if !a.py_eq(b, vm)? {
613
- return Ok(false);
614
- }
615
- }
616
- Ok(true)
617
- }
618
- (Self::Dict(a), Self::Dict(b)) => a.py_eq(b, vm),
619
- (Self::DictKeysView(a), Self::DictKeysView(b)) => a.py_eq(b, vm),
620
- (Self::DictItemsView(a), Self::DictItemsView(b)) => a.py_eq(b, vm),
621
- (Self::DictValuesView(_), Self::DictValuesView(_)) => Ok(false),
622
- (Self::DictKeysView(a), Self::Set(b)) | (Self::Set(b), Self::DictKeysView(a)) => a.eq_set(b, vm),
623
- (Self::DictKeysView(a), Self::FrozenSet(b)) | (Self::FrozenSet(b), Self::DictKeysView(a)) => {
624
- a.eq_frozenset(b, vm)
625
- }
626
- (Self::DictItemsView(a), Self::Set(b)) | (Self::Set(b), Self::DictItemsView(a)) => a.eq_set(b, vm),
627
- (Self::DictItemsView(a), Self::FrozenSet(b)) | (Self::FrozenSet(b), Self::DictItemsView(a)) => {
628
- a.eq_frozenset(b, vm)
629
- }
630
- (Self::Set(a), Self::Set(b)) => a.py_eq(b, vm),
631
- (Self::FrozenSet(a), Self::FrozenSet(b)) => a.py_eq(b, vm),
632
- (Self::Closure(a), Self::Closure(b)) => Ok(a.func_id == b.func_id && a.cells == b.cells),
633
- (Self::FunctionDefaults(a), Self::FunctionDefaults(b)) => Ok(a.func_id == b.func_id),
634
- (Self::Range(a), Self::Range(b)) => a.py_eq(b, vm),
635
- (Self::Dataclass(a), Self::Dataclass(b)) => a.py_eq(b, vm),
636
- // LongInt equality
637
- (Self::LongInt(a), Self::LongInt(b)) => Ok(a == b),
638
- // Slice equality
639
- (Self::Slice(a), Self::Slice(b)) => a.py_eq(b, vm),
640
- // Path equality
641
- (Self::Path(a), Self::Path(b)) => a.py_eq(b, vm),
642
- // ReMatch objects are not comparable
643
- (Self::ReMatch(a), Self::ReMatch(b)) => a.py_eq(b, vm),
644
- // RePattern equality by pattern string and flags
645
- (Self::RePattern(a), Self::RePattern(b)) => a.py_eq(b, vm),
646
- // Cells, Exceptions, Iterators, Modules, and async types compare by identity only
647
- // (handled at Value level via HeapId comparison)
648
- (Self::Cell(_), Self::Cell(_))
649
- | (Self::Exception(_), Self::Exception(_))
650
- | (Self::Iter(_), Self::Iter(_))
651
- | (Self::Module(_), Self::Module(_))
652
- | (Self::Coroutine(_), Self::Coroutine(_))
653
- | (Self::GatherFuture(_), Self::GatherFuture(_)) => Ok(false),
654
- _ => Ok(false), // Different types are never equal
655
- }
656
- }
657
-
658
- fn py_cmp(
659
- &self,
660
- other: &Self,
661
- vm: &mut VM<'_, '_, impl ResourceTracker>,
662
- ) -> Result<Option<std::cmp::Ordering>, ResourceError> {
663
- match (self, other) {
664
- (Self::Str(a), Self::Str(b)) => a.py_cmp(b, vm),
665
- (Self::Bytes(a), Self::Bytes(b)) => a.py_cmp(b, vm),
666
- (Self::Tuple(a), Self::Tuple(b)) => a.py_cmp(b, vm),
667
- _ => Ok(None),
668
- }
669
- }
670
-
671
- fn py_dec_ref_ids(&mut self, stack: &mut Vec<HeapId>) {
672
- match self {
673
- Self::Str(s) => s.py_dec_ref_ids(stack),
674
- Self::Bytes(b) => b.py_dec_ref_ids(stack),
675
- Self::List(l) => l.py_dec_ref_ids(stack),
676
- Self::Tuple(t) => t.py_dec_ref_ids(stack),
677
- Self::NamedTuple(nt) => nt.py_dec_ref_ids(stack),
678
- Self::Dict(d) => d.py_dec_ref_ids(stack),
679
- Self::DictKeysView(view) => view.py_dec_ref_ids(stack),
680
- Self::DictItemsView(view) => view.py_dec_ref_ids(stack),
681
- Self::DictValuesView(view) => view.py_dec_ref_ids(stack),
682
- Self::Set(s) => s.py_dec_ref_ids(stack),
683
- Self::FrozenSet(fs) => fs.py_dec_ref_ids(stack),
684
- Self::Closure(closure) => {
685
- // Decrement ref count for captured cells
686
- stack.extend(closure.cells.iter().copied());
687
- // Decrement ref count for default values that are heap references
688
- for default in &mut closure.defaults {
689
- default.py_dec_ref_ids(stack);
690
- }
691
- }
692
- Self::FunctionDefaults(fd) => {
693
- // Decrement ref count for default values that are heap references
694
- for default in &mut fd.defaults {
695
- default.py_dec_ref_ids(stack);
696
- }
697
- }
698
- Self::Cell(cell) => cell.0.py_dec_ref_ids(stack),
699
- Self::Dataclass(dc) => dc.py_dec_ref_ids(stack),
700
- Self::Iter(iter) => iter.py_dec_ref_ids(stack),
701
- Self::Module(m) => m.py_dec_ref_ids(stack),
702
- Self::Coroutine(coro) => {
703
- // Decrement ref count for namespace values that are heap references
704
- for value in &mut coro.namespace {
705
- value.py_dec_ref_ids(stack);
706
- }
707
- }
708
- Self::GatherFuture(gather) => {
709
- // Decrement ref count for coroutine HeapIds
710
- for item in &gather.items {
711
- if let GatherItem::Coroutine(id) = item {
712
- stack.push(*id);
713
- }
714
- }
715
- // Decrement ref count for result values that are heap references
716
- for result in gather.results.iter_mut().flatten() {
717
- result.py_dec_ref_ids(stack);
718
- }
719
- }
720
- // other types have no nested heap references
721
- _ => {}
722
- }
723
- }
724
-
725
- fn py_bool(&self, vm: &VM<'_, '_, impl ResourceTracker>) -> bool {
726
- match self {
727
- Self::Str(s) => s.py_bool(vm),
728
- Self::Bytes(b) => b.py_bool(vm),
729
- Self::List(l) => l.py_bool(vm),
730
- Self::Tuple(t) => t.py_bool(vm),
731
- Self::NamedTuple(nt) => nt.py_bool(vm),
732
- Self::Dict(d) => d.py_bool(vm),
733
- Self::DictKeysView(view) => view.py_bool(vm),
734
- Self::DictItemsView(view) => view.py_bool(vm),
735
- Self::DictValuesView(view) => view.py_bool(vm),
736
- Self::Set(s) => s.py_bool(vm),
737
- Self::FrozenSet(fs) => fs.py_bool(vm),
738
- Self::Closure(_) | Self::FunctionDefaults(_) | Self::ExtFunction(_) => true,
739
- Self::Cell(_) => true, // Cells are always truthy
740
- Self::Range(r) => r.py_bool(vm),
741
- Self::Slice(s) => s.py_bool(vm),
742
- Self::Exception(_) => true, // Exceptions are always truthy
743
- Self::Dataclass(dc) => dc.py_bool(vm),
744
- Self::Iter(_) => true, // Iterators are always truthy
745
- Self::LongInt(li) => !li.is_zero(),
746
- Self::Module(_) => true, // Modules are always truthy
747
- Self::Coroutine(_) => true, // Coroutines are always truthy
748
- Self::GatherFuture(_) => true, // GatherFutures are always truthy
749
- Self::Path(p) => p.py_bool(vm),
750
- Self::ReMatch(m) => m.py_bool(vm),
751
- Self::RePattern(p) => p.py_bool(vm),
752
- }
753
- }
754
-
755
- fn py_repr_fmt(
756
- &self,
757
- f: &mut impl Write,
758
- vm: &VM<'_, '_, impl ResourceTracker>,
759
- heap_ids: &mut AHashSet<HeapId>,
760
- ) -> std::fmt::Result {
761
- match self {
762
- Self::Str(s) => s.py_repr_fmt(f, vm, heap_ids),
763
- Self::Bytes(b) => b.py_repr_fmt(f, vm, heap_ids),
764
- Self::List(l) => l.py_repr_fmt(f, vm, heap_ids),
765
- Self::Tuple(t) => t.py_repr_fmt(f, vm, heap_ids),
766
- Self::NamedTuple(nt) => nt.py_repr_fmt(f, vm, heap_ids),
767
- Self::Dict(d) => d.py_repr_fmt(f, vm, heap_ids),
768
- Self::DictKeysView(view) => view.py_repr_fmt(f, vm, heap_ids),
769
- Self::DictItemsView(view) => view.py_repr_fmt(f, vm, heap_ids),
770
- Self::DictValuesView(view) => view.py_repr_fmt(f, vm, heap_ids),
771
- Self::Set(s) => s.py_repr_fmt(f, vm, heap_ids),
772
- Self::FrozenSet(fs) => fs.py_repr_fmt(f, vm, heap_ids),
773
- Self::Closure(closure) => vm
774
- .interns
775
- .get_function(closure.func_id)
776
- .py_repr_fmt(f, vm.interns, 0),
777
- Self::FunctionDefaults(fd) => vm.interns.get_function(fd.func_id).py_repr_fmt(f, vm.interns, 0),
778
- // Cell repr shows the contained value's type
779
- Self::Cell(cell) => write!(f, "<cell: {} object>", cell.0.py_type(vm.heap)),
780
- Self::Range(r) => r.py_repr_fmt(f, vm, heap_ids),
781
- Self::Slice(s) => s.py_repr_fmt(f, vm, heap_ids),
782
- Self::Exception(e) => e.py_repr_fmt(f),
783
- Self::Dataclass(dc) => dc.py_repr_fmt(f, vm, heap_ids),
784
- Self::Iter(_) => write!(f, "<iterator>"),
785
- Self::LongInt(li) => write!(f, "{li}"),
786
- Self::Module(m) => write!(f, "<module '{}'>", vm.interns.get_str(m.name())),
787
- Self::Coroutine(coro) => {
788
- let func = vm.interns.get_function(coro.func_id);
789
- let name = vm.interns.get_str(func.name.name_id);
790
- write!(f, "<coroutine object {name}>")
791
- }
792
- Self::GatherFuture(gather) => write!(f, "<gather({})>", gather.item_count()),
793
- Self::Path(p) => p.py_repr_fmt(f, vm, heap_ids),
794
- Self::ReMatch(m) => m.py_repr_fmt(f, vm, heap_ids),
795
- Self::RePattern(p) => p.py_repr_fmt(f, vm, heap_ids),
796
- Self::ExtFunction(name) => write!(f, "<function '{name}' external>"),
797
- }
798
- }
799
-
800
- fn py_str(&self, vm: &VM<'_, '_, impl ResourceTracker>) -> Cow<'static, str> {
801
- match self {
802
- // Strings return their value directly without quotes
803
- Self::Str(s) => s.py_str(vm),
804
- // LongInt returns its string representation
805
- Self::LongInt(li) => Cow::Owned(li.to_string()),
806
- // Exceptions return just the message (or empty string if no message)
807
- Self::Exception(e) => Cow::Owned(e.py_str()),
808
- // Paths return the path string without the PosixPath() wrapper
809
- Self::Path(p) => Cow::Owned(p.as_str().to_owned()),
810
- // All other types use repr
811
- _ => self.py_repr(vm),
812
- }
813
- }
814
-
815
- fn py_add(
816
- &self,
817
- other: &Self,
818
- vm: &mut VM<'_, '_, impl ResourceTracker>,
819
- ) -> Result<Option<Value>, ResourceError> {
820
- match (self, other) {
821
- (Self::Str(a), Self::Str(b)) => a.py_add(b, vm),
822
- (Self::Bytes(a), Self::Bytes(b)) => a.py_add(b, vm),
823
- (Self::List(a), Self::List(b)) => a.py_add(b, vm),
824
- (Self::Tuple(a), Self::Tuple(b)) => a.py_add(b, vm),
825
- (Self::Dict(a), Self::Dict(b)) => a.py_add(b, vm),
826
- (Self::LongInt(a), Self::LongInt(b)) => {
827
- let bi = a.inner() + b.inner();
828
- Ok(LongInt::new(bi).into_value(vm.heap).map(Some)?)
829
- }
830
- // Cells and Dataclasses don't support arithmetic operations
831
- _ => Ok(None),
832
- }
833
- }
834
-
835
- fn py_sub(
836
- &self,
837
- other: &Self,
838
- vm: &mut VM<'_, '_, impl ResourceTracker>,
839
- ) -> Result<Option<Value>, ResourceError> {
840
- match (self, other) {
841
- (Self::Str(a), Self::Str(b)) => a.py_sub(b, vm),
842
- (Self::Bytes(a), Self::Bytes(b)) => a.py_sub(b, vm),
843
- (Self::List(a), Self::List(b)) => a.py_sub(b, vm),
844
- (Self::Tuple(a), Self::Tuple(b)) => a.py_sub(b, vm),
845
- (Self::Dict(a), Self::Dict(b)) => a.py_sub(b, vm),
846
- (Self::Set(a), Self::Set(b)) => a.py_sub(b, vm),
847
- (Self::FrozenSet(a), Self::FrozenSet(b)) => a.py_sub(b, vm),
848
- (Self::LongInt(a), Self::LongInt(b)) => {
849
- let bi = a.inner() - b.inner();
850
- Ok(LongInt::new(bi).into_value(vm.heap).map(Some)?)
851
- }
852
- // Cells don't support arithmetic operations
853
- _ => Ok(None),
854
- }
855
- }
856
-
857
- fn py_mod(&self, other: &Self, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<Option<Value>> {
858
- match (self, other) {
859
- (Self::Str(a), Self::Str(b)) => a.py_mod(b, vm),
860
- (Self::Bytes(a), Self::Bytes(b)) => a.py_mod(b, vm),
861
- (Self::List(a), Self::List(b)) => a.py_mod(b, vm),
862
- (Self::Tuple(a), Self::Tuple(b)) => a.py_mod(b, vm),
863
- (Self::Dict(a), Self::Dict(b)) => a.py_mod(b, vm),
864
- (Self::LongInt(a), Self::LongInt(b)) => {
865
- if b.is_zero() {
866
- Err(ExcType::zero_division().into())
867
- } else {
868
- let bi = a.inner().mod_floor(b.inner());
869
- Ok(LongInt::new(bi).into_value(vm.heap).map(Some)?)
870
- }
871
- }
872
- // Cells don't support arithmetic operations
873
- _ => Ok(None),
874
- }
875
- }
876
-
877
- fn py_mod_eq(&self, other: &Self, right_value: i64) -> Option<bool> {
878
- match (self, other) {
879
- (Self::Str(a), Self::Str(b)) => a.py_mod_eq(b, right_value),
880
- (Self::Bytes(a), Self::Bytes(b)) => a.py_mod_eq(b, right_value),
881
- (Self::List(a), Self::List(b)) => a.py_mod_eq(b, right_value),
882
- (Self::Tuple(a), Self::Tuple(b)) => a.py_mod_eq(b, right_value),
883
- (Self::Dict(a), Self::Dict(b)) => a.py_mod_eq(b, right_value),
884
- // Cells don't support arithmetic operations
885
- _ => None,
886
- }
887
- }
888
-
889
- fn py_iadd(
890
- &mut self,
891
- other: &Value,
892
- vm: &mut VM<'_, '_, impl ResourceTracker>,
893
- self_id: Option<HeapId>,
894
- ) -> Result<bool, ResourceError> {
895
- match self {
896
- Self::List(list) => list.py_iadd(other, vm, self_id),
897
- Self::Dict(dict) => dict.py_iadd(other, vm, self_id),
898
- _ => Ok(false),
899
- }
900
- }
901
-
902
- fn py_call_attr(
903
- &mut self,
904
- self_id: HeapId,
905
- vm: &mut VM<'_, '_, impl ResourceTracker>,
906
- attr: &EitherStr,
907
- args: ArgValues,
908
- ) -> RunResult<CallResult> {
909
- match self {
910
- Self::Str(s) => s.py_call_attr(self_id, vm, attr, args),
911
- Self::Bytes(b) => b.py_call_attr(self_id, vm, attr, args),
912
- Self::List(l) => l.py_call_attr(self_id, vm, attr, args),
913
- Self::Tuple(t) => t.py_call_attr(self_id, vm, attr, args),
914
- Self::Dict(d) => d.py_call_attr(self_id, vm, attr, args),
915
- Self::DictKeysView(view) => view.py_call_attr(self_id, vm, attr, args),
916
- Self::DictItemsView(view) => view.py_call_attr(self_id, vm, attr, args),
917
- Self::DictValuesView(view) => view.py_call_attr(self_id, vm, attr, args),
918
- Self::Set(s) => s.py_call_attr(self_id, vm, attr, args),
919
- Self::FrozenSet(fs) => fs.py_call_attr(self_id, vm, attr, args),
920
- Self::Dataclass(dc) => dc.py_call_attr(self_id, vm, attr, args),
921
- Self::Path(p) => p.py_call_attr(self_id, vm, attr, args),
922
- Self::Module(m) => m.py_call_attr(self_id, vm, attr, args),
923
- Self::ReMatch(m) => m.py_call_attr(self_id, vm, attr, args),
924
- Self::RePattern(p) => p.py_call_attr(self_id, vm, attr, args),
925
- _ => Err(ExcType::attribute_error(
926
- self.py_type(vm.heap),
927
- attr.as_str(vm.interns),
928
- )),
929
- }
930
- }
931
-
932
- fn py_getitem(&self, key: &Value, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<Value> {
933
- match self {
934
- Self::Str(s) => s.py_getitem(key, vm),
935
- Self::Bytes(b) => b.py_getitem(key, vm),
936
- Self::List(l) => l.py_getitem(key, vm),
937
- Self::Tuple(t) => t.py_getitem(key, vm),
938
- Self::NamedTuple(nt) => nt.py_getitem(key, vm),
939
- Self::Dict(d) => d.py_getitem(key, vm),
940
- Self::Range(r) => r.py_getitem(key, vm),
941
- Self::ReMatch(m) => m.py_getitem(key, vm),
942
- _ => Err(ExcType::type_error_not_sub(self.py_type(vm.heap))),
943
- }
944
- }
945
-
946
- fn py_setitem(
947
- &mut self,
948
- key: Value,
949
- value: Value,
950
- vm: &mut VM<'_, '_, impl ResourceTracker>,
951
- ) -> RunResult<()> {
952
- match self {
953
- Self::Str(s) => s.py_setitem(key, value, vm),
954
- Self::Bytes(b) => b.py_setitem(key, value, vm),
955
- Self::List(l) => l.py_setitem(key, value, vm),
956
- Self::Tuple(t) => t.py_setitem(key, value, vm),
957
- Self::Dict(d) => d.py_setitem(key, value, vm),
958
- _ => Err(ExcType::type_error_not_sub_assignment(self.py_type(vm.heap))),
959
- }
960
- }
961
-
962
- fn py_getattr(
963
- &self,
964
- attr: &EitherStr,
965
- vm: &mut VM<'_, '_, impl ResourceTracker>,
966
- ) -> RunResult<Option<CallResult>> {
967
- match self {
968
- Self::Dataclass(dc) => dc.py_getattr(attr, vm),
969
- Self::Module(m) => Ok(m.py_getattr(attr, vm.heap, vm.interns)),
970
- Self::NamedTuple(nt) => nt.py_getattr(attr, vm),
971
- Self::Slice(s) => s.py_getattr(attr, vm),
972
- Self::Exception(exc) => exc.py_getattr(attr, vm.heap, vm.interns),
973
- Self::Path(p) => p.py_getattr(attr, vm),
974
- Self::ReMatch(m) => m.py_getattr(attr, vm),
975
- Self::RePattern(p) => p.py_getattr(attr, vm),
976
- // All other types don't support attribute access via py_getattr
977
- _ => Ok(None),
978
- }
979
- }
980
- }
981
- };
982
- }
983
-
984
- impl_py_trait_dispatch!(HeapDataMut<'_>);
985
- impl_py_trait_dispatch!(HeapData);