134 lines
3.7 KiB
Rust
134 lines
3.7 KiB
Rust
#[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<SelfTypeTestStruct>) {
|
|
println!("should_not_exist_box");
|
|
}
|
|
|
|
#[export_name="SelfTypeTestStruct_should_not_exist_return_box"]
|
|
#[no_mangle]
|
|
pub extern fn should_not_exist_box() -> Box<Self> {
|
|
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<SelfTypeTestStruct>) {
|
|
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!")
|
|
}
|
|
}
|
|
}
|
|
}
|