#[export_name="rust_print_hello_world"] pub extern fn say_hello() { println!("Hello, World!"); } #[repr(C)] pub struct SelfTypeTestStruct { times: u8, } impl SelfTypeTestStruct { #[export_name="SelfTypeTestStruct_should_exist_ref"] #[no_mangle] pub extern fn should_exist_ref(&self) { println!("should_exist_ref"); } #[export_name="SelfTypeTestStruct_should_exist_ref_mut"] #[no_mangle] pub extern fn should_exist_ref_mut(&mut self) { println!("should_exist_ref_mut"); } #[export_name="SelfTypeTestStruct_should_not_exist_box"] #[no_mangle] pub extern fn should_not_exist_box(self: Box) { println!("should_not_exist_box"); } #[export_name="SelfTypeTestStruct_should_not_exist_return_box"] #[no_mangle] pub extern fn should_not_exist_box() -> Box { println!("should_not_exist_box"); } #[export_name="SelfTypeTestStruct_should_exist_annotated_self"] #[no_mangle] pub extern fn should_exist_annotated_self(self: Self) { println!("should_exist_annotated_self"); } #[export_name="SelfTypeTestStruct_should_exist_annotated_mut_self"] #[no_mangle] #[allow(unused_mut)] pub extern fn should_exist_annotated_mut_self(mut self: Self) { println!("should_exist_annotated_mut_self"); } #[export_name="SelfTypeTestStruct_should_exist_annotated_by_name"] #[no_mangle] pub extern fn should_exist_annotated_by_name(self: SelfTypeTestStruct) { println!("should_exist_annotated_by_name"); } #[export_name="SelfTypeTestStruct_should_exist_annotated_mut_by_name"] #[no_mangle] #[allow(unused_mut)] pub extern fn should_exist_annotated_mut_by_name(mut self: SelfTypeTestStruct) { println!("should_exist_annotated_mut_by_name"); } #[export_name="SelfTypeTestStruct_should_exist_unannotated"] #[no_mangle] pub extern fn should_exist_unannotated(self) { println!("should_exist_unannotated"); } #[export_name="SelfTypeTestStruct_should_exist_mut_unannotated"] #[no_mangle] #[allow(unused_mut)] pub extern fn should_exist_mut_unannotated(mut self) { println!("should_exist_mut_unannotated"); } } #[no_mangle] #[allow(unused_variables)] pub extern fn free_function_should_exist_ref(test_struct: &SelfTypeTestStruct) { println!("free_function_should_exist_ref"); } #[no_mangle] #[allow(unused_variables)] pub extern fn free_function_should_exist_ref_mut(test_struct: &mut SelfTypeTestStruct) { println!("free_function_should_exist_ref_mut"); } #[no_mangle] pub extern fn unnamed_argument(_: &mut SelfTypeTestStruct) { println!("unnamed_argument"); } #[no_mangle] #[allow(unused_variables)] pub extern fn free_function_should_not_exist_box(boxed: Box) { println!("free_function_should_not_exist_box"); } #[no_mangle] #[allow(unused_variables)] pub extern fn free_function_should_exist_annotated_by_name(test_struct: SelfTypeTestStruct) { println!("free_function_should_exist_annotated_by_name"); } #[no_mangle] #[allow(unused_mut)] #[allow(unused_variables)] pub extern fn free_function_should_exist_annotated_mut_by_name(mut test_struct: SelfTypeTestStruct) { println!("free_function_should_exist_annotated_mut_by_name"); } struct Opaque { times: u8 } #[repr(C)] pub struct PointerToOpaque { ptr: *mut Opaque } impl PointerToOpaque { #[export_name="PointerToOpaque_create"] pub extern fn create(times: u8) -> PointerToOpaque { PointerToOpaque { ptr: Box::into_raw(Box::new(Opaque { times })) } } #[export_name="PointerToOpaque_sayHello"] pub extern fn say_hello(self: PointerToOpaque) { if let Some(nonnull) = std::ptr::NonNull::new(self.ptr) { for _ in 0 .. unsafe { nonnull.as_ref().times } { println!("Hello!") } } } }