Feature: managed type deallocator#2113
Conversation
Managed dealloc API & debugger interface
Coverage SummaryTotals
FilesExpand
|
|
Contract comparison - from 3c74a99 to 5afcaea
|
Merge rc/v0.65 -> feat/mdrop
Dealloc for ManagedVec items
Managed type thread safety
Merge branch master -> feat/mdrop
There was a problem hiding this comment.
Pull request overview
Adds explicit deallocation support for managed types (especially under StaticApi) by introducing VM drop hooks, tightening handle/thread-safety guarantees, and updating ManagedVecItem/ManagedVec decoding and lifecycle behavior to avoid double-drops. Also introduces a small benchmarking tool to measure managed-type memory retention/leaks and extends scenario/unit test coverage around the new semantics.
Changes:
- Introduce managed-type drop hooks end-to-end (base types → scenario VMHooks API → chain VM handler/container).
- Make managed handle usage safer (
ManagedVecItem::read_from_payloadbecomesunsafe, addrequires_drop, adjustManagedVecdrop/slice/dedup behaviors). - Add
managed-mem-benchbinaries and extra tests/static assertions for!Send/!Syncand equality/drop behavior.
Reviewed changes
Copilot reviewed 90 out of 91 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| tools/managed-mem-bench/src/bench_threading.rs | Multi-thread StaticApi behavior checks |
| tools/managed-mem-bench/src/bench_leak.rs | Allocation/leak benchmark harness |
| tools/managed-mem-bench/README.md | Bench tool documentation |
| tools/managed-mem-bench/Cargo.toml | New bench crate + bins |
| framework/scenario/tests/token_id_test.rs | Assert TokenId !Send/!Sync |
| framework/scenario/tests/managed_vec_test.rs | Add eq/byte_len/slice/remove tests |
| framework/scenario/tests/managed_ref_test.rs | ManagedRef drop-safety test |
| framework/scenario/tests/managed_map_unit_tests.rs | Assert ManagedMap !Send/!Sync |
| framework/scenario/tests/derive_managed_vec_item_struct_3.rs | requires_drop assertions |
| framework/scenario/tests/derive_managed_vec_item_struct_2_test.rs | temp_decode + requires_drop |
| framework/scenario/tests/derive_managed_vec_item_struct_1_test.rs | temp_decode + requires_drop |
| framework/scenario/tests/derive_managed_vec_item_esdt_token_payment_test.rs | temp_decode + requires_drop |
| framework/scenario/tests/derive_managed_vec_item_enum_simple.rs | temp_decode + requires_drop |
| framework/scenario/tests/derive_managed_vec_item_enum_2_managed.rs | requires_drop assertion |
| framework/scenario/tests/derive_managed_vec_item_enum_1.rs | temp_decode + requires_drop |
| framework/scenario/tests/derive_managed_vec_item_decimal_test.rs | read_from_payload unsafe wrap |
| framework/scenario/tests/derive_managed_vec_item_biguint_test.rs | temp_decode + requires_drop |
| framework/scenario/tests/big_uint_test.rs | Assert BigUint !Send/!Sync |
| framework/scenario/tests/big_int_test.rs | Assert BigInt !Send/!Sync |
| framework/scenario/tests/big_float_test.rs | Assert BigFloat !Send/!Sync |
| framework/scenario/src/executor/debug/vm_hooks_debugger.rs | Debugger VMHooks drop extensions |
| framework/scenario/src/executor/debug.rs | Export VMHooksDebugger |
| framework/scenario/src/api/managed_type_api_vh.rs | Drop hook plumbing in API impl |
| framework/scenario/src/api/impl_vh/vm_hooks_backend.rs | VMHooksDebugger backend interface |
| framework/scenario/src/api/impl_vh/vm_hooks_api.rs | Add ctx-if-active helper |
| framework/scenario/src/api/impl_vh/static_api_handle.rs | Thread-local, !Send/!Sync handle |
| framework/scenario/src/api/impl_vh/static_api.rs | StaticApi uses StaticApiHandle |
| framework/scenario/src/api/impl_vh/single_tx_api.rs | VMHooksDebugger + drop behavior flag |
| framework/scenario/src/api/impl_vh/debug_handle.rs | !Send/!Sync + opt context access |
| framework/scenario/src/api/impl_vh/debug_api.rs | ctx-if-active drop support |
| framework/scenario/src/api/impl_vh.rs | Re-exports incl. StaticApiHandle |
| framework/scenario/src/api.rs | Export StaticApiHandle |
| framework/scenario/Cargo.toml | Add static_assertions dev-dep |
| framework/derive/src/managed_vec_item_derive.rs | Derive unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/token/payment.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/token/fungible_payment.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/token/esdt_token_payment.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/token/egld_or_esdt_token_payment.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/num/big_uint_operators.rs | Init-handle constructor usage |
| framework/base/src/types/managed/wrapped/num/big_uint.rs | Add new_init_handle helper |
| framework/base/src/types/managed/wrapped/managed_vec_ref_mut.rs | Avoid double-drop on ref-mut drop |
| framework/base/src/types/managed/wrapped/managed_vec_ref.rs | Soft-drop strategy for refs |
| framework/base/src/types/managed/wrapped/managed_vec_iter_owned.rs | Unsafe read_from_payload call sites |
| framework/base/src/types/managed/wrapped/managed_vec_item.rs | unsafe read + requires_drop + temp_decode |
| framework/base/src/types/managed/wrapped/managed_vec.rs | Drop items, safe slice, dedup fixes |
| framework/base/src/types/managed/wrapped/managed_ref_mut.rs | Make wrap_handle public unsafe |
| framework/base/src/types/managed/wrapped/managed_option.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/managed_decimal/managed_decimal_signed.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/managed_decimal.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/wrapped/encoded_managed_vec_item.rs | Decode via borrow_from_payload |
| framework/base/src/types/managed/multi_value/payment_multi_value.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/multi_value/multi_value_managed_vec_counted.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/multi_value/multi_value_managed_vec.rs | slice now requires Clone |
| framework/base/src/types/managed/multi_value/multi_value_encoded.rs | to_arg_buffer clone + into_arg_buffer |
| framework/base/src/types/managed/multi_value/esdt_token_payment_multi_value.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/multi_value/egld_or_esdt_token_payment_multi_value.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/types/managed/managed_type_trait.rs | Use get_raw_handle directly |
| framework/base/src/types/managed/basic/managed_map.rs | Add Drop calling VM drop hook |
| framework/base/src/types/managed/basic/managed_buffer.rs | Add Drop + clone adjustment |
| framework/base/src/types/managed/basic/elliptic_curve.rs | Clone handle arguments |
| framework/base/src/types/managed/basic/big_int_operators.rs | Init-handle updates (partial) |
| framework/base/src/types/managed/basic/big_int.rs | Add Drop + new_init_handle |
| framework/base/src/types/managed/basic/big_float_operators.rs | Use new_init_handle |
| framework/base/src/types/managed/basic/big_float.rs | Add new_init_handle + Drop |
| framework/base/src/types/interaction/tx_data/function_call.rs | Use into_arg_buffer |
| framework/base/src/types/interaction/managed_arg_buffer.rs | ManagedVecItem unsafe read + requires_drop |
| framework/base/src/storage/storage_set.rs | Use ManagedRef wrap_handle |
| framework/base/src/contract_base/wrappers/storage_raw_wrapper.rs | Use ManagedBuffer::new_uninit |
| framework/base/src/contract_base/wrappers/blockchain_wrapper.rs | Use ManagedRef wrap_handle |
| framework/base/src/api/managed_types/managed_type_api_impl.rs | Default drop hooks + requires_drop flag |
| contracts/feature-tests/rust-testing-framework-tester/scenarios/test.scen.json | Rename id → txId |
| contracts/feature-tests/composability/forwarder/src/fwd_nft.rs | Use into_arg_buffer |
| contracts/feature-tests/composability/forwarder/src/fwd_fallible.rs | Use into_arg_buffer |
| contracts/feature-tests/composability/forwarder/src/fwd_call_promise_direct.rs | Use into_arg_buffer |
| contracts/feature-tests/composability/forwarder-raw/src/forwarder_raw_sync.rs | Use into_arg_buffer |
| contracts/feature-tests/composability/forwarder-raw/src/forwarder_raw_deploy_upgrade.rs | Use into_arg_buffer |
| contracts/feature-tests/composability/forwarder-raw/src/forwarder_raw_alt_init.rs | Use into_arg_buffer |
| contracts/feature-tests/composability/forwarder-legacy/src/fwd_nft_legacy.rs | Use into_arg_buffer |
| contracts/feature-tests/basic-features/tests/basic_features_managed_buffer_test.rs | Add ManagedBuffer drop test |
| chain/vm/src/host/vm_hooks/vh_handler/vh_managed_types/vh_managed_map.rs | Add mm_drop handler |
| chain/vm/src/host/vm_hooks/vh_handler/vh_managed_types/vh_managed_buffer.rs | Add mb_drop handler |
| chain/vm/src/host/vm_hooks/vh_handler/vh_managed_types/vh_big_int.rs | Add bi_drop handler |
| chain/vm/src/host/vm_hooks/vh_handler/vh_managed_types/vh_big_float.rs | Add bf_drop handler |
| chain/vm/src/host/vm_hooks/vh_dispatcher.rs | Expose handler publicly |
| chain/vm/src/host/context/managed_type_container/tx_managed_map.rs | Remove map handle support |
| chain/vm/src/host/context/managed_type_container/tx_managed_buffer.rs | Remove buffer handle support |
| chain/vm/src/host/context/managed_type_container/tx_big_int.rs | Remove big-int handle support |
| chain/vm/src/host/context/managed_type_container/tx_big_float.rs | Remove big-float handle support |
| chain/vm/src/host/context/managed_type_container/handle_map.rs | Add remove_handle + shrink heuristic |
| Cargo.toml | Add managed-mem-bench member |
| Cargo.lock | Lockfile updates for new crate/deps |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Pull request overview
Adds explicit deallocation support for managed types (especially under
StaticApi) by introducing VM drop hooks, tightening handle/thread-safety guarantees, and updatingManagedVecItem/ManagedVecdecoding and lifecycle behavior to avoid double-drops. Also introduces a small benchmarking tool to measure managed-type memory retention/leaks and extends scenario/unit test coverage around the new semantics.Changes:
ManagedVecItem::read_from_payloadbecomesunsafe, addrequires_drop, adjustManagedVecdrop/slice/dedup behaviors).managed-mem-benchbinaries and extra tests/static assertions for!Send/!Syncand equality/drop behavior.