From a25bb62b58564c7205fd55f48c3aaebc5a1defe0 Mon Sep 17 00:00:00 2001 From: Andrei Marinica Date: Mon, 10 Jun 2024 16:24:46 +0300 Subject: [PATCH 1/3] managed dealloc - api --- .../base/src/api/managed_types/managed_type_api_impl.rs | 6 ++++++ framework/base/src/types/managed/basic/managed_buffer.rs | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/framework/base/src/api/managed_types/managed_type_api_impl.rs b/framework/base/src/api/managed_types/managed_type_api_impl.rs index 1d2ead32ec..985678da17 100644 --- a/framework/base/src/api/managed_types/managed_type_api_impl.rs +++ b/framework/base/src/api/managed_types/managed_type_api_impl.rs @@ -65,4 +65,10 @@ pub trait ManagedTypeApiImpl: fn get_token_ticker_len(&self, token_id_len: usize) -> usize { super::token_identifier_util::get_token_ticker_len(token_id_len) } + + fn drop_managed_buffer(&self, _handle: Self::ManagedBufferHandle) {} + fn drop_big_float(&self, _handle: Self::BigFloatHandle) {} + fn drop_big_int(&self, _handle: Self::BigIntHandle) {} + fn drop_elliptic_curve(&self, _handle: Self::EllipticCurveHandle) {} + fn drop_managed_map(&self, _handle: Self::ManagedMapHandle) {} } diff --git a/framework/base/src/types/managed/basic/managed_buffer.rs b/framework/base/src/types/managed/basic/managed_buffer.rs index d232776b2e..8152080317 100644 --- a/framework/base/src/types/managed/basic/managed_buffer.rs +++ b/framework/base/src/types/managed/basic/managed_buffer.rs @@ -1,8 +1,7 @@ use crate::{ abi::{TypeAbi, TypeAbiFrom, TypeName}, api::{ - use_raw_handle, ErrorApiImpl, HandleConstraints, InvalidSliceError, ManagedBufferApiImpl, - ManagedTypeApi, StaticVarApiImpl, + use_raw_handle, ErrorApiImpl, HandleConstraints, InvalidSliceError, ManagedBufferApiImpl, ManagedTypeApi, ManagedTypeApiImpl, StaticVarApiImpl }, codec::{ DecodeErrorHandler, Empty, EncodeErrorHandler, NestedDecode, NestedDecodeInput, @@ -350,6 +349,12 @@ impl Clone for ManagedBuffer { } } +impl Drop for ManagedBuffer { + fn drop(&mut self) { + M::managed_type_impl().drop_managed_buffer(self.get_handle()); + } +} + impl PartialEq for ManagedBuffer { #[inline] fn eq(&self, other: &Self) -> bool { From 9dd2bffd3fe96b8dd5ee95388ce41d97f1a277e4 Mon Sep 17 00:00:00 2001 From: Alin Cruceat Date: Tue, 18 Jun 2024 09:41:10 +0300 Subject: [PATCH 2/3] drop for managed buffer --- .../basic_features_managed_buffer_test.rs | 7 +++++++ .../managed_types/managed_type_api_impl.rs | 21 ++++++++++++++----- .../src/types/managed/basic/managed_buffer.rs | 5 +++-- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/contracts/feature-tests/basic-features/tests/basic_features_managed_buffer_test.rs b/contracts/feature-tests/basic-features/tests/basic_features_managed_buffer_test.rs index 88320b17f6..e775c5e167 100644 --- a/contracts/feature-tests/basic-features/tests/basic_features_managed_buffer_test.rs +++ b/contracts/feature-tests/basic-features/tests/basic_features_managed_buffer_test.rs @@ -15,3 +15,10 @@ fn test_managed_address_zero() { let result = bf.managed_address_zero(); assert_eq!(ManagedAddress::zero(), result); } + +#[test] +fn test_managed_buffer_destructor() { + let my_buffer = ManagedBuffer::::from(b"my buffer"); + assert_eq!(my_buffer, managed_buffer!(b"my buffer")); + drop(my_buffer); +} diff --git a/framework/base/src/api/managed_types/managed_type_api_impl.rs b/framework/base/src/api/managed_types/managed_type_api_impl.rs index 985678da17..c0f34284c0 100644 --- a/framework/base/src/api/managed_types/managed_type_api_impl.rs +++ b/framework/base/src/api/managed_types/managed_type_api_impl.rs @@ -66,9 +66,20 @@ pub trait ManagedTypeApiImpl: super::token_identifier_util::get_token_ticker_len(token_id_len) } - fn drop_managed_buffer(&self, _handle: Self::ManagedBufferHandle) {} - fn drop_big_float(&self, _handle: Self::BigFloatHandle) {} - fn drop_big_int(&self, _handle: Self::BigIntHandle) {} - fn drop_elliptic_curve(&self, _handle: Self::EllipticCurveHandle) {} - fn drop_managed_map(&self, _handle: Self::ManagedMapHandle) {} + fn drop_managed_buffer(&self, handle: Self::ManagedBufferHandle) { + drop(handle) + } + + fn drop_big_float(&self, handle: Self::BigFloatHandle) { + drop(handle) + } + fn drop_big_int(&self, handle: Self::BigIntHandle) { + drop(handle) + } + fn drop_elliptic_curve(&self, handle: Self::EllipticCurveHandle) { + drop(handle) + } + fn drop_managed_map(&self, handle: Self::ManagedMapHandle) { + drop(handle) + } } diff --git a/framework/base/src/types/managed/basic/managed_buffer.rs b/framework/base/src/types/managed/basic/managed_buffer.rs index 8152080317..34ec9e44c9 100644 --- a/framework/base/src/types/managed/basic/managed_buffer.rs +++ b/framework/base/src/types/managed/basic/managed_buffer.rs @@ -1,7 +1,8 @@ use crate::{ abi::{TypeAbi, TypeAbiFrom, TypeName}, api::{ - use_raw_handle, ErrorApiImpl, HandleConstraints, InvalidSliceError, ManagedBufferApiImpl, ManagedTypeApi, ManagedTypeApiImpl, StaticVarApiImpl + use_raw_handle, ErrorApiImpl, HandleConstraints, InvalidSliceError, ManagedBufferApiImpl, + ManagedTypeApi, StaticVarApiImpl, }, codec::{ DecodeErrorHandler, Empty, EncodeErrorHandler, NestedDecode, NestedDecodeInput, @@ -351,7 +352,7 @@ impl Clone for ManagedBuffer { impl Drop for ManagedBuffer { fn drop(&mut self) { - M::managed_type_impl().drop_managed_buffer(self.get_handle()); + let _ = core::mem::replace(&mut self.get_handle(), unsafe { core::mem::zeroed() }); } } From 951a7d817ecd651ac2a2fc2d7e9d94495ed983f7 Mon Sep 17 00:00:00 2001 From: Alin Cruceat Date: Tue, 18 Jun 2024 09:56:33 +0300 Subject: [PATCH 3/3] leave just managed buffer destructor --- .../api/managed_types/managed_type_api_impl.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/framework/base/src/api/managed_types/managed_type_api_impl.rs b/framework/base/src/api/managed_types/managed_type_api_impl.rs index c0f34284c0..6446aa896d 100644 --- a/framework/base/src/api/managed_types/managed_type_api_impl.rs +++ b/framework/base/src/api/managed_types/managed_type_api_impl.rs @@ -70,16 +70,8 @@ pub trait ManagedTypeApiImpl: drop(handle) } - fn drop_big_float(&self, handle: Self::BigFloatHandle) { - drop(handle) - } - fn drop_big_int(&self, handle: Self::BigIntHandle) { - drop(handle) - } - fn drop_elliptic_curve(&self, handle: Self::EllipticCurveHandle) { - drop(handle) - } - fn drop_managed_map(&self, handle: Self::ManagedMapHandle) { - drop(handle) - } + fn drop_big_float(&self, _handle: Self::BigFloatHandle) {} + fn drop_big_int(&self, _handle: Self::BigIntHandle) {} + fn drop_elliptic_curve(&self, _handle: Self::EllipticCurveHandle) {} + fn drop_managed_map(&self, _handle: Self::ManagedMapHandle) {} }