mirror of
https://github.com/fluencelabs/marine-rs-sdk
synced 2025-03-15 14:30:48 +00:00
pr fixes
This commit is contained in:
parent
766da0bf0f
commit
17115b696a
@ -14,9 +14,6 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#[cfg(feature = "debug")]
|
|
||||||
use super::log;
|
|
||||||
|
|
||||||
/// Allocates memory area of specified size and type and returns its address.
|
/// Allocates memory area of specified size and type and returns its address.
|
||||||
/// The allocated memory region is intended to be use as a Vec.
|
/// The allocated memory region is intended to be use as a Vec.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -27,8 +24,7 @@ pub unsafe fn allocate(elem_count: usize, elem_ty: usize) -> usize {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let allocated_mem = allocate_impl(elem_count, elem_ty);
|
let allocated_mem = allocate_impl(elem_count, elem_ty);
|
||||||
#[cfg(feature = "debug")]
|
crate::debug_log!(format!(
|
||||||
log(format!(
|
|
||||||
"sdk.allocate: {} {} -> {}\n",
|
"sdk.allocate: {} {} -> {}\n",
|
||||||
elem_count, elem_ty, allocated_mem
|
elem_count, elem_ty, allocated_mem
|
||||||
));
|
));
|
||||||
@ -36,30 +32,29 @@ pub unsafe fn allocate(elem_count: usize, elem_ty: usize) -> usize {
|
|||||||
allocated_mem
|
allocated_mem
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! alloc {
|
|
||||||
($ty:ty, $elem_count:expr) => {{
|
|
||||||
let vec = Vec::<$ty>::with_capacity($elem_count);
|
|
||||||
let offset = vec.as_ptr() as usize;
|
|
||||||
std::mem::forget(vec);
|
|
||||||
offset
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
fn allocate_impl(elem_count: usize, elem_ty: usize) -> usize {
|
fn allocate_impl(elem_count: usize, elem_ty: usize) -> usize {
|
||||||
// TODO: handle OOM
|
|
||||||
// Such allocation scheme is needed to deal with Vec layout
|
|
||||||
match elem_ty {
|
match elem_ty {
|
||||||
0 => alloc!(u8, elem_count), // for booleans
|
0 => allocate_vec::<u8>(elem_count), // for booleans
|
||||||
1 => alloc!(u8, elem_count),
|
1 => allocate_vec::<u8>(elem_count),
|
||||||
2 => alloc!(u16, elem_count),
|
2 => allocate_vec::<u16>(elem_count),
|
||||||
3 => alloc!(u32, elem_count),
|
3 => allocate_vec::<u32>(elem_count),
|
||||||
4 => alloc!(u64, elem_count),
|
4 => allocate_vec::<u64>(elem_count),
|
||||||
5 => alloc!(i8, elem_count),
|
5 => allocate_vec::<i8>(elem_count),
|
||||||
6 => alloc!(i16, elem_count),
|
6 => allocate_vec::<i16>(elem_count),
|
||||||
7 => alloc!(i32, elem_count),
|
7 => allocate_vec::<i32>(elem_count),
|
||||||
8 => alloc!(i64, elem_count),
|
8 => allocate_vec::<i64>(elem_count),
|
||||||
9 => alloc!(f32, elem_count),
|
9 => allocate_vec::<f32>(elem_count),
|
||||||
10 => alloc!(f64, elem_count),
|
10 => allocate_vec::<f64>(elem_count),
|
||||||
_ => 0,
|
_ => 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn allocate_vec<T>(count: usize) -> usize {
|
||||||
|
// TODO: handle OOM
|
||||||
|
// This allocation scheme with vectors is needed to deal with internal Vec layout
|
||||||
|
let vec = Vec::<T>::with_capacity(count);
|
||||||
|
let offset = vec.as_ptr() as usize;
|
||||||
|
std::mem::forget(vec);
|
||||||
|
|
||||||
|
offset
|
||||||
|
}
|
||||||
|
@ -57,12 +57,16 @@ pub use result::add_object_to_release;
|
|||||||
pub use module_manifest::MANIFEST_SECTION_NAME;
|
pub use module_manifest::MANIFEST_SECTION_NAME;
|
||||||
pub use sdk_version_embedder::VERSION_SECTION_NAME;
|
pub use sdk_version_embedder::VERSION_SECTION_NAME;
|
||||||
|
|
||||||
// logs will be printed only if debug feature is enabled
|
// these logs will be printed only if debug feature is enabled
|
||||||
#[cfg(feature = "debug")]
|
#[macro_export]
|
||||||
#[allow(unused_variables)]
|
macro_rules! debug_log {
|
||||||
pub(crate) fn log<S: AsRef<str>>(msg: S) {
|
($msg_generator:expr) => {
|
||||||
let level = log::Level::Info as i32;
|
#[cfg(feature = "debug")]
|
||||||
let target = 0i32;
|
{
|
||||||
let msg = msg.as_ref();
|
let level = log::Level::Info as i32;
|
||||||
logger::log_utf8_string(level, target, msg.as_ptr() as i32, msg.len() as i32);
|
let target = 0i32;
|
||||||
|
let msg = $msg_generator;
|
||||||
|
logger::log_utf8_string(level, target, msg.as_ptr() as i32, msg.len() as i32);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,6 @@
|
|||||||
//! by two global variables that contain pointer and size. Will be refactored after multi-value
|
//! by two global variables that contain pointer and size. Will be refactored after multi-value
|
||||||
//! support in Wasmer.
|
//! support in Wasmer.
|
||||||
|
|
||||||
#[cfg(feature = "debug")]
|
|
||||||
use super::log;
|
|
||||||
|
|
||||||
use std::sync::atomic::AtomicUsize;
|
use std::sync::atomic::AtomicUsize;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
@ -32,8 +29,7 @@ thread_local!(static OBJECTS_TO_RELEASE: RefCell<Vec<Box<dyn Any>>> = RefCell::n
|
|||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn get_result_ptr() -> usize {
|
pub unsafe fn get_result_ptr() -> usize {
|
||||||
#[cfg(feature = "debug")]
|
crate::debug_log!(format!(
|
||||||
log(format!(
|
|
||||||
"sdk.get_result_ptr, returns {}\n",
|
"sdk.get_result_ptr, returns {}\n",
|
||||||
*RESULT_PTR.get_mut()
|
*RESULT_PTR.get_mut()
|
||||||
));
|
));
|
||||||
@ -43,8 +39,7 @@ pub unsafe fn get_result_ptr() -> usize {
|
|||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn get_result_size() -> usize {
|
pub unsafe fn get_result_size() -> usize {
|
||||||
#[cfg(feature = "debug")]
|
crate::debug_log!(format!(
|
||||||
log(format!(
|
|
||||||
"sdk.get_result_size, returns {}\n",
|
"sdk.get_result_size, returns {}\n",
|
||||||
*RESULT_SIZE.get_mut()
|
*RESULT_SIZE.get_mut()
|
||||||
));
|
));
|
||||||
@ -54,16 +49,14 @@ pub unsafe fn get_result_size() -> usize {
|
|||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn set_result_ptr(ptr: usize) {
|
pub unsafe fn set_result_ptr(ptr: usize) {
|
||||||
#[cfg(feature = "debug")]
|
crate::debug_log!(format!("sdk.set_result_ptr: {}\n", ptr));
|
||||||
log(format!("sdk.set_result_ptr: {}\n", ptr));
|
|
||||||
|
|
||||||
*RESULT_PTR.get_mut() = ptr;
|
*RESULT_PTR.get_mut() = ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn set_result_size(size: usize) {
|
pub unsafe fn set_result_size(size: usize) {
|
||||||
#[cfg(feature = "debug")]
|
crate::debug_log!(format!("sdk.set_result_size: {}\n", size));
|
||||||
log(format!("sdk.set_result_size: {}\n", size));
|
|
||||||
|
|
||||||
*RESULT_SIZE.get_mut() = size;
|
*RESULT_SIZE.get_mut() = size;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,8 @@ pub(crate) struct AstFnSignature {
|
|||||||
pub visibility: syn::Visibility,
|
pub visibility: syn::Visibility,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub arguments: Vec<AstFnArgument>,
|
pub arguments: Vec<AstFnArgument>,
|
||||||
// fce supports only one return value now,
|
// only one or zero return values are supported now,
|
||||||
// waiting for adding multi-value support in Wasmer.
|
// waiting for adding multi-value support in Wasmer
|
||||||
pub output_type: Option<ParsedType>,
|
pub output_type: Option<ParsedType>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,19 +39,22 @@ pub(crate) struct AstRecordItem {
|
|||||||
pub original: syn::ItemStruct,
|
pub original: syn::ItemStruct,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)] // at the moment tuple and unit structs aren't supported
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub(crate) enum AstRecordFields {
|
pub(crate) enum AstRecordFields {
|
||||||
Named(Vec<AstRecordField>),
|
Named(Vec<AstRecordField>),
|
||||||
|
|
||||||
// named and unnamed variants have the same inner field types because of it's easy to handle it,
|
// named and unnamed variants have the same inner field types because of it's easy to handle it,
|
||||||
// for additional info look at https://github.com/dtolnay/syn/issues/698
|
// for additional info look at https://github.com/dtolnay/syn/issues/698
|
||||||
|
#[allow(dead_code)] // at the moment tuple and unit structs aren't supported
|
||||||
Unnamed(Vec<AstRecordField>),
|
Unnamed(Vec<AstRecordField>),
|
||||||
|
|
||||||
|
#[allow(dead_code)] // at the moment tuple and unit structs aren't supported
|
||||||
Unit,
|
Unit,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub(crate) struct AstRecordField {
|
pub(crate) struct AstRecordField {
|
||||||
// fields of tuple structs haven't got name
|
/// Name of the field. Can be `None` for tuples.
|
||||||
pub name: Option<String>,
|
pub name: Option<String>,
|
||||||
pub ty: ParsedType,
|
pub ty: ParsedType,
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ pub(crate) fn generate_vector_ser(
|
|||||||
fluence::internal::add_object_to_release(Box::new(converted_bool_vector));
|
fluence::internal::add_object_to_release(Box::new(converted_bool_vector));
|
||||||
(converted_bool_vector.as_ptr() as _, converted_bool_vector.len() as _)
|
(converted_bool_vector.as_ptr() as _, converted_bool_vector.len() as _)
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
ParsedType::I8(_)
|
ParsedType::I8(_)
|
||||||
| ParsedType::U8(_)
|
| ParsedType::U8(_)
|
||||||
| ParsedType::I16(_)
|
| ParsedType::I16(_)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user