diff --git a/crates/wit/src/parsed_type/fn_epilog.rs b/crates/wit/src/parsed_type/fn_epilog.rs index aa498e4..e40e4b7 100644 --- a/crates/wit/src/parsed_type/fn_epilog.rs +++ b/crates/wit/src/parsed_type/fn_epilog.rs @@ -98,10 +98,10 @@ fn generate_epilog(ty: &Option) -> proc_macro2::TokenStream { return result as _; }, Some(ParsedType::Record(record_name)) => { - let serializer = + let record_serializer = crate::new_ident!(GENERATED_RECORD_SERIALIZER_PREFIX.to_string() + record_name); quote! { - let result_ptr = #serializer(result); + let result_ptr = crate::#record_serializer(result); fluence::internal::set_result_ptr(result_ptr as _); } } diff --git a/crates/wit/src/parsed_type/fn_prolog.rs b/crates/wit/src/parsed_type/fn_prolog.rs index 36d2b85..e6b6537 100644 --- a/crates/wit/src/parsed_type/fn_prolog.rs +++ b/crates/wit/src/parsed_type/fn_prolog.rs @@ -106,11 +106,11 @@ fn generate_type_prolog( let #generated_arg_id = Vec::from_raw_parts(#ptr as _, #size as _, #size as _); }, ParsedType::Record(record_name) => { - let deserializer = crate::new_ident!( + let record_deserializer = crate::new_ident!( GENERATED_RECORD_DESERIALIZER_PREFIX.to_string() + record_name ); quote! { - let #generated_arg_id = #deserializer(#ptr); + let #generated_arg_id = crate::#record_deserializer(#ptr); } } _ => panic!( diff --git a/crates/wit/src/parsed_type/foreign_mod_arg.rs b/crates/wit/src/parsed_type/foreign_mod_arg.rs index 27fc881..bd743b1 100644 --- a/crates/wit/src/parsed_type/foreign_mod_arg.rs +++ b/crates/wit/src/parsed_type/foreign_mod_arg.rs @@ -32,12 +32,12 @@ impl ForeignModArgGlueCodeGenerator for ParsedType { quote! { #arg.as_ptr() as _, #arg.len() as _ } } ParsedType::Record(record_name) => { - let serializer = crate::new_ident!( + let record_serializer = crate::new_ident!( crate::token_stream_generator::GENERATED_RECORD_SERIALIZER_PREFIX.to_string() + record_name ); quote! { - #serializer(#arg) + crate::#record_serializer(#arg) } } _ => quote! { arg }, diff --git a/crates/wit/src/parsed_type/foreign_mod_epilog.rs b/crates/wit/src/parsed_type/foreign_mod_epilog.rs index b523f49..da73fd9 100644 --- a/crates/wit/src/parsed_type/foreign_mod_epilog.rs +++ b/crates/wit/src/parsed_type/foreign_mod_epilog.rs @@ -64,7 +64,7 @@ impl ForeignModEpilogGlueCodeGenerator for Option { + record_name ); quote! { - #record_deserializer(fluence::internal::get_result_ptr() as _) + crate::#record_deserializer(fluence::internal::get_result_ptr() as _) } } _ => panic!( diff --git a/crates/wit/src/token_stream_generator/record_generator.rs b/crates/wit/src/token_stream_generator/record_generator.rs index 4f6e953..d2f8435 100644 --- a/crates/wit/src/token_stream_generator/record_generator.rs +++ b/crates/wit/src/token_stream_generator/record_generator.rs @@ -76,7 +76,7 @@ fn generate_serializer_fn(record: &fce_ast_types::AstRecordItem) -> proc_macro2: } = record.generate_serializer(&record.name); quote::quote! { - pub(crate) fn #serializer_fn_name(record: #record_type) -> i32 { + pub(in crate) fn #serializer_fn_name(record: #record_type) -> i32 { let mut raw_record = Vec::new(); #serializer @@ -103,11 +103,13 @@ fn generate_deserializer_fn(record: &fce_ast_types::AstRecordItem) -> proc_macro crate::utils::get_record_size(record.fields.iter().map(|ast_field| &ast_field.ty)); quote::quote! { - unsafe fn #deserializer_fn_name(offset: i32) -> #return_type { + pub(in crate) unsafe fn #deserializer_fn_name(offset: i32) -> #return_type { let raw_record: Vec = Vec::from_raw_parts(offset as _, #record_size, #record_size); #deserializer + std::mem::forget(raw_record); + #type_constructor } } diff --git a/crates/wit/src/token_stream_generator/record_generator/record_deserializer.rs b/crates/wit/src/token_stream_generator/record_generator/record_deserializer.rs index 011a909..977e3e1 100644 --- a/crates/wit/src/token_stream_generator/record_generator/record_deserializer.rs +++ b/crates/wit/src/token_stream_generator/record_generator/record_deserializer.rs @@ -122,7 +122,7 @@ impl RecordDeserializerGlueCodeGenerator for fce_ast_types::AstRecordItem { new_ident!(GENERATED_RECORD_DESERIALIZER_PREFIX.to_string() + record_name); quote! { - let #field = #record_deserializer(raw_record[#ptr_id] as _); + let #field = crate::#record_deserializer(raw_record[#ptr_id] as _); } } }; diff --git a/crates/wit/src/token_stream_generator/record_generator/record_serializer.rs b/crates/wit/src/token_stream_generator/record_generator/record_serializer.rs index c303580..a65f172 100644 --- a/crates/wit/src/token_stream_generator/record_generator/record_serializer.rs +++ b/crates/wit/src/token_stream_generator/record_generator/record_serializer.rs @@ -47,13 +47,14 @@ impl RecordSerializerGlueCodeGenerator for fce_ast_types::AstRecordItem { quote! { raw_record.push(#field_ident.as_ptr() as _); raw_record.push(#field_ident.len() as _); + std::mem::forget(#field_ident); } } ParsedType::Record(record_name) => { let record_serializer = new_ident!(GENERATED_RECORD_SERIALIZER_PREFIX.to_string() + &record_name); quote! { - raw_record.push(#record_serializer(#field_ident) as _); + raw_record.push(crate::#record_serializer(#field_ident) as _); } } _ => quote! {