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,799 @@
|
|
|
1
|
+
//! Iterator support for Python for loops and the `iter()` type constructor.
|
|
2
|
+
//!
|
|
3
|
+
//! This module provides the `MontyIter` struct which encapsulates iteration state
|
|
4
|
+
//! for different iterable types. It uses index-based iteration internally to avoid
|
|
5
|
+
//! borrow conflicts when accessing the heap during iteration.
|
|
6
|
+
//!
|
|
7
|
+
//! The design stores iteration state (indices) rather than Rust iterators, allowing
|
|
8
|
+
//! `for_next()` to take `&mut Heap` for cloning values and allocating strings.
|
|
9
|
+
//!
|
|
10
|
+
//! For constructors like `list()` and `tuple()`, use `MontyIter::new()` followed
|
|
11
|
+
//! by `collect()` to materialize all items into a Vec.
|
|
12
|
+
//!
|
|
13
|
+
//! ## Efficient Iteration with `IterState`
|
|
14
|
+
//!
|
|
15
|
+
//! For the VM's `ForIter` opcode, `advance_on_heap()` uses two strategies:
|
|
16
|
+
//!
|
|
17
|
+
//! **Fast path** for simple iterators (Range, InternBytes, ASCII IterStr):
|
|
18
|
+
//! - Single `get_mut()` call to compute value and advance index
|
|
19
|
+
//! - No additional heap access needed during iteration
|
|
20
|
+
//!
|
|
21
|
+
//! **Multi-phase approach** for complex iterators (IterStr, HeapRef):
|
|
22
|
+
//! 1. `iter_state()` - reads current state without mutation, returns `Option<IterState>`
|
|
23
|
+
//! 2. Get the value (may access other heap objects like strings or containers)
|
|
24
|
+
//! 3. `advance()` - updates the index after the caller has done its work
|
|
25
|
+
//!
|
|
26
|
+
//! This allows `advance_on_heap()` to coordinate access without extracting
|
|
27
|
+
//! the iterator from the heap (avoiding `std::mem::replace` overhead).
|
|
28
|
+
//!
|
|
29
|
+
//! ## Builtin Support
|
|
30
|
+
//!
|
|
31
|
+
//! The `iterator_next()` helper implements the `next()` builtin.
|
|
32
|
+
|
|
33
|
+
use crate::{
|
|
34
|
+
args::ArgValues,
|
|
35
|
+
bytecode::VM,
|
|
36
|
+
exception_private::{ExcType, RunResult},
|
|
37
|
+
heap::{ContainsHeap, DropWithHeap, Heap, HeapData, HeapGuard, HeapId},
|
|
38
|
+
heap_data::HeapDataMut,
|
|
39
|
+
intern::{BytesId, Interns, StringId},
|
|
40
|
+
resource::ResourceTracker,
|
|
41
|
+
types::{PyTrait, Range, dict_view::DictView, str::allocate_char},
|
|
42
|
+
value::Value,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/// Iterator state for Python for loops.
|
|
46
|
+
///
|
|
47
|
+
/// Contains the current iteration index and the type-specific iteration data.
|
|
48
|
+
/// Uses index-based iteration to avoid borrow conflicts when accessing the heap.
|
|
49
|
+
///
|
|
50
|
+
/// For strings, stores the string content with a byte offset for O(1) UTF-8 iteration.
|
|
51
|
+
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
|
52
|
+
pub struct MontyIter {
|
|
53
|
+
/// Current iteration index, shared across all iterator types.
|
|
54
|
+
index: usize,
|
|
55
|
+
/// Type-specific iteration data.
|
|
56
|
+
iter_value: IterValue,
|
|
57
|
+
/// the actual Value being iterated over.
|
|
58
|
+
value: Value,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
impl MontyIter {
|
|
62
|
+
/// Creates an iterator from the `iter()` constructor call.
|
|
63
|
+
///
|
|
64
|
+
/// - `iter(iterable)` - Returns an iterator for the iterable. If the argument is
|
|
65
|
+
/// already an iterator, returns the same object.
|
|
66
|
+
/// - `iter(callable, sentinel)` - Not yet supported.
|
|
67
|
+
pub fn init(vm: &mut VM<'_, '_, impl ResourceTracker>, args: ArgValues) -> RunResult<Value> {
|
|
68
|
+
let (iterable, sentinel) = args.get_one_two_args("iter", vm.heap)?;
|
|
69
|
+
|
|
70
|
+
if let Some(s) = sentinel {
|
|
71
|
+
// Two-argument form: iter(callable, sentinel)
|
|
72
|
+
// This is the sentinel iteration protocol, not yet supported
|
|
73
|
+
iterable.drop_with_heap(vm);
|
|
74
|
+
s.drop_with_heap(vm);
|
|
75
|
+
return Err(ExcType::type_error("iter(callable, sentinel) is not yet supported"));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Check if already an iterator - return self
|
|
79
|
+
if let Value::Ref(id) = &iterable
|
|
80
|
+
&& matches!(vm.heap.get(*id), HeapData::Iter(_))
|
|
81
|
+
{
|
|
82
|
+
// Already an iterator - return it (refcount already correct from caller)
|
|
83
|
+
return Ok(iterable);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Create new iterator
|
|
87
|
+
let iter = Self::new(iterable, vm)?;
|
|
88
|
+
let id = vm.heap.allocate(HeapData::Iter(iter))?;
|
|
89
|
+
Ok(Value::Ref(id))
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Creates a new MontyIter from a Value.
|
|
93
|
+
///
|
|
94
|
+
/// Returns an error if the value is not iterable.
|
|
95
|
+
/// For strings, copies the string content for byte-offset based iteration.
|
|
96
|
+
/// For ranges, the data is copied so the heap reference is dropped immediately.
|
|
97
|
+
pub fn new(mut value: Value, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<Self> {
|
|
98
|
+
if let Some(iter_value) = IterValue::new(&value, vm) {
|
|
99
|
+
// For Range, we copy next/step/len into ForIterValue::Range, so we don't need
|
|
100
|
+
// to keep the heap object alive during iteration. Drop it immediately to avoid
|
|
101
|
+
// GC issues (the Range isn't in any namespace slot, so GC wouldn't see it).
|
|
102
|
+
// Same for IterStr which copies the string content.
|
|
103
|
+
if matches!(iter_value, IterValue::Range { .. } | IterValue::IterStr { .. }) {
|
|
104
|
+
value.drop_with_heap(vm);
|
|
105
|
+
value = Value::None;
|
|
106
|
+
}
|
|
107
|
+
Ok(Self {
|
|
108
|
+
index: 0,
|
|
109
|
+
iter_value,
|
|
110
|
+
value,
|
|
111
|
+
})
|
|
112
|
+
} else {
|
|
113
|
+
let err = ExcType::type_error_not_iterable(value.py_type(vm.heap));
|
|
114
|
+
value.drop_with_heap(vm);
|
|
115
|
+
Err(err)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Drops the iterator and its held value properly.
|
|
120
|
+
pub fn drop_with_heap(self, heap: &mut impl ContainsHeap) {
|
|
121
|
+
self.value.drop_with_heap(heap);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Collects HeapIds from this iterator for reference counting cleanup.
|
|
125
|
+
pub fn py_dec_ref_ids(&mut self, stack: &mut Vec<HeapId>) {
|
|
126
|
+
self.value.py_dec_ref_ids(stack);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// Returns whether this iterator holds a heap reference (`Value::Ref`).
|
|
130
|
+
///
|
|
131
|
+
/// Used during allocation to determine if this container could create cycles.
|
|
132
|
+
#[inline]
|
|
133
|
+
#[must_use]
|
|
134
|
+
pub fn has_refs(&self) -> bool {
|
|
135
|
+
matches!(self.value, Value::Ref(_))
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/// Returns a reference to the underlying value being iterated.
|
|
139
|
+
///
|
|
140
|
+
/// Used by GC to traverse heap references held by the iterator.
|
|
141
|
+
pub fn value(&self) -> &Value {
|
|
142
|
+
&self.value
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/// Returns the current iterator state without mutation.
|
|
146
|
+
///
|
|
147
|
+
/// This is used by the multi-phase approach in `advance_on_heap()` for complex
|
|
148
|
+
/// iterator types (IterStr, HeapRef). Simple types (Range, InternBytes, ASCII
|
|
149
|
+
/// IterStr) are handled by the fast path and should not call this method.
|
|
150
|
+
///
|
|
151
|
+
/// Returns `None` if the iterator is exhausted.
|
|
152
|
+
fn iter_state(&self) -> Option<IterState> {
|
|
153
|
+
match &self.iter_value {
|
|
154
|
+
// Range, InternBytes, and ASCII IterStr are handled by try_advance_simple() fast path
|
|
155
|
+
IterValue::Range { .. } | IterValue::InternBytes { .. } => {
|
|
156
|
+
unreachable!("Range and InternBytes use fast path, not iter_state")
|
|
157
|
+
}
|
|
158
|
+
IterValue::IterStr {
|
|
159
|
+
string,
|
|
160
|
+
byte_offset,
|
|
161
|
+
len,
|
|
162
|
+
..
|
|
163
|
+
} => {
|
|
164
|
+
if self.index >= *len {
|
|
165
|
+
None
|
|
166
|
+
} else {
|
|
167
|
+
// Get the next character at current byte offset
|
|
168
|
+
let c = string[*byte_offset..]
|
|
169
|
+
.chars()
|
|
170
|
+
.next()
|
|
171
|
+
.expect("index < len implies char exists");
|
|
172
|
+
Some(IterState::IterStr {
|
|
173
|
+
char: c,
|
|
174
|
+
char_len: c.len_utf8(),
|
|
175
|
+
})
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
IterValue::HeapRef {
|
|
179
|
+
heap_id,
|
|
180
|
+
len,
|
|
181
|
+
checks_mutation,
|
|
182
|
+
} => {
|
|
183
|
+
// For types with captured len, check exhaustion here.
|
|
184
|
+
// For List (len=None), exhaustion is checked in advance_on_heap().
|
|
185
|
+
if let Some(l) = len
|
|
186
|
+
&& self.index >= *l
|
|
187
|
+
{
|
|
188
|
+
return None;
|
|
189
|
+
}
|
|
190
|
+
Some(IterState::HeapIndex {
|
|
191
|
+
heap_id: *heap_id,
|
|
192
|
+
index: self.index,
|
|
193
|
+
expected_len: if *checks_mutation { *len } else { None },
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/// Advances the iterator by one step.
|
|
200
|
+
///
|
|
201
|
+
/// This is phase 2 of the two-phase iteration approach. Call this after
|
|
202
|
+
/// successfully retrieving the value using the data from `iter_state()`.
|
|
203
|
+
///
|
|
204
|
+
/// For string iterators, `string_char_len` must be provided (the UTF-8 byte
|
|
205
|
+
/// length of the character that was just yielded) to update the byte offset.
|
|
206
|
+
/// For other iterator types, pass `None`.
|
|
207
|
+
#[inline]
|
|
208
|
+
pub fn advance(&mut self, string_char_len: Option<usize>) {
|
|
209
|
+
self.index += 1;
|
|
210
|
+
if let Some(char_len) = string_char_len
|
|
211
|
+
&& let IterValue::IterStr { byte_offset, .. } = &mut self.iter_value
|
|
212
|
+
{
|
|
213
|
+
*byte_offset += char_len;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/// Attempts to advance simple iterator types that don't need additional heap access.
|
|
218
|
+
///
|
|
219
|
+
/// Returns `Some(result)` if handled (Range, InternBytes, ASCII IterStr),
|
|
220
|
+
/// `None` if caller should use the multi-phase approach (non-ASCII IterStr, HeapRef).
|
|
221
|
+
///
|
|
222
|
+
/// This optimization avoids two heap lookups for iterator types that can compute
|
|
223
|
+
/// their next value without accessing other heap objects.
|
|
224
|
+
#[inline]
|
|
225
|
+
fn try_advance_simple(&mut self, interns: &Interns) -> Option<RunResult<Option<Value>>> {
|
|
226
|
+
match &mut self.iter_value {
|
|
227
|
+
IterValue::Range { next, step, len } => {
|
|
228
|
+
if self.index >= *len {
|
|
229
|
+
Some(Ok(None))
|
|
230
|
+
} else {
|
|
231
|
+
let value = *next;
|
|
232
|
+
*next += *step;
|
|
233
|
+
self.index += 1;
|
|
234
|
+
Some(Ok(Some(Value::Int(value))))
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
IterValue::IterStr {
|
|
238
|
+
string,
|
|
239
|
+
byte_offset,
|
|
240
|
+
len,
|
|
241
|
+
is_ascii,
|
|
242
|
+
} => {
|
|
243
|
+
if !*is_ascii {
|
|
244
|
+
None
|
|
245
|
+
} else if self.index >= *len {
|
|
246
|
+
Some(Ok(None))
|
|
247
|
+
} else {
|
|
248
|
+
let byte = string.as_bytes()[*byte_offset];
|
|
249
|
+
*byte_offset += 1;
|
|
250
|
+
self.index += 1;
|
|
251
|
+
Some(Ok(Some(Value::InternString(StringId::from_ascii(byte)))))
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
IterValue::InternBytes { bytes_id, len } => {
|
|
255
|
+
if self.index >= *len {
|
|
256
|
+
Some(Ok(None))
|
|
257
|
+
} else {
|
|
258
|
+
let i = self.index;
|
|
259
|
+
self.index += 1;
|
|
260
|
+
let bytes = interns.get_bytes(*bytes_id);
|
|
261
|
+
Some(Ok(Some(Value::Int(i64::from(bytes[i])))))
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
IterValue::HeapRef { .. } => None,
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/// Returns the next item from the iterator, advancing the internal index.
|
|
269
|
+
///
|
|
270
|
+
/// Returns `Ok(None)` when the iterator is exhausted.
|
|
271
|
+
/// Returns `Err` if allocation fails (for string character iteration) or if
|
|
272
|
+
/// a dict/set changes size during iteration (RuntimeError).
|
|
273
|
+
pub fn for_next(&mut self, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<Option<Value>> {
|
|
274
|
+
// Check timeout on every iteration step. For NoLimitTracker this is
|
|
275
|
+
// inlined as a no-op. For LimitTracker it ensures that Rust-side loops
|
|
276
|
+
// (sum, sorted, min, max, etc.) cannot bypass the VM's per-instruction
|
|
277
|
+
// timeout check by running entirely within a single bytecode instruction.
|
|
278
|
+
vm.heap.check_time()?;
|
|
279
|
+
match &mut self.iter_value {
|
|
280
|
+
IterValue::Range { next, step, len } => {
|
|
281
|
+
if self.index >= *len {
|
|
282
|
+
return Ok(None);
|
|
283
|
+
}
|
|
284
|
+
let value = *next;
|
|
285
|
+
*next += *step;
|
|
286
|
+
self.index += 1;
|
|
287
|
+
Ok(Some(Value::Int(value)))
|
|
288
|
+
}
|
|
289
|
+
IterValue::IterStr {
|
|
290
|
+
string,
|
|
291
|
+
byte_offset,
|
|
292
|
+
len,
|
|
293
|
+
is_ascii,
|
|
294
|
+
} => {
|
|
295
|
+
if self.index >= *len {
|
|
296
|
+
Ok(None)
|
|
297
|
+
} else if *is_ascii {
|
|
298
|
+
let byte = string.as_bytes()[*byte_offset];
|
|
299
|
+
*byte_offset += 1;
|
|
300
|
+
self.index += 1;
|
|
301
|
+
Ok(Some(Value::InternString(StringId::from_ascii(byte))))
|
|
302
|
+
} else {
|
|
303
|
+
// Get next char at current byte offset
|
|
304
|
+
let c = string[*byte_offset..]
|
|
305
|
+
.chars()
|
|
306
|
+
.next()
|
|
307
|
+
.expect("index < len implies char exists");
|
|
308
|
+
*byte_offset += c.len_utf8();
|
|
309
|
+
self.index += 1;
|
|
310
|
+
Ok(Some(allocate_char(c, vm.heap)?))
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
IterValue::InternBytes { bytes_id, len } => {
|
|
314
|
+
if self.index >= *len {
|
|
315
|
+
return Ok(None);
|
|
316
|
+
}
|
|
317
|
+
let i = self.index;
|
|
318
|
+
self.index += 1;
|
|
319
|
+
let bytes = vm.interns.get_bytes(*bytes_id);
|
|
320
|
+
Ok(Some(Value::Int(i64::from(bytes[i]))))
|
|
321
|
+
}
|
|
322
|
+
IterValue::HeapRef {
|
|
323
|
+
heap_id,
|
|
324
|
+
len,
|
|
325
|
+
checks_mutation,
|
|
326
|
+
} => {
|
|
327
|
+
// Check exhaustion for types with captured len
|
|
328
|
+
if let Some(l) = len
|
|
329
|
+
&& self.index >= *l
|
|
330
|
+
{
|
|
331
|
+
return Ok(None);
|
|
332
|
+
}
|
|
333
|
+
let i = self.index;
|
|
334
|
+
let expected_len = if *checks_mutation { *len } else { None };
|
|
335
|
+
let item = get_heap_item(vm.heap, *heap_id, i, expected_len)?;
|
|
336
|
+
// Check for list exhaustion (list can shrink during iteration)
|
|
337
|
+
let Some(item) = item else {
|
|
338
|
+
return Ok(None);
|
|
339
|
+
};
|
|
340
|
+
self.index += 1;
|
|
341
|
+
Ok(Some(item))
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/// Returns the remaining size for iterables based on current state.
|
|
347
|
+
///
|
|
348
|
+
/// For immutable types (Range, Tuple, Str, Bytes, FrozenSet), returns the exact remaining count.
|
|
349
|
+
/// For List, returns current length minus index (may change if list is mutated).
|
|
350
|
+
/// For Dict and Set, returns the captured length minus index (used for size-change detection).
|
|
351
|
+
pub fn size_hint(&self, heap: &Heap<impl ResourceTracker>) -> usize {
|
|
352
|
+
let len = match &self.iter_value {
|
|
353
|
+
IterValue::Range { len, .. } | IterValue::IterStr { len, .. } | IterValue::InternBytes { len, .. } => *len,
|
|
354
|
+
IterValue::HeapRef { heap_id, len, .. } => {
|
|
355
|
+
// For List (len=None), check current length dynamically
|
|
356
|
+
len.unwrap_or_else(|| {
|
|
357
|
+
let HeapData::List(list) = heap.get(*heap_id) else {
|
|
358
|
+
panic!("HeapRef with len=None should only be List")
|
|
359
|
+
};
|
|
360
|
+
list.len()
|
|
361
|
+
})
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
len.saturating_sub(self.index)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/// Collects all remaining items from the iterator into a Vec.
|
|
368
|
+
///
|
|
369
|
+
/// Consumes the iterator and returns all items. Used by `list()`, `tuple()`,
|
|
370
|
+
/// and similar constructors that need to materialize all items.
|
|
371
|
+
///
|
|
372
|
+
/// Pre-allocates capacity based on `size_hint()` for better performance.
|
|
373
|
+
pub fn collect<T: FromIterator<Value>>(self, vm: &mut VM<'_, '_, impl ResourceTracker>) -> RunResult<T> {
|
|
374
|
+
let mut guard = HeapGuard::new(self, vm);
|
|
375
|
+
let (this, vm) = guard.as_parts_mut();
|
|
376
|
+
HeapedMontyIter(this, vm).collect()
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
struct HeapedMontyIter<'this, 'a, 'p, T: ResourceTracker>(&'this mut MontyIter, &'this mut VM<'a, 'p, T>);
|
|
381
|
+
|
|
382
|
+
impl<T: ResourceTracker> Iterator for HeapedMontyIter<'_, '_, '_, T> {
|
|
383
|
+
type Item = RunResult<Value>;
|
|
384
|
+
|
|
385
|
+
fn next(&mut self) -> Option<Self::Item> {
|
|
386
|
+
self.0.for_next(self.1).transpose()
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
390
|
+
let remaining = self.0.size_hint(self.1.heap);
|
|
391
|
+
(remaining, Some(remaining))
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/// Advances an iterator stored on the heap and returns the next value.
|
|
396
|
+
///
|
|
397
|
+
/// Uses a fast path for simple iterators (Range, InternBytes, ASCII IterStr) that don't need
|
|
398
|
+
/// additional heap access - these are handled with a single mutable borrow.
|
|
399
|
+
///
|
|
400
|
+
/// For complex iterators (IterStr, HeapRef), uses a multi-phase approach:
|
|
401
|
+
/// 1. Read iterator state (immutable borrow ends)
|
|
402
|
+
/// 2. Based on state, get the value (may access other heap objects)
|
|
403
|
+
/// 3. Update iterator index (mutable borrow)
|
|
404
|
+
///
|
|
405
|
+
/// This is more efficient than `std::mem::replace` with a placeholder because
|
|
406
|
+
/// it avoids creating and moving placeholder objects on every iteration.
|
|
407
|
+
///
|
|
408
|
+
/// Returns `Ok(None)` when the iterator is exhausted.
|
|
409
|
+
/// Returns `Err` for dict/set size changes or allocation failures.
|
|
410
|
+
pub(crate) fn advance_on_heap(
|
|
411
|
+
heap: &mut Heap<impl ResourceTracker>,
|
|
412
|
+
iter_id: HeapId,
|
|
413
|
+
interns: &Interns,
|
|
414
|
+
) -> RunResult<Option<Value>> {
|
|
415
|
+
// Fast path: Range and InternBytes don't need additional heap access,
|
|
416
|
+
// so we can handle them with a single mutable borrow.
|
|
417
|
+
{
|
|
418
|
+
let HeapDataMut::Iter(iter) = heap.get_mut(iter_id) else {
|
|
419
|
+
panic!("advance_on_heap: expected Iterator on heap");
|
|
420
|
+
};
|
|
421
|
+
if let Some(result) = iter.try_advance_simple(interns) {
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Mutable borrow ends here, allowing the multi-phase approach below
|
|
426
|
+
|
|
427
|
+
// Multi-phase approach for IterStr and HeapRef (need heap access during value retrieval)
|
|
428
|
+
// Phase 1: Get iterator state (immutable borrow ends after this block)
|
|
429
|
+
let HeapData::Iter(iter) = heap.get(iter_id) else {
|
|
430
|
+
panic!("advance_on_heap: expected Iterator on heap");
|
|
431
|
+
};
|
|
432
|
+
let Some(state) = iter.iter_state() else {
|
|
433
|
+
return Ok(None); // Iterator exhausted
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
// Phase 2: Based on state, get the value and determine char_len for strings
|
|
437
|
+
let (value, string_char_len) = match state {
|
|
438
|
+
IterState::IterStr { char, char_len } => {
|
|
439
|
+
let value = allocate_char(char, heap)?;
|
|
440
|
+
(value, Some(char_len))
|
|
441
|
+
}
|
|
442
|
+
IterState::HeapIndex {
|
|
443
|
+
heap_id,
|
|
444
|
+
index,
|
|
445
|
+
expected_len,
|
|
446
|
+
} => {
|
|
447
|
+
let item = get_heap_item(heap, heap_id, index, expected_len)?;
|
|
448
|
+
// Check for list exhaustion (list can shrink during iteration)
|
|
449
|
+
let Some(item) = item else {
|
|
450
|
+
return Ok(None);
|
|
451
|
+
};
|
|
452
|
+
(item, None)
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
// Phase 3: Advance the iterator
|
|
457
|
+
let HeapDataMut::Iter(iter) = heap.get_mut(iter_id) else {
|
|
458
|
+
panic!("advance_on_heap: expected Iterator on heap");
|
|
459
|
+
};
|
|
460
|
+
iter.advance(string_char_len);
|
|
461
|
+
|
|
462
|
+
Ok(Some(value))
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/// Gets an item from a heap-allocated container at the given index.
|
|
466
|
+
///
|
|
467
|
+
/// Returns `Ok(None)` if the index is out of bounds (for lists that shrunk during iteration).
|
|
468
|
+
/// Returns `Err` if a dict/set changed size during iteration (RuntimeError).
|
|
469
|
+
fn get_heap_item(
|
|
470
|
+
heap: &mut Heap<impl ResourceTracker>,
|
|
471
|
+
heap_id: HeapId,
|
|
472
|
+
index: usize,
|
|
473
|
+
expected_len: Option<usize>,
|
|
474
|
+
) -> RunResult<Option<Value>> {
|
|
475
|
+
match heap.get(heap_id) {
|
|
476
|
+
HeapData::List(list) => {
|
|
477
|
+
// Check if list shrunk during iteration
|
|
478
|
+
if index >= list.len() {
|
|
479
|
+
return Ok(None);
|
|
480
|
+
}
|
|
481
|
+
Ok(Some(list.as_slice()[index].clone_with_heap(heap)))
|
|
482
|
+
}
|
|
483
|
+
HeapData::Tuple(tuple) => Ok(Some(tuple.as_slice()[index].clone_with_heap(heap))),
|
|
484
|
+
HeapData::NamedTuple(namedtuple) => Ok(Some(namedtuple.as_vec()[index].clone_with_heap(heap))),
|
|
485
|
+
HeapData::Dict(dict) => {
|
|
486
|
+
// Check for dict mutation
|
|
487
|
+
if let Some(expected) = expected_len
|
|
488
|
+
&& dict.len() != expected
|
|
489
|
+
{
|
|
490
|
+
return Err(ExcType::runtime_error_dict_changed_size());
|
|
491
|
+
}
|
|
492
|
+
Ok(Some(
|
|
493
|
+
dict.key_at(index).expect("index should be valid").clone_with_heap(heap),
|
|
494
|
+
))
|
|
495
|
+
}
|
|
496
|
+
HeapData::DictKeysView(view) => {
|
|
497
|
+
let dict = view.dict(heap);
|
|
498
|
+
if let Some(expected) = expected_len
|
|
499
|
+
&& dict.len() != expected
|
|
500
|
+
{
|
|
501
|
+
return Err(ExcType::runtime_error_dict_changed_size());
|
|
502
|
+
}
|
|
503
|
+
Ok(Some(
|
|
504
|
+
dict.key_at(index).expect("index should be valid").clone_with_heap(heap),
|
|
505
|
+
))
|
|
506
|
+
}
|
|
507
|
+
HeapData::DictItemsView(view) => {
|
|
508
|
+
let dict = view.dict(heap);
|
|
509
|
+
if let Some(expected) = expected_len
|
|
510
|
+
&& dict.len() != expected
|
|
511
|
+
{
|
|
512
|
+
return Err(ExcType::runtime_error_dict_changed_size());
|
|
513
|
+
}
|
|
514
|
+
let (key, value) = dict.item_at(index).expect("index should be valid");
|
|
515
|
+
Ok(Some(crate::types::allocate_tuple(
|
|
516
|
+
smallvec::smallvec![key.clone_with_heap(heap), value.clone_with_heap(heap)],
|
|
517
|
+
heap,
|
|
518
|
+
)?))
|
|
519
|
+
}
|
|
520
|
+
HeapData::DictValuesView(view) => {
|
|
521
|
+
let dict = view.dict(heap);
|
|
522
|
+
if let Some(expected) = expected_len
|
|
523
|
+
&& dict.len() != expected
|
|
524
|
+
{
|
|
525
|
+
return Err(ExcType::runtime_error_dict_changed_size());
|
|
526
|
+
}
|
|
527
|
+
Ok(Some(
|
|
528
|
+
dict.value_at(index)
|
|
529
|
+
.expect("index should be valid")
|
|
530
|
+
.clone_with_heap(heap),
|
|
531
|
+
))
|
|
532
|
+
}
|
|
533
|
+
HeapData::Bytes(bytes) => Ok(Some(Value::Int(i64::from(bytes.as_slice()[index])))),
|
|
534
|
+
HeapData::Set(set) => {
|
|
535
|
+
// Check for set mutation
|
|
536
|
+
if let Some(expected) = expected_len
|
|
537
|
+
&& set.len() != expected
|
|
538
|
+
{
|
|
539
|
+
return Err(ExcType::runtime_error_set_changed_size());
|
|
540
|
+
}
|
|
541
|
+
Ok(Some(
|
|
542
|
+
set.storage()
|
|
543
|
+
.value_at(index)
|
|
544
|
+
.expect("index should be valid")
|
|
545
|
+
.clone_with_heap(heap),
|
|
546
|
+
))
|
|
547
|
+
}
|
|
548
|
+
HeapData::FrozenSet(frozenset) => Ok(Some(
|
|
549
|
+
frozenset
|
|
550
|
+
.storage()
|
|
551
|
+
.value_at(index)
|
|
552
|
+
.expect("index should be valid")
|
|
553
|
+
.clone_with_heap(heap),
|
|
554
|
+
)),
|
|
555
|
+
_ => panic!("get_heap_item: unexpected heap data type"),
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/// Gets the next item from an iterator.
|
|
560
|
+
///
|
|
561
|
+
/// If the iterator is exhausted:
|
|
562
|
+
/// - If `default` is `Some`, returns the default value
|
|
563
|
+
/// - If `default` is `None`, raises `StopIteration`
|
|
564
|
+
///
|
|
565
|
+
/// This implements Python's `next()` builtin semantics.
|
|
566
|
+
///
|
|
567
|
+
/// # Arguments
|
|
568
|
+
/// * `iter_value` - Must be an iterator (heap-allocated MontyIter)
|
|
569
|
+
/// * `default` - Optional default value to return when exhausted
|
|
570
|
+
/// * `heap` - The heap for memory operations
|
|
571
|
+
/// * `interns` - String interning table
|
|
572
|
+
///
|
|
573
|
+
/// # Errors
|
|
574
|
+
/// Returns `StopIteration` if exhausted with no default, or propagates errors from iteration.
|
|
575
|
+
pub fn iterator_next(
|
|
576
|
+
iter_value: &Value,
|
|
577
|
+
default: Option<Value>,
|
|
578
|
+
heap: &mut Heap<impl ResourceTracker>,
|
|
579
|
+
interns: &Interns,
|
|
580
|
+
) -> RunResult<Value> {
|
|
581
|
+
let Value::Ref(iter_id) = iter_value else {
|
|
582
|
+
// Not a heap value - can't be an iterator
|
|
583
|
+
if let Some(d) = default {
|
|
584
|
+
d.drop_with_heap(heap);
|
|
585
|
+
}
|
|
586
|
+
return Err(ExcType::type_error_not_iterable(iter_value.py_type(heap)));
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
// Check that it's actually an iterator
|
|
590
|
+
if !matches!(heap.get(*iter_id), HeapData::Iter(_)) {
|
|
591
|
+
if let Some(d) = default {
|
|
592
|
+
d.drop_with_heap(heap);
|
|
593
|
+
}
|
|
594
|
+
let data_type = heap.get(*iter_id).py_type(heap);
|
|
595
|
+
return Err(ExcType::type_error(format!("'{data_type}' object is not an iterator")));
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Get next item using the MontyIter::advance_on_heap method
|
|
599
|
+
match advance_on_heap(heap, *iter_id, interns)? {
|
|
600
|
+
Some(item) => {
|
|
601
|
+
// Drop default if provided since we don't need it
|
|
602
|
+
if let Some(d) = default {
|
|
603
|
+
d.drop_with_heap(heap);
|
|
604
|
+
}
|
|
605
|
+
Ok(item)
|
|
606
|
+
}
|
|
607
|
+
None => {
|
|
608
|
+
// Iterator exhausted
|
|
609
|
+
match default {
|
|
610
|
+
Some(d) => Ok(d),
|
|
611
|
+
None => Err(ExcType::stop_iteration()),
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/// Snapshot of iterator state needed to produce the next value.
|
|
618
|
+
///
|
|
619
|
+
/// This enum captures state for complex iterator types (IterStr, HeapRef) that
|
|
620
|
+
/// require the multi-phase approach in `advance_on_heap()`. Simple types (Range,
|
|
621
|
+
/// InternBytes, ASCII IterStr) are handled by the fast path and don't use this enum.
|
|
622
|
+
///
|
|
623
|
+
/// The multi-phase approach avoids borrow conflicts:
|
|
624
|
+
/// 1. Read `Option<IterState>` from iterator (immutable borrow ends, `None` means exhausted)
|
|
625
|
+
/// 2. Use the state to get the value (may access other heap objects)
|
|
626
|
+
/// 3. Call `advance()` to update the iterator index
|
|
627
|
+
#[derive(Debug, Clone, Copy)]
|
|
628
|
+
enum IterState {
|
|
629
|
+
/// String iterator yields this character; char_len is UTF-8 byte length for advance().
|
|
630
|
+
IterStr { char: char, char_len: usize },
|
|
631
|
+
/// Heap-based iterator (List, Tuple, NamedTuple, Dict, Bytes, Set, FrozenSet).
|
|
632
|
+
/// The expected_len is Some for types that check for mutation (Dict, Set).
|
|
633
|
+
HeapIndex {
|
|
634
|
+
heap_id: HeapId,
|
|
635
|
+
index: usize,
|
|
636
|
+
expected_len: Option<usize>,
|
|
637
|
+
},
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/// Type-specific iteration data for different Python iterable types.
|
|
641
|
+
///
|
|
642
|
+
/// Each variant stores the data needed to iterate over a specific type,
|
|
643
|
+
/// excluding the index which is stored in the parent `MontyIter` struct.
|
|
644
|
+
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
|
645
|
+
enum IterValue {
|
|
646
|
+
/// Iterating over a Range, yields `Value::Int`.
|
|
647
|
+
Range {
|
|
648
|
+
/// Next value to yield.
|
|
649
|
+
next: i64,
|
|
650
|
+
/// Step between values.
|
|
651
|
+
step: i64,
|
|
652
|
+
/// Total number of elements.
|
|
653
|
+
len: usize,
|
|
654
|
+
},
|
|
655
|
+
/// Iterating over a string (heap or interned), yields single-char Str values.
|
|
656
|
+
///
|
|
657
|
+
/// Stores a copy of the string content plus a byte offset for O(1) UTF-8 character access.
|
|
658
|
+
/// We store the string rather than referencing the heap because `for_next()` needs mutable
|
|
659
|
+
/// heap access to allocate the returned character strings, which would conflict with
|
|
660
|
+
/// borrowing the source string from the heap.
|
|
661
|
+
IterStr {
|
|
662
|
+
/// Copy of the string content for iteration.
|
|
663
|
+
string: String,
|
|
664
|
+
/// Current byte offset into the string (points to next char to yield).
|
|
665
|
+
byte_offset: usize,
|
|
666
|
+
/// Total number of characters in the string.
|
|
667
|
+
len: usize,
|
|
668
|
+
/// Whether the string is ASCII (enables fast-path iteration).
|
|
669
|
+
is_ascii: bool,
|
|
670
|
+
},
|
|
671
|
+
/// Iterating over interned bytes, yields `Value::Int` for each byte.
|
|
672
|
+
InternBytes { bytes_id: BytesId, len: usize },
|
|
673
|
+
/// Iterating over a heap-allocated container (List, Tuple, NamedTuple, Dict, Bytes, Set, FrozenSet).
|
|
674
|
+
///
|
|
675
|
+
/// - `len`: `None` for List (checked dynamically since lists can mutate during iteration),
|
|
676
|
+
/// `Some(n)` for other types (captured at construction for exhaustion checking).
|
|
677
|
+
/// - `checks_mutation`: `true` for Dict/Set (raises RuntimeError if size changes),
|
|
678
|
+
/// `false` for other types.
|
|
679
|
+
HeapRef {
|
|
680
|
+
heap_id: HeapId,
|
|
681
|
+
len: Option<usize>,
|
|
682
|
+
checks_mutation: bool,
|
|
683
|
+
},
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
impl IterValue {
|
|
687
|
+
fn new(value: &Value, vm: &mut VM<'_, '_, impl ResourceTracker>) -> Option<Self> {
|
|
688
|
+
match &value {
|
|
689
|
+
Value::InternString(string_id) => Some(Self::from_str(vm.interns.get_str(*string_id))),
|
|
690
|
+
Value::InternBytes(bytes_id) => Some(Self::from_intern_bytes(*bytes_id, vm.interns)),
|
|
691
|
+
Value::Ref(heap_id) => Self::from_heap_data(*heap_id, vm.heap),
|
|
692
|
+
_ => None,
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
/// Creates a Range iterator value.
|
|
697
|
+
fn from_range(range: &Range) -> Self {
|
|
698
|
+
Self::Range {
|
|
699
|
+
next: range.start,
|
|
700
|
+
step: range.step,
|
|
701
|
+
len: range.len(),
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/// Creates an iterator value over a string.
|
|
706
|
+
///
|
|
707
|
+
/// Copies the string content and counts characters for the length field.
|
|
708
|
+
fn from_str(s: &str) -> Self {
|
|
709
|
+
let is_ascii = s.is_ascii();
|
|
710
|
+
let len = if is_ascii { s.len() } else { s.chars().count() };
|
|
711
|
+
Self::IterStr {
|
|
712
|
+
string: s.to_owned(),
|
|
713
|
+
byte_offset: 0,
|
|
714
|
+
len,
|
|
715
|
+
is_ascii,
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/// Creates an iterator value over interned bytes.
|
|
720
|
+
fn from_intern_bytes(bytes_id: BytesId, interns: &Interns) -> Self {
|
|
721
|
+
let bytes = interns.get_bytes(bytes_id);
|
|
722
|
+
Self::InternBytes {
|
|
723
|
+
bytes_id,
|
|
724
|
+
len: bytes.len(),
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/// Creates an iterator value from heap data.
|
|
729
|
+
fn from_heap_data(heap_id: HeapId, heap: &Heap<impl ResourceTracker>) -> Option<Self> {
|
|
730
|
+
match heap.get(heap_id) {
|
|
731
|
+
// List: no captured len (checked dynamically), no mutation check
|
|
732
|
+
HeapData::List(_) => Some(Self::HeapRef {
|
|
733
|
+
heap_id,
|
|
734
|
+
len: None,
|
|
735
|
+
checks_mutation: false,
|
|
736
|
+
}),
|
|
737
|
+
// Tuple/NamedTuple/Bytes/FrozenSet: captured len, no mutation check
|
|
738
|
+
HeapData::Tuple(tuple) => Some(Self::HeapRef {
|
|
739
|
+
heap_id,
|
|
740
|
+
len: Some(tuple.as_slice().len()),
|
|
741
|
+
checks_mutation: false,
|
|
742
|
+
}),
|
|
743
|
+
HeapData::NamedTuple(namedtuple) => Some(Self::HeapRef {
|
|
744
|
+
heap_id,
|
|
745
|
+
len: Some(namedtuple.len()),
|
|
746
|
+
checks_mutation: false,
|
|
747
|
+
}),
|
|
748
|
+
HeapData::Bytes(b) => Some(Self::HeapRef {
|
|
749
|
+
heap_id,
|
|
750
|
+
len: Some(b.len()),
|
|
751
|
+
checks_mutation: false,
|
|
752
|
+
}),
|
|
753
|
+
HeapData::FrozenSet(frozenset) => Some(Self::HeapRef {
|
|
754
|
+
heap_id,
|
|
755
|
+
len: Some(frozenset.len()),
|
|
756
|
+
checks_mutation: false,
|
|
757
|
+
}),
|
|
758
|
+
// Dict and dict views: captured len, WITH mutation check
|
|
759
|
+
HeapData::Dict(dict) => Some(Self::HeapRef {
|
|
760
|
+
heap_id,
|
|
761
|
+
len: Some(dict.len()),
|
|
762
|
+
checks_mutation: true,
|
|
763
|
+
}),
|
|
764
|
+
HeapData::DictKeysView(view) => Some(Self::HeapRef {
|
|
765
|
+
heap_id,
|
|
766
|
+
len: Some(view.dict(heap).len()),
|
|
767
|
+
checks_mutation: true,
|
|
768
|
+
}),
|
|
769
|
+
HeapData::DictItemsView(view) => Some(Self::HeapRef {
|
|
770
|
+
heap_id,
|
|
771
|
+
len: Some(view.dict(heap).len()),
|
|
772
|
+
checks_mutation: true,
|
|
773
|
+
}),
|
|
774
|
+
HeapData::DictValuesView(view) => Some(Self::HeapRef {
|
|
775
|
+
heap_id,
|
|
776
|
+
len: Some(view.dict(heap).len()),
|
|
777
|
+
checks_mutation: true,
|
|
778
|
+
}),
|
|
779
|
+
HeapData::Set(set) => Some(Self::HeapRef {
|
|
780
|
+
heap_id,
|
|
781
|
+
len: Some(set.len()),
|
|
782
|
+
checks_mutation: true,
|
|
783
|
+
}),
|
|
784
|
+
// String: copy content for iteration
|
|
785
|
+
HeapData::Str(s) => Some(Self::from_str(s.as_str())),
|
|
786
|
+
// Range: copy values for iteration
|
|
787
|
+
HeapData::Range(range) => Some(Self::from_range(range)),
|
|
788
|
+
// other types are not iterable
|
|
789
|
+
_ => None,
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
impl DropWithHeap for MontyIter {
|
|
795
|
+
#[inline]
|
|
796
|
+
fn drop_with_heap<H: ContainsHeap>(self, heap: &mut H) {
|
|
797
|
+
Self::drop_with_heap(self, heap);
|
|
798
|
+
}
|
|
799
|
+
}
|