Skip to content
Draft
20 changes: 10 additions & 10 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ impl<V> HandleMap<V> {
}

pub fn remove_handle(&mut self, handle: RawHandle) {
assert!(
self.map.contains_key(&handle),
"attempting to remove non-existing handle {handle}, this is a memory managedment issue"
);
let _ = self.map.remove(&handle);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ impl ManagedTypeContainer {
}

pub fn mb_remove(&mut self, handle: RawHandle) {
println!("removing MB: {handle}");
self.managed_buffer_map.remove_handle(handle);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pub trait ForwarderBarnard {
.to(&to)
.gas(half_gas)
.raw_call(endpoint_name)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.returns(ReturnsHandledOrError::new().returns(ReturnsRawResult))
.sync_call_fallible();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ pub trait ForwarderNftModule: fwd_storage_legacy::ForwarderStorageModule {
&amount,
self.blockchain().get_gas_left(),
&function,
&arguments.to_arg_buffer(),
&arguments.into_arg_buffer(),
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ pub trait ForwarderQueue {
to,
gas_limit,
endpoint_name,
args: args.to_arg_buffer(),
args: args.into_arg_buffer(),
payments,
});
}
Expand Down Expand Up @@ -144,7 +144,7 @@ pub trait ForwarderQueue {
to,
gas_limit,
endpoint_name,
args: args.to_arg_buffer(),
args: args.into_arg_buffer(),
payments,
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub trait ForwarderRawAlternativeInit: super::forwarder_raw_common::ForwarderRaw
self.tx()
.to(&to)
.raw_call(endpoint_name)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.async_call_and_exit();
}

Expand Down Expand Up @@ -61,7 +61,7 @@ pub trait ForwarderRawAlternativeInit: super::forwarder_raw_common::ForwarderRaw
.gas(half_gas)
.egld(payment)
.raw_call(endpoint_name)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.returns(ReturnsRawResult)
.sync_call();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ pub trait ForwarderRawAsync: super::forwarder_raw_common::ForwarderRawCommon {
self.tx()
.to(to)
.raw_call(endpoint_name)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.payment(EgldOrEsdtTokenPayment::new(
payment_token,
0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ pub trait ForwarderRawDeployUpgrade {
.raw_deploy()
.code(code)
.code_metadata(code_metadata)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.gas(self.blockchain().get_gas_left())
.returns(ReturnsNewManagedAddress)
.returns(ReturnsRawResult)
Expand All @@ -32,7 +32,7 @@ pub trait ForwarderRawDeployUpgrade {
.raw_deploy()
.from_source(source_contract_address)
.code_metadata(code_metadata)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.gas(self.blockchain().get_gas_left())
.returns(ReturnsNewManagedAddress)
.sync_call()
Expand All @@ -51,7 +51,7 @@ pub trait ForwarderRawDeployUpgrade {
.raw_upgrade()
.code(new_code)
.code_metadata(code_metadata)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.upgrade_async_call_and_exit();
}

Expand All @@ -68,7 +68,7 @@ pub trait ForwarderRawDeployUpgrade {
.raw_upgrade()
.from_source(source_contract_address)
.code_metadata(code_metadata)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.gas(self.blockchain().get_gas_left())
.upgrade_async_call_and_exit();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ pub trait ForwarderRawSync: super::forwarder_raw_common::ForwarderRawCommon {
let payment = self.call_value().egld();
let one_third_gas = self.blockchain().get_gas_left() / 3;
let half_payment = &*payment / 2u32;
let arg_buffer = args.to_arg_buffer();
let arg_buffer = args.into_arg_buffer();

let result = self
.tx()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ pub trait CallPromisesDirectModule {
.to(&to)
.raw_call(endpoint_name)
.payment(payment)
.arguments_raw(args.to_arg_buffer())
.arguments_raw(args.into_arg_buffer())
.gas(gas_limit)
.callback(self.callbacks().the_one_callback(1001, 1002u32.into()))
.gas_for_callback(extra_gas_for_callback)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ pub trait ForwarderNftModule: fwd_storage::ForwarderStorageModule {
.to(&to)
.gas(gas_left)
.raw_call(function)
.arguments_raw(arguments.to_arg_buffer())
.arguments_raw(arguments.into_arg_buffer())
.single_esdt(&token_identifier, nonce, &amount)
.transfer_execute();
}
Expand Down
3 changes: 3 additions & 0 deletions framework/base/src/api/managed_types/managed_type_api_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ pub trait ManagedTypeApiImpl:
token_identifier_util::get_token_ticker_len(token_id_len)
}

fn requires_managed_type_drop(&self) -> bool {
false
}
fn drop_managed_buffer(&self, _handle: Self::ManagedBufferHandle) {}
fn drop_big_float(&self, _handle: Self::BigFloatHandle) {}
fn drop_big_int(&self, _handle: Self::BigIntHandle) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ use crate::{
types::{
BackTransfers, BackTransfersLegacy, BigUint, CodeMetadata, EgldOrEsdtTokenIdentifier,
EgldOrEsdtTokenPayment, EsdtLocalRoleFlags, EsdtTokenData, EsdtTokenType, ManagedAddress,
ManagedBuffer, ManagedByteArray, ManagedRefMut, ManagedType, ManagedVec, SystemSCAddress,
TokenIdentifier,
ManagedBuffer, ManagedByteArray, ManagedRef, ManagedRefMut, ManagedType, ManagedVec,
SystemSCAddress, TokenIdentifier,
},
};

Expand Down Expand Up @@ -386,8 +386,7 @@ where
big_int_temp_handle.clone(),
);

let bu = BigUint::<A>::from_handle(big_int_temp_handle);
// TODO: forget bu
let bu = ManagedRef::<A, BigUint<A>>::wrap_handle(big_int_temp_handle); // BigUint::<A>::from_handle(big_int_temp_handle);
bu.to_u64().unwrap_or(255)
}
}
Expand Down Expand Up @@ -619,7 +618,7 @@ where
result_handle.clone(),
);

let result = unsafe { ManagedBuffer::<A>::from_handle(result_handle) };
let result = unsafe { ManagedRef::<A, ManagedBuffer<A>>::wrap_handle(result_handle) };

// Decoding the response needs more research
// Empty response means no address has transferRole for the token
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ use crate::api::HandleConstraints;
use crate::codec::{TopDecode, TopEncode};

use crate::{
api::{
const_handles::MBUF_TEMPORARY_1, use_raw_handle, ErrorApi, ManagedTypeApi, StorageReadApi,
StorageReadApiImpl, StorageWriteApi,
},
api::{ErrorApi, ManagedTypeApi, StorageReadApi, StorageReadApiImpl, StorageWriteApi},
storage::StorageKey,
storage_get,
storage_get::StorageGetErrorHandler,
Expand Down Expand Up @@ -59,8 +56,7 @@ where
V: TopDecode,
{
let key: StorageKey<A> = storage_key.into();
let result_buffer =
unsafe { ManagedBuffer::<A>::from_handle(use_raw_handle(MBUF_TEMPORARY_1)) };
let result_buffer = unsafe { ManagedBuffer::<A>::new_uninit() };
A::storage_read_api_impl().storage_load_from_address(
address.get_handle(),
key.get_handle(),
Expand Down
4 changes: 2 additions & 2 deletions framework/base/src/storage/storage_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ where

let handle: A::ManagedBufferHandle = use_raw_handle(const_handles::MBUF_TEMPORARY_1);
A::managed_type_impl().mb_from_small_int_unsigned(handle.clone(), value as i64);
let managed_buffer = unsafe { ManagedBuffer::from_handle(handle) };
let managed_buffer = unsafe { ManagedRef::wrap_handle(handle) };
self.set_managed_buffer(&managed_buffer);
}

Expand All @@ -63,7 +63,7 @@ where

let handle: A::ManagedBufferHandle = use_raw_handle(const_handles::MBUF_TEMPORARY_1);
A::managed_type_impl().mb_from_small_int_signed(handle.clone(), value);
let managed_buffer = unsafe { ManagedBuffer::from_handle(handle) };
let managed_buffer = unsafe { ManagedRef::wrap_handle(handle) };
self.set_managed_buffer(&managed_buffer);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ where
MultiValueEncoded::<Api, ManagedBuffer<Api>>::multi_decode_or_handle_err(input, h)?;
Ok(FunctionCall {
function_name,
arg_buffer: args.to_arg_buffer(),
arg_buffer: args.into_arg_buffer(),
})
}
}
Expand Down
12 changes: 5 additions & 7 deletions framework/base/src/types/managed/basic/managed_buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::{
abi::{TypeAbi, TypeAbiFrom, TypeName},
api::{
use_raw_handle, ErrorApiImpl, HandleConstraints, InvalidSliceError, ManagedBufferApiImpl,
ManagedTypeApi, RawHandle, StaticVarApiImpl,
ManagedTypeApi, ManagedTypeApiImpl, RawHandle, StaticVarApiImpl,
},
codec::{
DecodeErrorHandler, Empty, EncodeErrorHandler, NestedDecode, NestedDecodeInput,
Expand Down Expand Up @@ -418,17 +418,15 @@ impl<M: ManagedTypeApi> ManagedBuffer<M> {

impl<M: ManagedTypeApi> Clone for ManagedBuffer<M> {
fn clone(&self) -> Self {
let api = M::managed_type_impl();
let clone_handle = api.mb_new_empty();
api.mb_append(clone_handle.clone(), self.handle.clone());
unsafe { ManagedBuffer::from_handle(clone_handle) }
let cloned = ManagedBuffer::new();
M::managed_type_impl().mb_append(cloned.get_handle(), self.handle.clone());
cloned
}
}

impl<M: ManagedTypeApi> Drop for ManagedBuffer<M> {
fn drop(&mut self) {
// TODO: enable, after fixing all ownership issues
// M::managed_type_impl().drop_managed_buffer(self.handle.clone());
M::managed_type_impl().drop_managed_buffer(self.handle.clone());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ impl<M: ManagedTypeApi> ManagedVecItem for EgldOrEsdtTokenPaymentMultiValue<M> {
const SKIPS_RESERIALIZATION: bool = EgldOrEsdtTokenPayment::<M>::SKIPS_RESERIALIZATION;
type Ref<'a> = ManagedVecRef<'a, Self>;

fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
unsafe fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
EgldOrEsdtTokenPayment::read_from_payload(payload).into()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ impl<M: ManagedTypeApi> ManagedVecItem for EsdtTokenPaymentMultiValue<M> {
const SKIPS_RESERIALIZATION: bool = EsdtTokenPayment::<M>::SKIPS_RESERIALIZATION;
type Ref<'a> = ManagedVecRef<'a, Self>;

fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
unsafe fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
EsdtTokenPayment::read_from_payload(payload).into()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
},
contract_base::{ExitCodecErrorHandler, ManagedSerializer},
err_msg,
types::{ManagedArgBuffer, ManagedBuffer, ManagedType, ManagedVec, ManagedVecItem},
types::{ManagedArgBuffer, ManagedBuffer, ManagedVec, ManagedVecItem},
};
use core::{iter::FromIterator, marker::PhantomData};

Expand Down Expand Up @@ -107,7 +107,11 @@ where
M: ManagedTypeApi,
{
pub fn to_arg_buffer(&self) -> ManagedArgBuffer<M> {
unsafe { ManagedArgBuffer::from_handle(self.raw_buffers.get_handle()) }
ManagedArgBuffer::from(self.raw_buffers.clone())
}

pub fn into_arg_buffer(self) -> ManagedArgBuffer<M> {
ManagedArgBuffer::from(self.raw_buffers)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ where
const SKIPS_RESERIALIZATION: bool = false;
type Ref<'a> = Self;

fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
unsafe fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
Self::from(ManagedVec::<M, T>::read_from_payload(payload))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ impl<M: ManagedTypeApi> ManagedVecItem for EgldOrEsdtTokenPayment<M> {
const SKIPS_RESERIALIZATION: bool = false;
type Ref<'a> = ManagedVecRef<'a, Self>;

fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
unsafe fn read_from_payload(payload: &Self::PAYLOAD) -> Self {
let mut index = 0;
unsafe {
EgldOrEsdtTokenPayment {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ where
T: ManagedVecItem,
{
pub(crate) fn decode(&self) -> T {
T::read_from_payload(&self.encoded)
// TODO: not safe!!
// must revisit
unsafe { T::read_from_payload(&self.encoded) }
}
}

Expand Down
Loading
Loading