superacli 1.1.4 → 1.1.6
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.
- package/__tests__/adapter-schema.test.js +2 -0
- package/__tests__/config.test.js +62 -1
- package/__tests__/help-json.test.js +2 -0
- package/__tests__/mcp-adapter.test.js +14 -4
- package/__tests__/mcp-local.test.js +159 -0
- package/__tests__/mcp-stdio-jsonrpc.test.js +105 -0
- package/__tests__/monty-plugin.test.js +121 -0
- package/__tests__/plugin-browser-use-uninstall.test.js +23 -0
- package/__tests__/plugin-browser-use.test.js +77 -0
- package/__tests__/plugins-command.test.js +92 -1
- package/__tests__/plugins-learn.test.js +62 -0
- package/__tests__/plugins-registry.test.js +3 -1
- package/__tests__/resend-plugin.test.js +122 -0
- package/__tests__/skills.test.js +4 -0
- package/cli/adapter-schema.js +3 -2
- package/cli/adapters/mcp.js +22 -3
- package/cli/adapters/process.js +34 -7
- package/cli/config.js +27 -1
- package/cli/help-json.js +2 -2
- package/cli/mcp-diagnostics.js +152 -0
- package/cli/mcp-discovery.js +221 -0
- package/cli/mcp-local.js +267 -25
- package/cli/mcp-stdio-jsonrpc.js +246 -0
- package/cli/plugin-install-guidance.js +25 -0
- package/cli/plugins-command.js +86 -3
- package/cli/plugins-learn.js +177 -0
- package/cli/plugins-manager.js +3 -0
- package/cli/plugins-registry.js +2 -1
- package/cli/skills-mcp.js +102 -0
- package/cli/skills.js +6 -40
- package/cli/supercli.js +7 -2
- package/docs/initial/mcp-local-mode.md +35 -0
- package/docs/mcp-cheatsheet.md +324 -0
- package/docs/plugins.md +7 -0
- package/package.json +1 -1
- package/plugins/browser-use/plugin.json +23 -0
- package/plugins/browser-use/scripts/post-install.js +146 -0
- package/plugins/browser-use/scripts/post-uninstall.js +28 -0
- package/plugins/browser-use/skills/quickstart/SKILL.md +47 -0
- package/plugins/monty/README.md +49 -0
- package/plugins/monty/plugin.json +69 -0
- package/plugins/monty/scripts/post-install.js +73 -0
- package/plugins/monty/scripts/post-uninstall.js +23 -0
- package/plugins/monty/scripts/run-python.js +140 -0
- package/plugins/monty/scripts/setup-monty.js +27 -0
- package/plugins/plugins.json +29 -0
- package/plugins/resend/plugin.json +371 -0
- package/plugins/resend/scripts/post-install.js +59 -0
- package/plugins/resend/scripts/post-uninstall.js +23 -0
- package/plugins/resend/scripts/setup-resend.js +27 -0
- package/plugins/resend/skills/quickstart/SKILL.md +80 -0
- package/ref-monty/.cargo/config.toml +3 -0
- package/ref-monty/.claude/settings.json +60 -0
- package/ref-monty/.claude/skills/fastmod/SKILL.md +22 -0
- package/ref-monty/.claude/skills/python-playground/SKILL.md +47 -0
- package/ref-monty/.codecov.yml +12 -0
- package/ref-monty/.github/actions/build-pgo-wheel/action.yml +72 -0
- package/ref-monty/.github/workflows/ci.yml +776 -0
- package/ref-monty/.github/workflows/codspeed.yml +45 -0
- package/ref-monty/.github/workflows/init-npm-packages.yml +82 -0
- package/ref-monty/.pre-commit-config.yaml +47 -0
- package/ref-monty/.python-version +1 -0
- package/ref-monty/.rustfmt.toml +4 -0
- package/ref-monty/.zed/settings.json +11 -0
- package/ref-monty/CLAUDE.md +535 -0
- package/ref-monty/Cargo.lock +3798 -0
- package/ref-monty/Cargo.toml +87 -0
- package/ref-monty/LICENSE +21 -0
- package/ref-monty/Makefile +216 -0
- package/ref-monty/README.md +430 -0
- package/ref-monty/RELEASING.md +47 -0
- package/ref-monty/crates/fuzz/Cargo.toml +30 -0
- package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +37 -0
- package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +552 -0
- package/ref-monty/crates/monty/Cargo.toml +68 -0
- package/ref-monty/crates/monty/benches/main.rs +247 -0
- package/ref-monty/crates/monty/build.rs +10 -0
- package/ref-monty/crates/monty/src/args.rs +733 -0
- package/ref-monty/crates/monty/src/asyncio.rs +179 -0
- package/ref-monty/crates/monty/src/builtins/abs.rs +55 -0
- package/ref-monty/crates/monty/src/builtins/all.rs +30 -0
- package/ref-monty/crates/monty/src/builtins/any.rs +30 -0
- package/ref-monty/crates/monty/src/builtins/bin.rs +59 -0
- package/ref-monty/crates/monty/src/builtins/chr.rs +46 -0
- package/ref-monty/crates/monty/src/builtins/divmod.rs +164 -0
- package/ref-monty/crates/monty/src/builtins/enumerate.rs +52 -0
- package/ref-monty/crates/monty/src/builtins/filter.rs +67 -0
- package/ref-monty/crates/monty/src/builtins/getattr.rs +65 -0
- package/ref-monty/crates/monty/src/builtins/hash.rs +28 -0
- package/ref-monty/crates/monty/src/builtins/hex.rs +58 -0
- package/ref-monty/crates/monty/src/builtins/id.rs +24 -0
- package/ref-monty/crates/monty/src/builtins/isinstance.rs +68 -0
- package/ref-monty/crates/monty/src/builtins/len.rs +25 -0
- package/ref-monty/crates/monty/src/builtins/map.rs +98 -0
- package/ref-monty/crates/monty/src/builtins/min_max.rs +113 -0
- package/ref-monty/crates/monty/src/builtins/mod.rs +246 -0
- package/ref-monty/crates/monty/src/builtins/next.rs +21 -0
- package/ref-monty/crates/monty/src/builtins/oct.rs +59 -0
- package/ref-monty/crates/monty/src/builtins/ord.rs +67 -0
- package/ref-monty/crates/monty/src/builtins/pow.rs +365 -0
- package/ref-monty/crates/monty/src/builtins/print.rs +141 -0
- package/ref-monty/crates/monty/src/builtins/repr.rs +16 -0
- package/ref-monty/crates/monty/src/builtins/reversed.rs +28 -0
- package/ref-monty/crates/monty/src/builtins/round.rs +174 -0
- package/ref-monty/crates/monty/src/builtins/sorted.rs +151 -0
- package/ref-monty/crates/monty/src/builtins/sum.rs +66 -0
- package/ref-monty/crates/monty/src/builtins/type_.rs +16 -0
- package/ref-monty/crates/monty/src/builtins/zip.rs +77 -0
- package/ref-monty/crates/monty/src/bytecode/builder.rs +699 -0
- package/ref-monty/crates/monty/src/bytecode/code.rs +310 -0
- package/ref-monty/crates/monty/src/bytecode/compiler.rs +3206 -0
- package/ref-monty/crates/monty/src/bytecode/mod.rs +24 -0
- package/ref-monty/crates/monty/src/bytecode/op.rs +617 -0
- package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +1058 -0
- package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +63 -0
- package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +487 -0
- package/ref-monty/crates/monty/src/bytecode/vm/call.rs +767 -0
- package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +741 -0
- package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +147 -0
- package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +297 -0
- package/ref-monty/crates/monty/src/bytecode/vm/format.rs +132 -0
- package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +1958 -0
- package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +620 -0
- package/ref-monty/crates/monty/src/exception_private.rs +1513 -0
- package/ref-monty/crates/monty/src/exception_public.rs +346 -0
- package/ref-monty/crates/monty/src/expressions.rs +694 -0
- package/ref-monty/crates/monty/src/fstring.rs +854 -0
- package/ref-monty/crates/monty/src/function.rs +119 -0
- package/ref-monty/crates/monty/src/heap.rs +1073 -0
- package/ref-monty/crates/monty/src/heap_data.rs +985 -0
- package/ref-monty/crates/monty/src/heap_traits.rs +312 -0
- package/ref-monty/crates/monty/src/intern.rs +837 -0
- package/ref-monty/crates/monty/src/io.rs +106 -0
- package/ref-monty/crates/monty/src/lib.rs +52 -0
- package/ref-monty/crates/monty/src/modules/asyncio.rs +144 -0
- package/ref-monty/crates/monty/src/modules/math.rs +1453 -0
- package/ref-monty/crates/monty/src/modules/mod.rs +120 -0
- package/ref-monty/crates/monty/src/modules/os.rs +116 -0
- package/ref-monty/crates/monty/src/modules/pathlib.rs +33 -0
- package/ref-monty/crates/monty/src/modules/re.rs +606 -0
- package/ref-monty/crates/monty/src/modules/sys.rs +60 -0
- package/ref-monty/crates/monty/src/modules/typing.rs +70 -0
- package/ref-monty/crates/monty/src/namespace.rs +21 -0
- package/ref-monty/crates/monty/src/object.rs +1040 -0
- package/ref-monty/crates/monty/src/os.rs +215 -0
- package/ref-monty/crates/monty/src/parse.rs +1730 -0
- package/ref-monty/crates/monty/src/prepare.rs +3015 -0
- package/ref-monty/crates/monty/src/repl.rs +1109 -0
- package/ref-monty/crates/monty/src/resource.rs +559 -0
- package/ref-monty/crates/monty/src/run.rs +457 -0
- package/ref-monty/crates/monty/src/run_progress.rs +821 -0
- package/ref-monty/crates/monty/src/signature.rs +651 -0
- package/ref-monty/crates/monty/src/sorting.rs +100 -0
- package/ref-monty/crates/monty/src/types/bytes.rs +2356 -0
- package/ref-monty/crates/monty/src/types/dataclass.rs +345 -0
- package/ref-monty/crates/monty/src/types/dict.rs +879 -0
- package/ref-monty/crates/monty/src/types/dict_view.rs +619 -0
- package/ref-monty/crates/monty/src/types/iter.rs +799 -0
- package/ref-monty/crates/monty/src/types/list.rs +929 -0
- package/ref-monty/crates/monty/src/types/long_int.rs +211 -0
- package/ref-monty/crates/monty/src/types/mod.rs +48 -0
- package/ref-monty/crates/monty/src/types/module.rs +146 -0
- package/ref-monty/crates/monty/src/types/namedtuple.rs +261 -0
- package/ref-monty/crates/monty/src/types/path.rs +596 -0
- package/ref-monty/crates/monty/src/types/property.rs +35 -0
- package/ref-monty/crates/monty/src/types/py_trait.rs +322 -0
- package/ref-monty/crates/monty/src/types/range.rs +285 -0
- package/ref-monty/crates/monty/src/types/re_match.rs +522 -0
- package/ref-monty/crates/monty/src/types/re_pattern.rs +726 -0
- package/ref-monty/crates/monty/src/types/set.rs +1373 -0
- package/ref-monty/crates/monty/src/types/slice.rs +257 -0
- package/ref-monty/crates/monty/src/types/str.rs +2051 -0
- package/ref-monty/crates/monty/src/types/tuple.rs +376 -0
- package/ref-monty/crates/monty/src/types/type.rs +407 -0
- package/ref-monty/crates/monty/src/value.rs +2558 -0
- package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__id_too_many.py +2 -0
- package/ref-monty/crates/monty/test_cases/args__len_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/args__len_too_many.py +2 -0
- package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +9 -0
- package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +9 -0
- package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +3 -0
- package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +2 -0
- package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +9 -0
- package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +2 -0
- package/ref-monty/crates/monty/test_cases/assert__fail.py +2 -0
- package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +2 -0
- package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +3 -0
- package/ref-monty/crates/monty/test_cases/assert__ops.py +11 -0
- package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +47 -0
- package/ref-monty/crates/monty/test_cases/async__basic.py +10 -0
- package/ref-monty/crates/monty/test_cases/async__closure.py +14 -0
- package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +16 -0
- package/ref-monty/crates/monty/test_cases/async__exception.py +10 -0
- package/ref-monty/crates/monty/test_cases/async__ext_call.py +73 -0
- package/ref-monty/crates/monty/test_cases/async__gather_all.py +85 -0
- package/ref-monty/crates/monty/test_cases/async__nested_await.py +15 -0
- package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +37 -0
- package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +10 -0
- package/ref-monty/crates/monty/test_cases/async__not_imported.py +14 -0
- package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +27 -0
- package/ref-monty/crates/monty/test_cases/async__return_types.py +31 -0
- package/ref-monty/crates/monty/test_cases/async__sequential.py +16 -0
- package/ref-monty/crates/monty/test_cases/async__traceback.py +19 -0
- package/ref-monty/crates/monty/test_cases/async__with_args.py +14 -0
- package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +12 -0
- package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +68 -0
- package/ref-monty/crates/monty/test_cases/bool__ops.py +20 -0
- package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/builtin__filter.py +62 -0
- package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +11 -0
- package/ref-monty/crates/monty/test_cases/builtin__getattr.py +84 -0
- package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +42 -0
- package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +66 -0
- package/ref-monty/crates/monty/test_cases/builtin__map.py +74 -0
- package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +11 -0
- package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +154 -0
- package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +148 -0
- package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +10 -0
- package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +9 -0
- package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +12 -0
- package/ref-monty/crates/monty/test_cases/builtin__repr.py +3 -0
- package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +73 -0
- package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +18 -0
- package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +10 -0
- package/ref-monty/crates/monty/test_cases/bytes__methods.py +394 -0
- package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +9 -0
- package/ref-monty/crates/monty/test_cases/bytes__ops.py +90 -0
- package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/call_object.py +3 -0
- package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +79 -0
- package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +81 -0
- package/ref-monty/crates/monty/test_cases/closure__pep448.py +203 -0
- package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +13 -0
- package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +120 -0
- package/ref-monty/crates/monty/test_cases/comprehension__all.py +208 -0
- package/ref-monty/crates/monty/test_cases/comprehension__scope.py +7 -0
- package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +14 -0
- package/ref-monty/crates/monty/test_cases/dataclass__basic.py +238 -0
- package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +12 -0
- package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +12 -0
- package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +3 -0
- package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +3 -0
- package/ref-monty/crates/monty/test_cases/dict__methods.py +151 -0
- package/ref-monty/crates/monty/test_cases/dict__ops.py +133 -0
- package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +4 -0
- package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +9 -0
- package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +3 -0
- package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/dict__views.py +165 -0
- package/ref-monty/crates/monty/test_cases/edge__all.py +26 -0
- package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +2 -0
- package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +2 -0
- package/ref-monty/crates/monty/test_cases/exc__args.py +16 -0
- package/ref-monty/crates/monty/test_cases/exc__str.py +15 -0
- package/ref-monty/crates/monty/test_cases/execute_ok__all.py +54 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +4 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +2 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +4 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +3 -0
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +4 -0
- package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +22 -0
- package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +7 -0
- package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +34 -0
- package/ref-monty/crates/monty/test_cases/ext_call__basic.py +99 -0
- package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +37 -0
- package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +16 -0
- package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +26 -0
- package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +18 -0
- package/ref-monty/crates/monty/test_cases/ext_call__elif.py +171 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc.py +4 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +39 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +31 -0
- package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +171 -0
- package/ref-monty/crates/monty/test_cases/ext_call__for.py +114 -0
- package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +12 -0
- package/ref-monty/crates/monty/test_cases/ext_call__if.py +135 -0
- package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +37 -0
- package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +14 -0
- package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +40 -0
- package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +7 -0
- package/ref-monty/crates/monty/test_cases/ext_call__literals.py +17 -0
- package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +32 -0
- package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +69 -0
- package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +4 -0
- package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +14 -0
- package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +19 -0
- package/ref-monty/crates/monty/test_cases/ext_call__return.py +28 -0
- package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +25 -0
- package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +7 -0
- package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +28 -0
- package/ref-monty/crates/monty/test_cases/ext_call__try.py +280 -0
- package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +10 -0
- package/ref-monty/crates/monty/test_cases/ext_call__unary.py +13 -0
- package/ref-monty/crates/monty/test_cases/frozenset__ops.py +178 -0
- package/ref-monty/crates/monty/test_cases/fstring__all.py +236 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +4 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +4 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +4 -0
- package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +3 -0
- package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__call_unpack.py +42 -0
- package/ref-monty/crates/monty/test_cases/function__defaults.py +117 -0
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +9 -0
- package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +9 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +9 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +13 -0
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +7 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +8 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +173 -0
- package/ref-monty/crates/monty/test_cases/function__ops.py +294 -0
- package/ref-monty/crates/monty/test_cases/function__return_none.py +42 -0
- package/ref-monty/crates/monty/test_cases/function__signatures.py +47 -0
- package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +6 -0
- package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +6 -0
- package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +7 -0
- package/ref-monty/crates/monty/test_cases/global__ops.py +163 -0
- package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +2 -0
- package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +2 -0
- package/ref-monty/crates/monty/test_cases/hash__ops.py +153 -0
- package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +3 -0
- package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +5 -0
- package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +3 -0
- package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +10 -0
- package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +6 -0
- package/ref-monty/crates/monty/test_cases/id__ops.py +97 -0
- package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +3 -0
- package/ref-monty/crates/monty/test_cases/if__elif_else.py +207 -0
- package/ref-monty/crates/monty/test_cases/if__raise_elif.py +11 -0
- package/ref-monty/crates/monty/test_cases/if__raise_else.py +13 -0
- package/ref-monty/crates/monty/test_cases/if__raise_if.py +9 -0
- package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +18 -0
- package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +16 -0
- package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +55 -0
- package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__local_scope.py +68 -0
- package/ref-monty/crates/monty/test_cases/import__os.py +25 -0
- package/ref-monty/crates/monty/test_cases/import__relative_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +14 -0
- package/ref-monty/crates/monty/test_cases/import__star_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/import__sys.py +47 -0
- package/ref-monty/crates/monty/test_cases/import__sys_monty.py +28 -0
- package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +37 -0
- package/ref-monty/crates/monty/test_cases/import__typing.py +25 -0
- package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +4 -0
- package/ref-monty/crates/monty/test_cases/int__bigint.py +467 -0
- package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +260 -0
- package/ref-monty/crates/monty/test_cases/int__ops.py +219 -0
- package/ref-monty/crates/monty/test_cases/int__overflow_division.py +84 -0
- package/ref-monty/crates/monty/test_cases/is_variant__all.py +36 -0
- package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +4 -0
- package/ref-monty/crates/monty/test_cases/iter__for.py +243 -0
- package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +66 -0
- package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +20 -0
- package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +7 -0
- package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +3 -0
- package/ref-monty/crates/monty/test_cases/lambda__all.py +145 -0
- package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +7 -0
- package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +3 -0
- package/ref-monty/crates/monty/test_cases/list__index_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +10 -0
- package/ref-monty/crates/monty/test_cases/list__ops.py +473 -0
- package/ref-monty/crates/monty/test_cases/list__pop_empty.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +13 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +13 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/longint__index_error.py +3 -0
- package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +3 -0
- package/ref-monty/crates/monty/test_cases/loop__break_continue.py +113 -0
- package/ref-monty/crates/monty/test_cases/loop__break_finally.py +69 -0
- package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +13 -0
- package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +55 -0
- package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +81 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +13 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +60 -0
- package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__module.py +1432 -0
- package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +259 -0
- package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +19 -0
- package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +12 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +9 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +9 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +16 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +10 -0
- package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +11 -0
- package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +34 -0
- package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +3 -0
- package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +353 -0
- package/ref-monty/crates/monty/test_cases/os__environ.py +40 -0
- package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +5 -0
- package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +5 -0
- package/ref-monty/crates/monty/test_cases/parse_error__complex.py +3 -0
- package/ref-monty/crates/monty/test_cases/pathlib__import.py +11 -0
- package/ref-monty/crates/monty/test_cases/pathlib__os.py +136 -0
- package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +12 -0
- package/ref-monty/crates/monty/test_cases/pathlib__pure.py +81 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +5 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +6 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +5 -0
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +6 -0
- package/ref-monty/crates/monty/test_cases/range__error_no_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +2 -0
- package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +2 -0
- package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/range__ops.py +236 -0
- package/ref-monty/crates/monty/test_cases/re__basic.py +756 -0
- package/ref-monty/crates/monty/test_cases/re__grouping.py +241 -0
- package/ref-monty/crates/monty/test_cases/re__match.py +148 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +26 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +23 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +46 -0
- package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +12 -0
- package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +13 -0
- package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +18 -0
- package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +12 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +14 -0
- package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +6 -0
- package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +16 -0
- package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +18 -0
- package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +25 -0
- package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +4 -0
- package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +27 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +6 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +5 -0
- package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +4 -0
- package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +37 -0
- package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +34 -0
- package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +31 -0
- package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +4 -0
- package/ref-monty/crates/monty/test_cases/refcount__single_list.py +3 -0
- package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +24 -0
- package/ref-monty/crates/monty/test_cases/set__ops.py +191 -0
- package/ref-monty/crates/monty/test_cases/set__review_bugs.py +35 -0
- package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +2 -0
- package/ref-monty/crates/monty/test_cases/slice__kwargs.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__no_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__ops.py +149 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +9 -0
- package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +10 -0
- package/ref-monty/crates/monty/test_cases/str__index_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_no_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_non_string.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__methods.py +327 -0
- package/ref-monty/crates/monty/test_cases/str__ops.py +162 -0
- package/ref-monty/crates/monty/test_cases/str__partition_empty.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +9 -0
- package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +9 -0
- package/ref-monty/crates/monty/test_cases/sys__types.py +7 -0
- package/ref-monty/crates/monty/test_cases/traceback__division_error.py +30 -0
- package/ref-monty/crates/monty/test_cases/traceback__index_error.py +17 -0
- package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +10 -0
- package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +29 -0
- package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +10 -0
- package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +24 -0
- package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +9 -0
- package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +23 -0
- package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +11 -0
- package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +16 -0
- package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +16 -0
- package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +16 -0
- package/ref-monty/crates/monty/test_cases/try_except__all.py +472 -0
- package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +2 -0
- package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +5 -0
- package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +3 -0
- package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +9 -0
- package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +10 -0
- package/ref-monty/crates/monty/test_cases/tuple__methods.py +19 -0
- package/ref-monty/crates/monty/test_cases/tuple__ops.py +133 -0
- package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +11 -0
- package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +2 -0
- package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__ops.py +200 -0
- package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +3 -0
- package/ref-monty/crates/monty/test_cases/type__shadow_int.py +9 -0
- package/ref-monty/crates/monty/test_cases/type__shadow_len.py +3 -0
- package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +6 -0
- package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +2 -0
- package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +4 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +3 -0
- package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +4 -0
- package/ref-monty/crates/monty/test_cases/typing__types.py +24 -0
- package/ref-monty/crates/monty/test_cases/unpack__nested.py +48 -0
- package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +9 -0
- package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +9 -0
- package/ref-monty/crates/monty/test_cases/unpack__ops.py +153 -0
- package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +9 -0
- package/ref-monty/crates/monty/test_cases/unpack__too_many.py +9 -0
- package/ref-monty/crates/monty/test_cases/version__cpython.py +4 -0
- package/ref-monty/crates/monty/test_cases/walrus__all.py +178 -0
- package/ref-monty/crates/monty/test_cases/while__all.py +206 -0
- package/ref-monty/crates/monty/tests/asyncio.rs +764 -0
- package/ref-monty/crates/monty/tests/binary_serde.rs +185 -0
- package/ref-monty/crates/monty/tests/bytecode_limits.rs +248 -0
- package/ref-monty/crates/monty/tests/datatest_runner.rs +2029 -0
- package/ref-monty/crates/monty/tests/inputs.rs +420 -0
- package/ref-monty/crates/monty/tests/json_serde.rs +250 -0
- package/ref-monty/crates/monty/tests/main.rs +71 -0
- package/ref-monty/crates/monty/tests/math_module.rs +114 -0
- package/ref-monty/crates/monty/tests/name_lookup.rs +482 -0
- package/ref-monty/crates/monty/tests/os_tests.rs +459 -0
- package/ref-monty/crates/monty/tests/parse_errors.rs +441 -0
- package/ref-monty/crates/monty/tests/print_writer.rs +238 -0
- package/ref-monty/crates/monty/tests/py_object.rs +121 -0
- package/ref-monty/crates/monty/tests/regex.rs +90 -0
- package/ref-monty/crates/monty/tests/repl.rs +344 -0
- package/ref-monty/crates/monty/tests/resource_limits.rs +1826 -0
- package/ref-monty/crates/monty/tests/try_from.rs +167 -0
- package/ref-monty/crates/monty-cli/Cargo.toml +25 -0
- package/ref-monty/crates/monty-cli/src/main.rs +541 -0
- package/ref-monty/crates/monty-js/.cargo/config.toml +2 -0
- package/ref-monty/crates/monty-js/.prettierignore +8 -0
- package/ref-monty/crates/monty-js/Cargo.toml +32 -0
- package/ref-monty/crates/monty-js/README.md +207 -0
- package/ref-monty/crates/monty-js/__test__/async.spec.ts +350 -0
- package/ref-monty/crates/monty-js/__test__/basic.spec.ts +114 -0
- package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +427 -0
- package/ref-monty/crates/monty-js/__test__/external.spec.ts +354 -0
- package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +143 -0
- package/ref-monty/crates/monty-js/__test__/limits.spec.ts +162 -0
- package/ref-monty/crates/monty-js/__test__/package.json +3 -0
- package/ref-monty/crates/monty-js/__test__/print.spec.ts +229 -0
- package/ref-monty/crates/monty-js/__test__/repl.spec.ts +34 -0
- package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +205 -0
- package/ref-monty/crates/monty-js/__test__/start.spec.ts +443 -0
- package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +147 -0
- package/ref-monty/crates/monty-js/__test__/types.spec.ts +319 -0
- package/ref-monty/crates/monty-js/build.rs +61 -0
- package/ref-monty/crates/monty-js/index-header.d.ts +3 -0
- package/ref-monty/crates/monty-js/package-lock.json +4694 -0
- package/ref-monty/crates/monty-js/package.json +100 -0
- package/ref-monty/crates/monty-js/scripts/smoke-test.sh +69 -0
- package/ref-monty/crates/monty-js/smoke-test/package.json +17 -0
- package/ref-monty/crates/monty-js/smoke-test/test.ts +171 -0
- package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +11 -0
- package/ref-monty/crates/monty-js/src/convert.rs +648 -0
- package/ref-monty/crates/monty-js/src/exceptions.rs +293 -0
- package/ref-monty/crates/monty-js/src/lib.rs +41 -0
- package/ref-monty/crates/monty-js/src/limits.rs +53 -0
- package/ref-monty/crates/monty-js/src/monty_cls.rs +1407 -0
- package/ref-monty/crates/monty-js/tsconfig.json +17 -0
- package/ref-monty/crates/monty-js/wrapper.ts +701 -0
- package/ref-monty/crates/monty-python/Cargo.toml +38 -0
- package/ref-monty/crates/monty-python/README.md +134 -0
- package/ref-monty/crates/monty-python/build.rs +4 -0
- package/ref-monty/crates/monty-python/example.py +40 -0
- package/ref-monty/crates/monty-python/exercise.py +46 -0
- package/ref-monty/crates/monty-python/pyproject.toml +57 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +281 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +677 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +933 -0
- package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
- package/ref-monty/crates/monty-python/src/convert.rs +273 -0
- package/ref-monty/crates/monty-python/src/dataclass.rs +461 -0
- package/ref-monty/crates/monty-python/src/exceptions.rs +557 -0
- package/ref-monty/crates/monty-python/src/external.rs +165 -0
- package/ref-monty/crates/monty-python/src/lib.rs +77 -0
- package/ref-monty/crates/monty-python/src/limits.rs +142 -0
- package/ref-monty/crates/monty-python/src/monty_cls.rs +1650 -0
- package/ref-monty/crates/monty-python/src/repl.rs +470 -0
- package/ref-monty/crates/monty-python/src/serialization.rs +761 -0
- package/ref-monty/crates/monty-python/tests/test_async.py +1201 -0
- package/ref-monty/crates/monty-python/tests/test_basic.py +66 -0
- package/ref-monty/crates/monty-python/tests/test_dataclasses.py +971 -0
- package/ref-monty/crates/monty-python/tests/test_exceptions.py +361 -0
- package/ref-monty/crates/monty-python/tests/test_external.py +367 -0
- package/ref-monty/crates/monty-python/tests/test_inputs.py +126 -0
- package/ref-monty/crates/monty-python/tests/test_limits.py +257 -0
- package/ref-monty/crates/monty-python/tests/test_os_access.py +1286 -0
- package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +731 -0
- package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +483 -0
- package/ref-monty/crates/monty-python/tests/test_os_calls.py +819 -0
- package/ref-monty/crates/monty-python/tests/test_print.py +208 -0
- package/ref-monty/crates/monty-python/tests/test_re.py +170 -0
- package/ref-monty/crates/monty-python/tests/test_readme_examples.py +20 -0
- package/ref-monty/crates/monty-python/tests/test_repl.py +749 -0
- package/ref-monty/crates/monty-python/tests/test_serialize.py +284 -0
- package/ref-monty/crates/monty-python/tests/test_start.py +346 -0
- package/ref-monty/crates/monty-python/tests/test_threading.py +163 -0
- package/ref-monty/crates/monty-python/tests/test_type_check.py +344 -0
- package/ref-monty/crates/monty-python/tests/test_types.py +553 -0
- package/ref-monty/crates/monty-type-checking/Cargo.toml +32 -0
- package/ref-monty/crates/monty-type-checking/src/db.rs +116 -0
- package/ref-monty/crates/monty-type-checking/src/lib.rs +4 -0
- package/ref-monty/crates/monty-type-checking/src/type_check.rs +280 -0
- package/ref-monty/crates/monty-type-checking/tests/bad_types.py +109 -0
- package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +21 -0
- package/ref-monty/crates/monty-type-checking/tests/good_types.py +475 -0
- package/ref-monty/crates/monty-type-checking/tests/main.rs +205 -0
- package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +56 -0
- package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +41 -0
- package/ref-monty/crates/monty-typeshed/Cargo.toml +29 -0
- package/ref-monty/crates/monty-typeshed/README.md +11 -0
- package/ref-monty/crates/monty-typeshed/build.rs +101 -0
- package/ref-monty/crates/monty-typeshed/custom/README.md +1 -0
- package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +138 -0
- package/ref-monty/crates/monty-typeshed/custom/os.pyi +87 -0
- package/ref-monty/crates/monty-typeshed/custom/sys.pyi +33 -0
- package/ref-monty/crates/monty-typeshed/src/lib.rs +56 -0
- package/ref-monty/crates/monty-typeshed/update.py +321 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +1 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +20 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +105 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +394 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +138 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +1434 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +527 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +2 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +502 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +376 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +149 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +87 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +395 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +8 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +337 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +33 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +741 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +1217 -0
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +716 -0
- package/ref-monty/docs/usage-guide.md +117 -0
- package/ref-monty/examples/README.md +3 -0
- package/ref-monty/examples/expense_analysis/README.md +3 -0
- package/ref-monty/examples/expense_analysis/data.py +124 -0
- package/ref-monty/examples/expense_analysis/main.py +115 -0
- package/ref-monty/examples/sql_playground/README.md +20 -0
- package/ref-monty/examples/sql_playground/external_functions.py +129 -0
- package/ref-monty/examples/sql_playground/main.py +81 -0
- package/ref-monty/examples/sql_playground/sandbox_code.py +82 -0
- package/ref-monty/examples/sql_playground/type_stubs.pyi +14 -0
- package/ref-monty/examples/web_scraper/README.md +15 -0
- package/ref-monty/examples/web_scraper/browser.py +56 -0
- package/ref-monty/examples/web_scraper/example_code.py +59 -0
- package/ref-monty/examples/web_scraper/external_functions.py +324 -0
- package/ref-monty/examples/web_scraper/main.py +193 -0
- package/ref-monty/examples/web_scraper/sub_agent.py +79 -0
- package/ref-monty/monty-npm.md +235 -0
- package/ref-monty/pyproject.toml +162 -0
- package/ref-monty/scripts/check_imports.py +91 -0
- package/ref-monty/scripts/codecov_diff.py +412 -0
- package/ref-monty/scripts/complete_tests.py +146 -0
- package/ref-monty/scripts/flamegraph_to_text.py +208 -0
- package/ref-monty/scripts/iter_test_methods.py +540 -0
- package/ref-monty/scripts/run_traceback.py +180 -0
- package/ref-monty/scripts/startup_performance.py +130 -0
- package/ref-monty/uv.lock +1779 -0
- package/temp_resend_cli/repo/.github/scripts/pr-title-check.js +34 -0
- package/temp_resend_cli/repo/.github/workflows/ci.yml +67 -0
- package/temp_resend_cli/repo/.github/workflows/post-release.yml +51 -0
- package/temp_resend_cli/repo/.github/workflows/pr-title-check.yml +13 -0
- package/temp_resend_cli/repo/.github/workflows/release.yml +175 -0
- package/temp_resend_cli/repo/.github/workflows/test-install-unix.yml +34 -0
- package/temp_resend_cli/repo/.github/workflows/test-install-windows.yml +48 -0
- package/temp_resend_cli/repo/CHANGELOG.md +31 -0
- package/temp_resend_cli/repo/LICENSE +21 -0
- package/temp_resend_cli/repo/README.md +450 -0
- package/temp_resend_cli/repo/biome.json +36 -0
- package/temp_resend_cli/repo/install.ps1 +141 -0
- package/temp_resend_cli/repo/install.sh +301 -0
- package/temp_resend_cli/repo/package.json +61 -0
- package/temp_resend_cli/repo/pnpm-lock.yaml +2439 -0
- package/temp_resend_cli/repo/renovate.json +4 -0
- package/temp_resend_cli/repo/src/cli.ts +98 -0
- package/temp_resend_cli/repo/src/commands/api-keys/create.ts +114 -0
- package/temp_resend_cli/repo/src/commands/api-keys/delete.ts +47 -0
- package/temp_resend_cli/repo/src/commands/api-keys/index.ts +26 -0
- package/temp_resend_cli/repo/src/commands/api-keys/list.ts +35 -0
- package/temp_resend_cli/repo/src/commands/api-keys/utils.ts +8 -0
- package/temp_resend_cli/repo/src/commands/auth/index.ts +20 -0
- package/temp_resend_cli/repo/src/commands/auth/login.ts +234 -0
- package/temp_resend_cli/repo/src/commands/auth/logout.ts +105 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/create.ts +196 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/delete.ts +46 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/get.ts +59 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/index.ts +43 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/list.ts +60 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/send.ts +56 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/update.ts +95 -0
- package/temp_resend_cli/repo/src/commands/broadcasts/utils.ts +35 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/create.ts +118 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/delete.ts +48 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/get.ts +46 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/index.ts +48 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/list.ts +68 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/update.ts +88 -0
- package/temp_resend_cli/repo/src/commands/contact-properties/utils.ts +17 -0
- package/temp_resend_cli/repo/src/commands/contacts/add-segment.ts +78 -0
- package/temp_resend_cli/repo/src/commands/contacts/create.ts +122 -0
- package/temp_resend_cli/repo/src/commands/contacts/delete.ts +49 -0
- package/temp_resend_cli/repo/src/commands/contacts/get.ts +53 -0
- package/temp_resend_cli/repo/src/commands/contacts/index.ts +58 -0
- package/temp_resend_cli/repo/src/commands/contacts/list.ts +57 -0
- package/temp_resend_cli/repo/src/commands/contacts/remove-segment.ts +48 -0
- package/temp_resend_cli/repo/src/commands/contacts/segments.ts +39 -0
- package/temp_resend_cli/repo/src/commands/contacts/topics.ts +45 -0
- package/temp_resend_cli/repo/src/commands/contacts/update-topics.ts +90 -0
- package/temp_resend_cli/repo/src/commands/contacts/update.ts +77 -0
- package/temp_resend_cli/repo/src/commands/contacts/utils.ts +119 -0
- package/temp_resend_cli/repo/src/commands/doctor.ts +216 -0
- package/temp_resend_cli/repo/src/commands/domains/create.ts +83 -0
- package/temp_resend_cli/repo/src/commands/domains/delete.ts +42 -0
- package/temp_resend_cli/repo/src/commands/domains/get.ts +47 -0
- package/temp_resend_cli/repo/src/commands/domains/index.ts +35 -0
- package/temp_resend_cli/repo/src/commands/domains/list.ts +53 -0
- package/temp_resend_cli/repo/src/commands/domains/update.ts +75 -0
- package/temp_resend_cli/repo/src/commands/domains/utils.ts +44 -0
- package/temp_resend_cli/repo/src/commands/domains/verify.ts +38 -0
- package/temp_resend_cli/repo/src/commands/emails/batch.ts +140 -0
- package/temp_resend_cli/repo/src/commands/emails/get.ts +44 -0
- package/temp_resend_cli/repo/src/commands/emails/index.ts +30 -0
- package/temp_resend_cli/repo/src/commands/emails/list.ts +84 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/attachment.ts +55 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/attachments.ts +68 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/get.ts +58 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/index.ts +28 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/list.ts +59 -0
- package/temp_resend_cli/repo/src/commands/emails/receiving/utils.ts +38 -0
- package/temp_resend_cli/repo/src/commands/emails/send.ts +189 -0
- package/temp_resend_cli/repo/src/commands/open.ts +27 -0
- package/temp_resend_cli/repo/src/commands/segments/create.ts +50 -0
- package/temp_resend_cli/repo/src/commands/segments/delete.ts +47 -0
- package/temp_resend_cli/repo/src/commands/segments/get.ts +38 -0
- package/temp_resend_cli/repo/src/commands/segments/index.ts +36 -0
- package/temp_resend_cli/repo/src/commands/segments/list.ts +58 -0
- package/temp_resend_cli/repo/src/commands/segments/utils.ts +7 -0
- package/temp_resend_cli/repo/src/commands/teams/index.ts +10 -0
- package/temp_resend_cli/repo/src/commands/teams/list.ts +35 -0
- package/temp_resend_cli/repo/src/commands/teams/remove.ts +86 -0
- package/temp_resend_cli/repo/src/commands/teams/switch.ts +76 -0
- package/temp_resend_cli/repo/src/commands/topics/create.ts +73 -0
- package/temp_resend_cli/repo/src/commands/topics/delete.ts +47 -0
- package/temp_resend_cli/repo/src/commands/topics/get.ts +42 -0
- package/temp_resend_cli/repo/src/commands/topics/index.ts +42 -0
- package/temp_resend_cli/repo/src/commands/topics/list.ts +34 -0
- package/temp_resend_cli/repo/src/commands/topics/update.ts +59 -0
- package/temp_resend_cli/repo/src/commands/topics/utils.ts +16 -0
- package/temp_resend_cli/repo/src/commands/webhooks/create.ts +128 -0
- package/temp_resend_cli/repo/src/commands/webhooks/delete.ts +49 -0
- package/temp_resend_cli/repo/src/commands/webhooks/get.ts +42 -0
- package/temp_resend_cli/repo/src/commands/webhooks/index.ts +42 -0
- package/temp_resend_cli/repo/src/commands/webhooks/list.ts +55 -0
- package/temp_resend_cli/repo/src/commands/webhooks/listen.ts +379 -0
- package/temp_resend_cli/repo/src/commands/webhooks/update.ts +83 -0
- package/temp_resend_cli/repo/src/commands/webhooks/utils.ts +36 -0
- package/temp_resend_cli/repo/src/commands/whoami.ts +71 -0
- package/temp_resend_cli/repo/src/lib/actions.ts +157 -0
- package/temp_resend_cli/repo/src/lib/client.ts +37 -0
- package/temp_resend_cli/repo/src/lib/config.ts +217 -0
- package/temp_resend_cli/repo/src/lib/files.ts +15 -0
- package/temp_resend_cli/repo/src/lib/help-text.ts +38 -0
- package/temp_resend_cli/repo/src/lib/output.ts +56 -0
- package/temp_resend_cli/repo/src/lib/pagination.ts +36 -0
- package/temp_resend_cli/repo/src/lib/prompts.ts +149 -0
- package/temp_resend_cli/repo/src/lib/spinner.ts +100 -0
- package/temp_resend_cli/repo/src/lib/table.ts +57 -0
- package/temp_resend_cli/repo/src/lib/tty.ts +28 -0
- package/temp_resend_cli/repo/src/lib/update-check.ts +169 -0
- package/temp_resend_cli/repo/src/lib/version.ts +4 -0
- package/temp_resend_cli/repo/tests/commands/api-keys/create.test.ts +196 -0
- package/temp_resend_cli/repo/tests/commands/api-keys/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/api-keys/list.test.ts +134 -0
- package/temp_resend_cli/repo/tests/commands/auth/login.test.ts +153 -0
- package/temp_resend_cli/repo/tests/commands/auth/logout.test.ts +153 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/create.test.ts +454 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/delete.test.ts +183 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/get.test.ts +147 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/list.test.ts +199 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/send.test.ts +162 -0
- package/temp_resend_cli/repo/tests/commands/broadcasts/update.test.ts +288 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/create.test.ts +251 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/delete.test.ts +184 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/get.test.ts +145 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/list.test.ts +181 -0
- package/temp_resend_cli/repo/tests/commands/contact-properties/update.test.ts +217 -0
- package/temp_resend_cli/repo/tests/commands/contacts/add-segment.test.ts +189 -0
- package/temp_resend_cli/repo/tests/commands/contacts/create.test.ts +271 -0
- package/temp_resend_cli/repo/tests/commands/contacts/delete.test.ts +193 -0
- package/temp_resend_cli/repo/tests/commands/contacts/get.test.ts +149 -0
- package/temp_resend_cli/repo/tests/commands/contacts/list.test.ts +176 -0
- package/temp_resend_cli/repo/tests/commands/contacts/remove-segment.test.ts +167 -0
- package/temp_resend_cli/repo/tests/commands/contacts/segments.test.ts +168 -0
- package/temp_resend_cli/repo/tests/commands/contacts/topics.test.ts +164 -0
- package/temp_resend_cli/repo/tests/commands/contacts/update-topics.test.ts +248 -0
- package/temp_resend_cli/repo/tests/commands/contacts/update.test.ts +206 -0
- package/temp_resend_cli/repo/tests/commands/doctor.test.ts +164 -0
- package/temp_resend_cli/repo/tests/commands/domains/create.test.ts +193 -0
- package/temp_resend_cli/repo/tests/commands/domains/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/domains/get.test.ts +138 -0
- package/temp_resend_cli/repo/tests/commands/domains/list.test.ts +165 -0
- package/temp_resend_cli/repo/tests/commands/domains/update.test.ts +224 -0
- package/temp_resend_cli/repo/tests/commands/domains/verify.test.ts +118 -0
- package/temp_resend_cli/repo/tests/commands/emails/batch.test.ts +324 -0
- package/temp_resend_cli/repo/tests/commands/emails/get.test.ts +132 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/attachment.test.ts +141 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/attachments.test.ts +169 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/get.test.ts +141 -0
- package/temp_resend_cli/repo/tests/commands/emails/receiving/list.test.ts +182 -0
- package/temp_resend_cli/repo/tests/commands/emails/send.test.ts +312 -0
- package/temp_resend_cli/repo/tests/commands/segments/create.test.ts +164 -0
- package/temp_resend_cli/repo/tests/commands/segments/delete.test.ts +183 -0
- package/temp_resend_cli/repo/tests/commands/segments/get.test.ts +138 -0
- package/temp_resend_cli/repo/tests/commands/segments/list.test.ts +174 -0
- package/temp_resend_cli/repo/tests/commands/teams/list.test.ts +62 -0
- package/temp_resend_cli/repo/tests/commands/teams/remove.test.ts +110 -0
- package/temp_resend_cli/repo/tests/commands/teams/switch.test.ts +103 -0
- package/temp_resend_cli/repo/tests/commands/topics/create.test.ts +192 -0
- package/temp_resend_cli/repo/tests/commands/topics/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/topics/get.test.ts +126 -0
- package/temp_resend_cli/repo/tests/commands/topics/list.test.ts +125 -0
- package/temp_resend_cli/repo/tests/commands/topics/update.test.ts +178 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/create.test.ts +225 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/delete.test.ts +157 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/get.test.ts +126 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/list.test.ts +178 -0
- package/temp_resend_cli/repo/tests/commands/webhooks/update.test.ts +207 -0
- package/temp_resend_cli/repo/tests/commands/whoami.test.ts +98 -0
- package/temp_resend_cli/repo/tests/e2e/smoke.test.ts +93 -0
- package/temp_resend_cli/repo/tests/helpers.ts +86 -0
- package/temp_resend_cli/repo/tests/lib/client.test.ts +71 -0
- package/temp_resend_cli/repo/tests/lib/config.test.ts +451 -0
- package/temp_resend_cli/repo/tests/lib/files.test.ts +73 -0
- package/temp_resend_cli/repo/tests/lib/help-text.test.ts +97 -0
- package/temp_resend_cli/repo/tests/lib/output.test.ts +136 -0
- package/temp_resend_cli/repo/tests/lib/prompts.test.ts +185 -0
- package/temp_resend_cli/repo/tests/lib/spinner.test.ts +166 -0
- package/temp_resend_cli/repo/tests/lib/table.test.ts +63 -0
- package/temp_resend_cli/repo/tests/lib/tty.test.ts +89 -0
- package/temp_resend_cli/repo/tests/lib/update-check.test.ts +179 -0
- package/temp_resend_cli/repo/tsconfig.json +14 -0
- package/temp_resend_cli/repo/vitest.config.e2e.ts +8 -0
- package/temp_resend_cli/repo/vitest.config.ts +10 -0
- package/tests/test-mcp-browser-use-smoke.sh +28 -56
- package/tests/test-monty-smoke.sh +32 -0
- package/tests/test-resend-smoke.sh +36 -0
|
@@ -0,0 +1,985 @@
|
|
|
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);
|