You've already forked example-native-api-rs
mirror of
https://github.com/medigor/example-native-api-rs.git
synced 2025-07-03 00:58:13 +02:00
use smallvec instead MaybeUninit
This commit is contained in:
@ -15,3 +15,4 @@ strip = true # Automatically strip symbols from the binary.
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
utf16_lit="2.0"
|
utf16_lit="2.0"
|
||||||
|
smallvec = "1.11"
|
||||||
|
31
src/ffi.rs
31
src/ffi.rs
@ -1,11 +1,10 @@
|
|||||||
use std::{
|
use std::{
|
||||||
ffi::{c_int, c_long, c_ulong, c_void},
|
ffi::{c_int, c_long, c_ulong, c_void},
|
||||||
mem::MaybeUninit,
|
|
||||||
ptr::{self, NonNull},
|
ptr::{self, NonNull},
|
||||||
slice::{from_raw_parts, from_raw_parts_mut},
|
slice::{from_raw_parts, from_raw_parts_mut},
|
||||||
};
|
};
|
||||||
|
|
||||||
const MAX_PARAMS: usize = 8;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -481,9 +480,7 @@ unsafe extern "system" fn get_method_name<T: Addin>(
|
|||||||
|
|
||||||
unsafe extern "system" fn get_n_params<T: Addin>(this: &mut This<1, T>, num: c_long) -> c_long {
|
unsafe extern "system" fn get_n_params<T: Addin>(this: &mut This<1, T>, num: c_long) -> c_long {
|
||||||
let component = this.get_component();
|
let component = this.get_component();
|
||||||
let count = component.addin.get_n_params(num as usize);
|
component.addin.get_n_params(num as usize) as _
|
||||||
assert!(count <= MAX_PARAMS, "too many parameters");
|
|
||||||
count as _
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe extern "system" fn get_param_def_value<T: Addin>(
|
unsafe extern "system" fn get_param_def_value<T: Addin>(
|
||||||
@ -522,18 +519,14 @@ unsafe extern "system" fn call_as_proc<T: Addin>(
|
|||||||
|
|
||||||
let size_array = size_array as usize;
|
let size_array = size_array as usize;
|
||||||
|
|
||||||
let mut param_values: [MaybeUninit<Variant>; MAX_PARAMS] = MaybeUninit::uninit().assume_init();
|
let mut param_values = SmallVec::<[Variant; 8]>::new();
|
||||||
for (x1, x2) in from_raw_parts_mut(params, size_array)
|
for variant in from_raw_parts_mut(params, size_array) {
|
||||||
.iter_mut()
|
param_values.push(Variant { mem, variant });
|
||||||
.zip(param_values.iter_mut())
|
|
||||||
{
|
|
||||||
x2.write(Variant { mem, variant: x1 });
|
|
||||||
}
|
}
|
||||||
let param_values = std::mem::transmute(&mut param_values[..size_array]);
|
|
||||||
|
|
||||||
component
|
component
|
||||||
.addin
|
.addin
|
||||||
.call_as_proc(method_num as usize, param_values)
|
.call_as_proc(method_num as usize, &mut param_values)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe extern "system" fn call_as_func<T: Addin>(
|
unsafe extern "system" fn call_as_func<T: Addin>(
|
||||||
@ -555,18 +548,14 @@ unsafe extern "system" fn call_as_func<T: Addin>(
|
|||||||
variant: ret_value,
|
variant: ret_value,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut param_values: [MaybeUninit<Variant>; MAX_PARAMS] = MaybeUninit::uninit().assume_init();
|
let mut param_values = SmallVec::<[Variant; 8]>::new();
|
||||||
for (x1, x2) in from_raw_parts_mut(params, size_array)
|
for variant in from_raw_parts_mut(params, size_array) {
|
||||||
.iter_mut()
|
param_values.push(Variant { mem, variant });
|
||||||
.zip(param_values.iter_mut())
|
|
||||||
{
|
|
||||||
x2.write(Variant { mem, variant: x1 });
|
|
||||||
}
|
}
|
||||||
let param_values = std::mem::transmute(&mut param_values[..size_array]);
|
|
||||||
|
|
||||||
component
|
component
|
||||||
.addin
|
.addin
|
||||||
.call_as_func(method_num as usize, param_values, &mut return_value)
|
.call_as_func(method_num as usize, &mut param_values, &mut return_value)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
Reference in New Issue
Block a user