delete excess options

This commit is contained in:
vms 2020-05-24 18:38:26 +03:00
parent 28fd4b4ad2
commit 5e8505c3e7
3 changed files with 31 additions and 32 deletions

View File

@ -46,13 +46,13 @@ impl FCE {
let module_abi = module.acquire_abi(); let module_abi = module.acquire_abi();
// TODO: introduce a macro for such things // TODO: introduce a macro for such things
let allocate = module_abi.allocate.unwrap(); let allocate = module_abi.allocate;
namespace.insert( namespace.insert(
config.allocate_fn_name.clone(), config.allocate_fn_name.clone(),
func!(move |size: i32| -> i32 { allocate.call(size).expect("allocate failed") }), func!(move |size: i32| -> i32 { allocate.call(size).expect("allocate failed") }),
); );
let invoke = module_abi.invoke.unwrap(); let invoke = module_abi.invoke;
namespace.insert( namespace.insert(
config.invoke_fn_name.clone(), config.invoke_fn_name.clone(),
func!(move |offset: i32, size: i32| -> i32 { func!(move |offset: i32, size: i32| -> i32 {
@ -60,7 +60,7 @@ impl FCE {
}), }),
); );
let deallocate = module_abi.deallocate.unwrap(); let deallocate = module_abi.deallocate;
namespace.insert( namespace.insert(
config.deallocate_fn_name.clone(), config.deallocate_fn_name.clone(),
func!(move |ptr: i32, size: i32| { func!(move |ptr: i32, size: i32| {
@ -68,7 +68,7 @@ impl FCE {
}), }),
); );
let store = module_abi.store.unwrap(); let store = module_abi.store;
namespace.insert( namespace.insert(
config.store_fn_name.clone(), config.store_fn_name.clone(),
func!(move |offset: i32, value: i32| { func!(move |offset: i32, value: i32| {
@ -76,7 +76,7 @@ impl FCE {
}), }),
); );
let load = module_abi.load.unwrap(); let load = module_abi.load;
namespace.insert( namespace.insert(
config.load_fn_name.clone(), config.load_fn_name.clone(),
func!(move |offset: i32| -> i32 { load.call(offset).expect("load failed") }), func!(move |offset: i32| -> i32 { load.call(offset).expect("load failed") }),
@ -139,7 +139,7 @@ impl FCEService for FCE {
Entry::Occupied(module) => { Entry::Occupied(module) => {
if module.get().get_abi_ref_counter() != 0 { if module.get().get_abi_ref_counter() != 0 {
return Err(FCEError::ModuleInUse) return Err(FCEError::ModuleInUse);
} }
module.remove_entry(); module.remove_entry();
Ok(()) Ok(())

View File

@ -30,17 +30,17 @@ use crate::vm::errors::FCEError;
/// 5. deallocate(res, strlen(sql)) to clean memory. /// 5. deallocate(res, strlen(sql)) to clean memory.
pub(crate) trait ModuleABI { pub(crate) trait ModuleABI {
/// Allocates a region of memory inside a module. Used for passing argument inside the module. /// Allocates a region of memory inside a module. Used for passing argument inside the module.
fn allocate(&self, size: i32) -> Result<i32, FCEError>; fn allocate(&mut self, size: i32) -> Result<i32, FCEError>;
/// Deallocates previously allocated memory region. /// Deallocates previously allocated memory region.
fn deallocate(&self, ptr: i32, size: i32) -> Result<(), FCEError>; fn deallocate(&mut self, ptr: i32, size: i32) -> Result<(), FCEError>;
/// Calls the main entry point of a module called invoke. /// Calls the main entry point of a module called invoke.
fn invoke(&self, arg_address: i32, arg_size: i32) -> Result<i32, FCEError>; fn invoke(&mut self, arg_address: i32, arg_size: i32) -> Result<i32, FCEError>;
/// Stores one byte on given address. /// Stores one byte on given address.
fn store(&self, address: i32, value: i32) -> Result<(), FCEError>; fn store(&mut self, address: i32, value: i32) -> Result<(), FCEError>;
/// Loads one byte from given address. /// Loads one byte from given address.
fn load(&self, address: i32) -> Result<i32, FCEError>; fn load(&mut self, address: i32) -> Result<i32, FCEError>;
} }

View File

@ -34,11 +34,11 @@ pub(crate) struct ABI {
// It is safe to use unwrap() while calling these functions because Option is used here // It is safe to use unwrap() while calling these functions because Option is used here
// just to allow partially initialization. And all Option fields will contain Some if // just to allow partially initialization. And all Option fields will contain Some if
// invoking FCE::new has been succeed. // invoking FCE::new has been succeed.
pub(crate) allocate: Option<Func<'static, i32, i32>>, pub(crate) allocate: Func<'static, i32, i32>,
pub(crate) deallocate: Option<Func<'static, (i32, i32), ()>>, pub(crate) deallocate: Func<'static, (i32, i32), ()>,
pub(crate) invoke: Option<Func<'static, (i32, i32), i32>>, pub(crate) invoke: Func<'static, (i32, i32), i32>,
pub(crate) store: Option<Func<'static, (i32, i32)>>, pub(crate) store: Func<'static, (i32, i32)>,
pub(crate) load: Option<Func<'static, i32, i32>>, pub(crate) load: Func<'static, i32, i32>,
} }
/// A building block of multi-modules scheme of FCE, represents one module that corresponds /// A building block of multi-modules scheme of FCE, represents one module that corresponds
@ -106,11 +106,11 @@ impl FCEModule {
); );
Ok(ABI { Ok(ABI {
allocate: Some(allocate), allocate,
deallocate: Some(deallocate), deallocate,
invoke: Some(invoke), invoke,
store: Some(store), store,
load: Some(load), load,
}) })
} }
} }
@ -219,25 +219,24 @@ impl ModuleAPI for FCEModule {
} }
} }
#[rustfmt::skip]
impl ModuleABI for FCEModule { impl ModuleABI for FCEModule {
fn allocate(&self, size: i32) -> Result<i32, FCEError> { fn allocate(&mut self, size: i32) -> Result<i32, FCEError> {
Ok(self.abi.allocate.as_ref().unwrap().call(size)?) Ok(self.abi.allocate.call(size)?)
} }
fn deallocate(&self, ptr: i32, size: i32) -> Result<(), FCEError> { fn deallocate(&mut self, ptr: i32, size: i32) -> Result<(), FCEError> {
Ok(self.abi.deallocate.as_ref().unwrap().call(ptr, size)?) Ok(self.abi.deallocate.call(ptr, size)?)
} }
fn invoke(&self, arg_address: i32, arg_size: i32) -> Result<i32, FCEError> { fn invoke(&mut self, arg_address: i32, arg_size: i32) -> Result<i32, FCEError> {
Ok(self.abi.invoke.as_ref().unwrap().call(arg_address, arg_size)?) Ok(self.abi.invoke.call(arg_address, arg_size)?)
} }
fn store(&self, address: i32, value: i32) -> Result<(), FCEError> { fn store(&mut self, address: i32, value: i32) -> Result<(), FCEError> {
Ok(self.abi.store.as_ref().unwrap().call(address, value)?) Ok(self.abi.store.call(address, value)?)
} }
fn load(&self, address: i32) -> Result<i32, FCEError> { fn load(&mut self, address: i32) -> Result<i32, FCEError> {
Ok(self.abi.load.as_ref().unwrap().call(address)?) Ok(self.abi.load.call(address)?)
} }
} }