This commit is contained in:
vms 2021-04-07 23:20:37 +03:00
parent a4fa69e527
commit d81efab0b8
22 changed files with 520 additions and 53 deletions

View File

@ -59,7 +59,7 @@ fn collect_module_paths(
.module .module
.iter() .iter()
.map(|m| { .map(|m| {
let module_file_name = m.file_name.as_ref().unwrap_or_else(|| &m.name); let module_file_name = m.file_name.as_ref().unwrap_or(&m.name);
let module_file_name = PathBuf::from(module_file_name); let module_file_name = PathBuf::from(module_file_name);
// TODO: is it correct to always have .wasm extension? // TODO: is it correct to always have .wasm extension?
let module_path = modules_dir.join(module_file_name).with_extension("wasm"); let module_path = modules_dir.join(module_file_name).with_extension("wasm");
@ -83,6 +83,6 @@ pub(super) fn resolve_modules_dir(
.toml_faas_config .toml_faas_config
.modules_dir .modules_dir
.as_ref() .as_ref()
.map(|p| PathBuf::from(p)), .map(PathBuf::from),
} }
} }

View File

@ -25,7 +25,7 @@ use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use quote::ToTokens; use quote::ToTokens;
use std::path::PathBuf; use std::path::Path;
/// Generates glue code for tests. /// Generates glue code for tests.
/// F.e. for this test for the greeting service /// F.e. for this test for the greeting service
@ -153,7 +153,7 @@ pub(super) fn generate_test_glue_code(
Ok(glue_code) Ok(glue_code)
} }
fn generate_app_service_ctor(config_path: &str, modules_dir: &PathBuf) -> TokenStream { fn generate_app_service_ctor(config_path: &str, modules_dir: &Path) -> TokenStream {
let config_path = config_path.to_token_stream(); let config_path = config_path.to_token_stream();
let modules_dir = modules_dir.to_string_lossy().to_string(); let modules_dir = modules_dir.to_string_lossy().to_string();

View File

@ -27,7 +27,7 @@ pub(super) fn generate_module_name(module_name: &str) -> TResult<syn::Ident> {
} }
pub(super) fn generate_record_name(record_name: &str) -> TResult<syn::Ident> { pub(super) fn generate_record_name(record_name: &str) -> TResult<syn::Ident> {
let extended_record_name = format!("{}", record_name); let extended_record_name = record_name.to_string();
new_ident(&extended_record_name) new_ident(&extended_record_name)
} }

View File

@ -34,7 +34,9 @@ impl ParseMacroInput for syn::ItemFn {
.arguments .arguments
.iter() .iter()
.zip(self.sig.inputs.iter().map(|arg| arg.span())); .zip(self.sig.inputs.iter().map(|arg| arg.span()));
check_parsed_functions(parsed_args)?;
check_args(parsed_args)?;
check_output_type(&signature.output_type, self.sig.output.span())?;
let ast_fn = FCEAst::Function(AstFnItem { let ast_fn = FCEAst::Function(AstFnItem {
signature, signature,
@ -126,19 +128,35 @@ fn check_function(signature: &syn::Signature) -> Result<()> {
Ok(()) Ok(())
} }
fn check_parsed_functions<'a>( fn check_args<'a>(
args: impl ExactSizeIterator<Item = (&'a AstFnArgument, proc_macro2::Span)>, args: impl ExactSizeIterator<Item = (&'a AstFnArgument, proc_macro2::Span)>,
) -> Result<()> { ) -> Result<()> {
for (arg, span) in args { for (arg, span) in args {
if contains_inner_ref(&arg.ty) { if contains_inner_ref(&arg.ty) {
return crate::syn_error!( return crate::syn_error!(
span, span,
"vector type in export functions should take arguments only by value" "a vector type in arguments of export functions shouldn't contain references"
); );
} }
} }
return Ok(()); Ok(())
}
fn check_output_type(output_type: &Option<ParsedType>, span: proc_macro2::Span) -> Result<()> {
let ty = match output_type {
Some(ty) => ty,
None => return Ok(()),
};
if contains_inner_ref(ty) {
return crate::syn_error!(
span,
"a vector type in output types of export functions shouldn't contain references"
);
}
Ok(())
} }
/// Returns true if the given type is a vector contains a reference inside it's parameter type. /// Returns true if the given type is a vector contains a reference inside it's parameter type.

View File

@ -27,7 +27,7 @@ pub(crate) struct FnEpilogDescriptor {
pub(crate) fn_return_type: proc_macro2::TokenStream, pub(crate) fn_return_type: proc_macro2::TokenStream,
pub(crate) return_expression: proc_macro2::TokenStream, pub(crate) return_expression: proc_macro2::TokenStream,
pub(crate) epilog: proc_macro2::TokenStream, pub(crate) epilog: proc_macro2::TokenStream,
pub(crate) mem_forget: proc_macro2::TokenStream, pub(crate) objs_savings: proc_macro2::TokenStream,
} }
/// Contains all ingredients needed for epilog creation. /// Contains all ingredients needed for epilog creation.
@ -58,7 +58,7 @@ impl FnEpilogGlueCodeGenerator for FnEpilogIngredients<'_> {
fn_return_type: generate_fn_return_type(self.return_type), fn_return_type: generate_fn_return_type(self.return_type),
return_expression: generate_return_expression(self.return_type), return_expression: generate_return_expression(self.return_type),
epilog: generate_epilog(self.return_type), epilog: generate_epilog(self.return_type),
mem_forget: generate_mem_forgets(self), objs_savings: generate_objs_savings(self),
} }
} }
} }
@ -127,9 +127,11 @@ fn generate_epilog(ty: &Option<ParsedType>) -> proc_macro2::TokenStream {
quote! { quote! {
#vector_serializer #vector_serializer
let result = #generated_serializer_ident(&result); {
fluence::internal::set_result_ptr(result.0 as _); let (serialized_vec_ptr, serialized_vec_size) = #generated_serializer_ident(&result);
fluence::internal::set_result_size(result.1 as _); fluence::internal::set_result_ptr(serialized_vec_ptr as _);
fluence::internal::set_result_size(serialized_vec_size as _);
}
} }
} }
Some(_) => quote! { Some(_) => quote! {
@ -141,7 +143,14 @@ fn generate_epilog(ty: &Option<ParsedType>) -> proc_macro2::TokenStream {
/// If an export function returns a reference, this is probably a reference to one /// If an export function returns a reference, this is probably a reference to one
/// of the function arguments. If that's the case, reference must be still valid after /// of the function arguments. If that's the case, reference must be still valid after
/// the end of the function. Their deletion will be handled by IT with calling `release_objects`. /// the end of the function. Their deletion will be handled by IT with calling `release_objects`.
fn generate_mem_forgets(ingredients: &FnEpilogIngredients<'_>) -> proc_macro2::TokenStream { fn generate_objs_savings(ingredients: &FnEpilogIngredients<'_>) -> proc_macro2::TokenStream {
match ingredients.return_type {
// if type is empty we don't need to save arguments or objects
Some(ty) if !ty.is_complex_type() => return proc_macro2::TokenStream::new(),
None => return proc_macro2::TokenStream::new(),
_ => {}
};
let passing_style = ingredients.return_type.as_ref().map(passing_style_of); let passing_style = ingredients.return_type.as_ref().map(passing_style_of);
match passing_style { match passing_style {
@ -150,13 +159,13 @@ fn generate_mem_forgets(ingredients: &FnEpilogIngredients<'_>) -> proc_macro2::T
quote! { fluence::internal::add_object_to_release(Box::new(result)); } quote! { fluence::internal::add_object_to_release(Box::new(result)); }
} }
Some(PassingStyle::ByRef) | Some(PassingStyle::ByMutRef) => { Some(PassingStyle::ByRef) | Some(PassingStyle::ByMutRef) => {
mem_forget_by_args(ingredients.args, ingredients.converted_args) generate_args_savings(ingredients.args, ingredients.converted_args)
} }
None => quote! {}, None => quote! {},
} }
} }
fn mem_forget_by_args( fn generate_args_savings(
args: &[AstFnArgument], args: &[AstFnArgument],
converted_args: &[syn::Ident], converted_args: &[syn::Ident],
) -> proc_macro2::TokenStream { ) -> proc_macro2::TokenStream {

View File

@ -90,7 +90,7 @@ impl ForeignModPrologGlueCodeGenerator for Vec<AstFnArgument> {
let arg_transform = quote::quote! { let arg_transform = quote::quote! {
#vector_serializer #vector_serializer
let #arg_ident = #generated_serializer_ident(#arg_ident); let #arg_ident = #generated_serializer_ident(&#arg_ident);
}; };
arg_transforms.extend(arg_transform); arg_transforms.extend(arg_transform);
@ -110,9 +110,9 @@ impl ForeignModPrologGlueCodeGenerator for Vec<AstFnArgument> {
WrapperDescriptor { WrapperDescriptor {
arg_names, arg_names,
arg_types, arg_types,
raw_args,
arg_transforms, arg_transforms,
arg_drops, arg_drops,
raw_args,
} }
} }

View File

@ -57,7 +57,11 @@ pub(crate) fn generate_vector_serializer(
result.push(value.to_bits()); result.push(value.to_bits());
} }
(result.as_ptr() as _, (4 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
} }
ParsedType::F64(_) => { ParsedType::F64(_) => {
@ -67,7 +71,11 @@ pub(crate) fn generate_vector_serializer(
result.push(value.to_bits()); result.push(value.to_bits());
} }
(result.as_ptr() as _, (8 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 8 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
} }
ParsedType::Utf8Str(_) | ParsedType::Utf8String(_) => { ParsedType::Utf8Str(_) | ParsedType::Utf8String(_) => {
@ -79,7 +87,11 @@ pub(crate) fn generate_vector_serializer(
result.push(value.len() as _); result.push(value.len() as _);
} }
(result.as_ptr() as _, (4 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
} }
ParsedType::Vector(ty, passing_style) => { ParsedType::Vector(ty, passing_style) => {
@ -101,7 +113,11 @@ pub(crate) fn generate_vector_serializer(
result.push(size as _); result.push(size as _);
} }
(result.as_ptr() as _, (4 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
} }
@ -113,7 +129,11 @@ pub(crate) fn generate_vector_serializer(
result.push(value.__fce_generated_serialize() as _); result.push(value.__fce_generated_serialize() as _);
} }
(result.as_ptr() as _, (4 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
} }
}; };

View File

@ -64,7 +64,7 @@ impl quote::ToTokens for fce_ast_types::AstFnItem {
fn_return_type, fn_return_type,
return_expression, return_expression,
epilog, epilog,
mem_forget, objs_savings,
} = epilog_ingredients.generate_fn_epilog(); } = epilog_ingredients.generate_fn_epilog();
// here this Option must be Some // here this Option must be Some
@ -88,8 +88,8 @@ impl quote::ToTokens for fce_ast_types::AstFnItem {
// return value conversation from Rust type to a Wasm type // return value conversation from Rust type to a Wasm type
#epilog #epilog
// forget result or arguments // save objects to keep them in memory that allows IT side
#mem_forget #objs_savings
} }
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]

View File

@ -67,15 +67,16 @@ impl quote::ToTokens for fce_ast_types::AstRecordItem {
fn generate_serializer_fn(record: &fce_ast_types::AstRecordItem) -> proc_macro2::TokenStream { fn generate_serializer_fn(record: &fce_ast_types::AstRecordItem) -> proc_macro2::TokenStream {
let serializer = record.generate_serializer(); let serializer = record.generate_serializer();
let fields_count = record.fields.len();
quote::quote! { quote::quote! {
pub fn __fce_generated_serialize(self) -> *const u8 { pub fn __fce_generated_serialize(&self) -> *const u8 {
let mut raw_record: Vec<u64> = Vec::new(); let mut raw_record: Vec<u64> = Vec::with_capacity(2 * #fields_count);
#serializer #serializer
let raw_record_ptr = raw_record.as_ptr(); let raw_record_ptr = raw_record.as_ptr();
fluence::internal::add_object_to_release(Box::new(self)); fluence::internal::add_object_to_release(Box::new(raw_record));
raw_record_ptr as _ raw_record_ptr as _
} }

View File

@ -0,0 +1,129 @@
pub fn inner_arrays_1(arg: Vec<Vec<Vec<Vec<u8>>>>) -> Vec<Vec<Vec<Vec<u8>>>> {
unimplemented!()
}
#[cfg(target_arch = "wasm32")]
#[export_name = "inner_arrays_1"]
#[no_mangle]
#[doc(hidden)]
#[allow(clippy::all)]
pub unsafe fn __fce_generated_wrapper_func_inner_arrays_1(arg_0: u32, arg_1: u32) {
unsafe fn __fce_generated_vec_deserializer_0(offset: u32, size: u32) -> Vec<Vec<Vec<Vec<u8>>>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_Vec_Vec_u8__(
offset: u32,
size: u32
) -> Vec<Vec<Vec<u8>>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_Vec_Vec_u8___Vec_u8_(
offset: u32,
size: u32
) -> Vec<Vec<u8>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_Vec_Vec_u8___Vec_u8__u8(
offset: u32,
size: u32
) -> Vec<u8> {
let size = size / 8;
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
for value in arg {
result.push(value as _);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value = __fce_generated_vec_deserializer_0_Vec_Vec_u8___Vec_u8__u8(
offset as _,
size as _
);
result.push(value);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value =
__fce_generated_vec_deserializer_0_Vec_Vec_u8___Vec_u8_(offset as _, size as _);
result.push(value);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value = __fce_generated_vec_deserializer_0_Vec_Vec_u8__(offset as _, size as _);
result.push(value);
}
result
}
let converted_arg_0 = __fce_generated_vec_deserializer_0(arg_0 as _, arg_1 as _);
let result = inner_arrays_1(converted_arg_0);
unsafe fn __fce_generated_vec_serializer(arg: &Vec<Vec<Vec<Vec<u8>>>>) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_u8__(
arg: &Vec<Vec<Vec<u8>>>
) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_u8___Vec_u8_(
arg: &Vec<Vec<u8>>
) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_u8___Vec_u8__u8(
arg: &Vec<u8>
) -> (u32, u32) {
(arg.as_ptr() as _, arg.len() as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) =
__fce_generated_vec_serializer_Vec_Vec_u8___Vec_u8__u8(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) = __fce_generated_vec_serializer_Vec_Vec_u8___Vec_u8_(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) = __fce_generated_vec_serializer_Vec_Vec_u8__(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
{
let (serialized_vec_ptr, serialized_vec_size) = __fce_generated_vec_serializer(&result);
fluence::internal::set_result_ptr(serialized_vec_ptr as _);
fluence::internal::set_result_size(serialized_vec_size as _);
}
fluence::internal::add_object_to_release(Box::new(result));
}
#[cfg(target_arch = "wasm32")]
#[doc(hidden)]
#[allow(clippy::all)]
#[link_section = "__fce_generated_section__inner_arrays_1"]
pub static __fce_generated_static_global_inner_arrays_1: [u8; 327usize] = {
* b"{\"ast_type\":\"Function\",\"signature\":{\"name\":\"inner_arrays_1\",\"arguments\":[{\"name\":\"arg\",\"ty\":{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"U8\":\"ByValue\"},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]}}],\"output_type\":{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"U8\":\"ByValue\"},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]}}}"
};

View File

@ -0,0 +1,3 @@
pub fn inner_arrays_1(arg: Vec<Vec<Vec<Vec<u8>>>>) -> Vec<Vec<Vec<Vec<u8>>>> {
unimplemented!()
}

View File

@ -73,9 +73,11 @@ pub unsafe fn __fce_generated_wrapper_func_all_types(
unsafe fn __fce_generated_vec_serializer(arg: &Vec<u8>) -> (u32, u32) { unsafe fn __fce_generated_vec_serializer(arg: &Vec<u8>) -> (u32, u32) {
(arg.as_ptr() as _, arg.len() as _) (arg.as_ptr() as _, arg.len() as _)
} }
let result = __fce_generated_vec_serializer(&result); {
fluence::internal::set_result_ptr(result.0 as _); let (serialized_vec_ptr, serialized_vec_size) = __fce_generated_vec_serializer(&result);
fluence::internal::set_result_size(result.1 as _); fluence::internal::set_result_ptr(serialized_vec_ptr as _);
fluence::internal::set_result_size(serialized_vec_size as _);
}
fluence::internal::add_object_to_release(Box::new(result)); fluence::internal::add_object_to_release(Box::new(result));
} }
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]

View File

@ -0,0 +1,104 @@
pub fn test_array_refs(arg: &Vec<Vec<String>>) -> &Vec<Vec<Vec<Vec<String>>>> {
unimplemented!()
}
#[cfg(target_arch = "wasm32")]
#[export_name = "test_array_refs"]
#[no_mangle]
#[doc(hidden)]
#[allow(clippy::all)]
pub unsafe fn __fce_generated_wrapper_func_test_array_refs(arg_0: u32, arg_1: u32) {
unsafe fn __fce_generated_vec_deserializer_0(offset: u32, size: u32) -> Vec<Vec<String>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_String(offset: u32, size: u32) -> Vec<String> {
let size = size / 8;
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut arg = arg.into_iter();
let mut result = Vec::with_capacity(arg.len() / 2);
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value = String::from_raw_parts(offset as _, size as _, size as _);
result.push(value);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value = __fce_generated_vec_deserializer_0_String(offset as _, size as _);
result.push(value);
}
result
}
let converted_arg_0 = __fce_generated_vec_deserializer_0(arg_0 as _, arg_1 as _);
let result = test_array_refs(&converted_arg_0);
unsafe fn __fce_generated_vec_serializer(arg: &Vec<Vec<Vec<Vec<String>>>>) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_String__(
arg: &Vec<Vec<Vec<String>>>
) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_String___Vec_String_(
arg: &Vec<Vec<String>>
) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_String___Vec_String__String(
arg: &Vec<String>
) -> (u32, u32) {
let mut result: Vec<u32> = Vec::with_capacity(arg.len());
for value in arg {
result.push(value.as_ptr() as _);
result.push(value.len() as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) =
__fce_generated_vec_serializer_Vec_Vec_String___Vec_String__String(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) =
__fce_generated_vec_serializer_Vec_Vec_String___Vec_String_(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) = __fce_generated_vec_serializer_Vec_Vec_String__(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
{
let (serialized_vec_ptr, serialized_vec_size) = __fce_generated_vec_serializer(&result);
fluence::internal::set_result_ptr(serialized_vec_ptr as _);
fluence::internal::set_result_size(serialized_vec_size as _);
}
fluence::internal::add_object_to_release(Box::new(converted_arg_0));
}
#[cfg(target_arch = "wasm32")]
#[doc(hidden)]
#[allow(clippy::all)]
#[link_section = "__fce_generated_section__test_array_refs"]
pub static __fce_generated_static_global_test_array_refs: [u8; 294usize] = {
* b"{\"ast_type\":\"Function\",\"signature\":{\"name\":\"test_array_refs\",\"arguments\":[{\"name\":\"arg\",\"ty\":{\"Vector\":[{\"Vector\":[{\"Utf8String\":\"ByValue\"},\"ByValue\"]},\"ByRef\"]}}],\"output_type\":{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Utf8String\":\"ByValue\"},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByRef\"]}}}"
};

View File

@ -0,0 +1,3 @@
pub fn test_array_refs(arg: &Vec<Vec<String>>) -> &Vec<Vec<Vec<Vec<String>>>> {
unimplemented!()
}

View File

@ -16,8 +16,8 @@ pub struct CallParameters {
#[doc(hidden)] #[doc(hidden)]
#[allow(clippy::all)] #[allow(clippy::all)]
impl CallParameters { impl CallParameters {
pub fn __fce_generated_serialize(self) -> *const u8 { pub fn __fce_generated_serialize(&self) -> *const u8 {
let mut raw_record: Vec<u64> = Vec::new(); let mut raw_record: Vec<u64> = Vec::with_capacity(2 * 6usize);
raw_record.push(self.init_peer_id.as_ptr() as _); raw_record.push(self.init_peer_id.as_ptr() as _);
raw_record.push(self.init_peer_id.len() as _); raw_record.push(self.init_peer_id.len() as _);
raw_record.push(self.service_id.as_ptr() as _); raw_record.push(self.service_id.as_ptr() as _);
@ -38,7 +38,10 @@ impl CallParameters {
for value in arg { for value in arg {
result.push(value.__fce_generated_serialize() as _); result.push(value.__fce_generated_serialize() as _);
} }
(result.as_ptr() as _, (4 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len()); let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg { for value in arg {
@ -47,14 +50,17 @@ impl CallParameters {
result.push(ptr as _); result.push(ptr as _);
result.push(size as _); result.push(size as _);
} }
(result.as_ptr() as _, (4 * result.len()) as _) let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
} }
let serialized_arg_5 = let serialized_arg_5 =
unsafe { __fce_generated_vec_serializer_tetraplets_5(&self.tetraplets) }; unsafe { __fce_generated_vec_serializer_tetraplets_5(&self.tetraplets) };
raw_record.push(serialized_arg_5.0 as _); raw_record.push(serialized_arg_5.0 as _);
raw_record.push(serialized_arg_5.1 as _); raw_record.push(serialized_arg_5.1 as _);
let raw_record_ptr = raw_record.as_ptr(); let raw_record_ptr = raw_record.as_ptr();
fluence::internal::add_object_to_release(Box::new(self)); fluence::internal::add_object_to_release(Box::new(raw_record));
raw_record_ptr as _ raw_record_ptr as _
} }
pub unsafe fn __fce_generated_deserialize(record_ptr: *const u8) -> Self { pub unsafe fn __fce_generated_deserialize(record_ptr: *const u8) -> Self {

View File

@ -0,0 +1,140 @@
pub fn inner_arrays_2(arg: Vec<Vec<Vec<Vec<TestRecord>>>>) -> Vec<Vec<Vec<Vec<TestRecord>>>> {
unimplemented!()
}
#[cfg(target_arch = "wasm32")]
#[export_name = "inner_arrays_2"]
#[no_mangle]
#[doc(hidden)]
#[allow(clippy::all)]
pub unsafe fn __fce_generated_wrapper_func_inner_arrays_2(arg_0: u32, arg_1: u32) {
unsafe fn __fce_generated_vec_deserializer_0(
offset: u32,
size: u32
) -> Vec<Vec<Vec<Vec<TestRecord>>>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_Vec_Vec_TestRecord__(
offset: u32,
size: u32
) -> Vec<Vec<Vec<TestRecord>>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_Vec_Vec_TestRecord___Vec_TestRecord_(
offset: u32,
size: u32
) -> Vec<Vec<TestRecord>> {
let size = size / 8;
unsafe fn __fce_generated_vec_deserializer_0_Vec_Vec_TestRecord___Vec_TestRecord__TestRecord(
offset: u32,
size: u32
) -> Vec<TestRecord> {
let size = size / 8;
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
for offset in arg {
let value = TestRecord::__fce_generated_deserialize(offset as _);
result.push(value);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value = __fce_generated_vec_deserializer_0_Vec_Vec_TestRecord___Vec_TestRecord__TestRecord ( offset as _ , size as _ ) ;
result.push(value);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value = __fce_generated_vec_deserializer_0_Vec_Vec_TestRecord___Vec_TestRecord_(
offset as _,
size as _
);
result.push(value);
}
result
}
let mut arg: Vec<u64> = Vec::from_raw_parts(offset as _, size as _, size as _);
let mut result = Vec::with_capacity(arg.len());
let mut arg = arg.into_iter();
while let Some(offset) = arg.next() {
let size = arg.next().unwrap();
let value =
__fce_generated_vec_deserializer_0_Vec_Vec_TestRecord__(offset as _, size as _);
result.push(value);
}
result
}
let converted_arg_0 = __fce_generated_vec_deserializer_0(arg_0 as _, arg_1 as _);
let result = inner_arrays_2(converted_arg_0);
unsafe fn __fce_generated_vec_serializer(arg: &Vec<Vec<Vec<Vec<TestRecord>>>>) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_TestRecord__(
arg: &Vec<Vec<Vec<TestRecord>>>
) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_TestRecord___Vec_TestRecord_(
arg: &Vec<Vec<TestRecord>>
) -> (u32, u32) {
unsafe fn __fce_generated_vec_serializer_Vec_Vec_TestRecord___Vec_TestRecord__TestRecord(
arg: &Vec<TestRecord>
) -> (u32, u32) {
let mut result: Vec<u32> = Vec::with_capacity(arg.len());
for value in arg {
result.push(value.__fce_generated_serialize() as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let ( ptr , size ) = __fce_generated_vec_serializer_Vec_Vec_TestRecord___Vec_TestRecord__TestRecord ( & value ) ;
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) =
__fce_generated_vec_serializer_Vec_Vec_TestRecord___Vec_TestRecord_(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
let mut result: Vec<u32> = Vec::with_capacity(2 * arg.len());
for value in arg {
let (ptr, size) = __fce_generated_vec_serializer_Vec_Vec_TestRecord__(&value);
result.push(ptr as _);
result.push(size as _);
}
let result_ptr = result.as_ptr();
let result_len = 4 * result.len();
fluence::internal::add_object_to_release(Box::new(result));
(result_ptr as _, result_len as _)
}
{
let (serialized_vec_ptr, serialized_vec_size) = __fce_generated_vec_serializer(&result);
fluence::internal::set_result_ptr(serialized_vec_ptr as _);
fluence::internal::set_result_size(serialized_vec_size as _);
}
fluence::internal::add_object_to_release(Box::new(result));
}
#[cfg(target_arch = "wasm32")]
#[doc(hidden)]
#[allow(clippy::all)]
#[link_section = "__fce_generated_section__inner_arrays_2"]
pub static __fce_generated_static_global_inner_arrays_2: [u8; 365usize] = {
* b"{\"ast_type\":\"Function\",\"signature\":{\"name\":\"inner_arrays_2\",\"arguments\":[{\"name\":\"arg\",\"ty\":{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Record\":[\"TestRecord\",\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]}}],\"output_type\":{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Vector\":[{\"Record\":[\"TestRecord\",\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]},\"ByValue\"]}}}"
};

View File

@ -0,0 +1,3 @@
pub fn inner_arrays_2(arg: Vec<Vec<Vec<Vec<TestRecord>>>>) -> Vec<Vec<Vec<Vec<TestRecord>>>> {
unimplemented!()
}

View File

@ -3,14 +3,41 @@ mod utils;
use utils::test_fce_token_streams; use utils::test_fce_token_streams;
#[test] #[test]
fn test() { fn exports_arrays() {
test_fce_token_streams( assert!(test_fce_token_streams(
"tests/generation_tests/export_functions/basic_types/fce.rs", "tests/generation_tests/exports/arrays/fce.rs",
"tests/generation_tests/export_functions/basic_types/expanded.rs", "tests/generation_tests/exports/arrays/expanded.rs",
); ));
}
test_fce_token_streams( #[test]
fn exports_basic_types() {
assert!(test_fce_token_streams(
"tests/generation_tests/exports/basic_types/fce.rs",
"tests/generation_tests/exports/basic_types/expanded.rs",
));
}
#[test]
fn exports_refs() {
assert!(test_fce_token_streams(
"tests/generation_tests/exports/refs/fce.rs",
"tests/generation_tests/exports/refs/expanded.rs",
));
}
#[test]
fn records_call_parameters() {
assert!(test_fce_token_streams(
"tests/generation_tests/records/call_parameters/fce.rs", "tests/generation_tests/records/call_parameters/fce.rs",
"tests/generation_tests/records/call_parameters/expanded.rs", "tests/generation_tests/records/call_parameters/expanded.rs",
); ));
}
#[test]
fn records_use_as_type() {
assert!(test_fce_token_streams(
"tests/generation_tests/records/use_as_type/fce.rs",
"tests/generation_tests/records/use_as_type/expanded.rs",
));
} }

View File

@ -21,7 +21,7 @@ use pretty_assertions::assert_eq;
use std::io::Read; use std::io::Read;
use std::path::Path; use std::path::Path;
pub fn test_fce_token_streams<FP, EP>(fce_path: FP, expanded_path: EP) pub fn test_fce_token_streams<FP, EP>(fce_path: FP, expanded_path: EP) -> bool
where where
FP: AsRef<Path>, FP: AsRef<Path>,
EP: AsRef<Path>, EP: AsRef<Path>,
@ -34,7 +34,9 @@ where
let expanded_item = items_from_file(expanded_path); let expanded_item = items_from_file(expanded_path);
let fce_item = to_syn_item(fce_token_streams); let fce_item = to_syn_item(fce_token_streams);
assert_eq!(fce_item, expanded_item); assert_eq!(expanded_item, fce_item);
fce_item == expanded_item
} }
fn stream_from_file<P>(path: P) -> proc_macro2::TokenStream fn stream_from_file<P>(path: P) -> proc_macro2::TokenStream

View File

@ -16,12 +16,12 @@
use fluence_sdk_macro::fce; use fluence_sdk_macro::fce;
use serde::Serialize; //use serde::Serialize;
use serde::Deserialize; //use serde::Deserialize;
/// Describes an origin that set an argument. /// Describes an origin that set an argument.
#[fce] #[fce]
#[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)] //#[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)]
pub struct SecurityTetraplet { pub struct SecurityTetraplet {
pub peer_pk: String, pub peer_pk: String,
pub service_id: String, pub service_id: String,
@ -31,7 +31,7 @@ pub struct SecurityTetraplet {
/// This struct contains parameters that would be accessible by Wasm modules. /// This struct contains parameters that would be accessible by Wasm modules.
#[fce] #[fce]
#[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)] //#[derive(Clone, PartialEq, Default, Eq, Debug, Serialize, Deserialize)]
pub struct CallParameters { pub struct CallParameters {
/// Peer id of the AIR script initiator. /// Peer id of the AIR script initiator.
pub init_peer_id: String, pub init_peer_id: String,

View File

@ -1,5 +1,5 @@
#[test] #[test]
fn test() { fn fce_compilation_tests() {
let tests = trybuild::TestCases::new(); let tests = trybuild::TestCases::new();
tests.compile_fail("tests/compilation_tests/export_functions/array_inner_refs.rs"); tests.compile_fail("tests/compilation_tests/export_functions/array_inner_refs.rs");
tests.pass("tests/compilation_tests/export_functions/arrays.rs"); tests.pass("tests/compilation_tests/export_functions/arrays.rs");