mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-08 13:48:26 +00:00
Merge branch 'master' into feature/multi-example-wasm-c-api
This commit is contained in:
@@ -3,8 +3,31 @@
|
||||
macro_rules! wasm_declare_vec_inner {
|
||||
($name:ident) => {
|
||||
paste::paste! {
|
||||
/// Creates an empty vector of
|
||||
#[doc = "Creates an empty vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Creates an empty vector of [`wasm_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
```rust
|
||||
# use inline_c::assert_c;
|
||||
# fn main() {
|
||||
# (assert_c! {
|
||||
# #include \"tests/wasmer_wasm.h\"
|
||||
#
|
||||
int main() {
|
||||
// Creates an empty vector of `wasm_" $name "_t`.
|
||||
wasm_" $name "_vec_t vector;
|
||||
wasm_" $name "_vec_new_empty(&vector);
|
||||
|
||||
// Check that it is empty.
|
||||
assert(vector.size == 0);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
}
|
||||
# })
|
||||
# .success();
|
||||
# }
|
||||
```"]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_new_empty>](out: *mut [<wasm_ $name _vec_t>]) {
|
||||
// TODO: actually implement this
|
||||
@@ -19,7 +42,37 @@ macro_rules! wasm_declare_vec_inner {
|
||||
macro_rules! wasm_declare_vec {
|
||||
($name:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Represents of a vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Represents a vector of `wasm_" $name "_t`.
|
||||
|
||||
Read the documentation of [`wasm_" $name "_t`] to see more concrete examples.
|
||||
|
||||
# Example
|
||||
|
||||
```rust
|
||||
# use inline_c::assert_c;
|
||||
# fn main() {
|
||||
# (assert_c! {
|
||||
# #include \"tests/wasmer_wasm.h\"
|
||||
#
|
||||
int main() {
|
||||
// Create a vector of 2 `wasm_" $name "_t`.
|
||||
wasm_" $name "_t x;
|
||||
wasm_" $name "_t y;
|
||||
wasm_" $name "_t* items[2] = {&x, &y};
|
||||
|
||||
wasm_" $name "_vec_t vector;
|
||||
wasm_" $name "_vec_new(&vector, 2, (wasm_" $name "_t*) items);
|
||||
|
||||
// Check that it contains 2 items.
|
||||
assert(vector.size == 2);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
}
|
||||
# })
|
||||
# .success();
|
||||
# }
|
||||
```"]
|
||||
#[derive(Debug)]
|
||||
#[repr(C)]
|
||||
pub struct [<wasm_ $name _vec_t>] {
|
||||
@@ -81,6 +134,7 @@ macro_rules! wasm_declare_vec {
|
||||
.into_boxed_slice();
|
||||
let data = copied_data.as_mut_ptr();
|
||||
::std::mem::forget(copied_data);
|
||||
|
||||
Self {
|
||||
size,
|
||||
data,
|
||||
@@ -111,27 +165,60 @@ macro_rules! wasm_declare_vec {
|
||||
}
|
||||
|
||||
// TODO: investigate possible memory leak on `init` (owned pointer)
|
||||
#[doc = "Creates a new vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Creates a new vector of [`wasm_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_new>](out: *mut [<wasm_ $name _vec_t>], length: usize, init: *mut [<wasm_ $name _t>]) {
|
||||
let mut bytes: Vec<[<wasm_ $name _t>]> = Vec::with_capacity(length);
|
||||
|
||||
for i in 0..length {
|
||||
bytes.push(::std::ptr::read(init.add(i)));
|
||||
}
|
||||
|
||||
let pointer = bytes.as_mut_ptr();
|
||||
debug_assert!(bytes.len() == bytes.capacity());
|
||||
|
||||
(*out).data = pointer;
|
||||
(*out).size = length;
|
||||
::std::mem::forget(bytes);
|
||||
}
|
||||
|
||||
#[doc = "Creates a new uninitialized vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Creates a new uninitialized vector of [`wasm_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
```rust
|
||||
# use inline_c::assert_c;
|
||||
# fn main() {
|
||||
# (assert_c! {
|
||||
# #include \"tests/wasmer_wasm.h\"
|
||||
#
|
||||
int main() {
|
||||
// Creates an empty vector of `wasm_" $name "_t`.
|
||||
wasm_" $name "_vec_t vector;
|
||||
wasm_" $name "_vec_new_uninitialized(&vector, 3);
|
||||
|
||||
// Check that it contains 3 items.
|
||||
assert(vector.size == 3);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
}
|
||||
# })
|
||||
# .success();
|
||||
# }
|
||||
```"]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_new_uninitialized>](out: *mut [<wasm_ $name _vec_t>], length: usize) {
|
||||
let mut bytes: Vec<[<wasm_ $name _t>]> = Vec::with_capacity(length);
|
||||
let pointer = bytes.as_mut_ptr();
|
||||
|
||||
(*out).data = pointer;
|
||||
(*out).size = length;
|
||||
|
||||
::std::mem::forget(bytes);
|
||||
}
|
||||
|
||||
@@ -144,7 +231,11 @@ macro_rules! wasm_declare_vec {
|
||||
*out_ptr = in_ptr.clone();
|
||||
}
|
||||
|
||||
#[doc = "Deletes a vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Deletes a vector of [`wasm_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_delete>](ptr: Option<&mut [<wasm_ $name _vec_t>]>) {
|
||||
if let Some(vec) = ptr {
|
||||
@@ -166,7 +257,9 @@ macro_rules! wasm_declare_vec {
|
||||
macro_rules! wasm_declare_boxed_vec {
|
||||
($name:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Represents of a vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Represents a vector of `wasm_" $name "_t`.
|
||||
|
||||
Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
#[derive(Debug)]
|
||||
#[repr(C)]
|
||||
pub struct [<wasm_ $name _vec_t>] {
|
||||
@@ -217,6 +310,27 @@ macro_rules! wasm_declare_boxed_vec {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: Into<[<wasm_ $name _t>]> + Clone> From<&'a [T]> for [<wasm_ $name _vec_t>] {
|
||||
fn from(other: &'a [T]) -> Self {
|
||||
let size = other.len();
|
||||
let mut copied_data = other
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(Into::into)
|
||||
.map(Box::new)
|
||||
.map(Box::into_raw)
|
||||
.collect::<Vec<*mut [<wasm_ $name _t>]>>()
|
||||
.into_boxed_slice();
|
||||
let data = copied_data.as_mut_ptr();
|
||||
::std::mem::forget(copied_data);
|
||||
|
||||
Self {
|
||||
size,
|
||||
data,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: do this properly
|
||||
impl [<wasm_ $name _vec_t>] {
|
||||
pub unsafe fn into_slice(&self) -> Option<&[Box<[<wasm_ $name _t>]>]>{
|
||||
@@ -235,23 +349,53 @@ macro_rules! wasm_declare_boxed_vec {
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_new>](out: *mut [<wasm_ $name _vec_t>], length: usize, init: *const *mut [<wasm_ $name _t>]) {
|
||||
let mut bytes: Vec<*mut [<wasm_ $name _t>]> = Vec::with_capacity(length);
|
||||
|
||||
for i in 0..length {
|
||||
bytes.push(*init.add(i));
|
||||
}
|
||||
|
||||
let mut boxed_vec = bytes.into_boxed_slice();
|
||||
let pointer = boxed_vec.as_mut_ptr();
|
||||
|
||||
(*out).data = pointer;
|
||||
(*out).size = length;
|
||||
|
||||
::std::mem::forget(boxed_vec);
|
||||
}
|
||||
|
||||
#[doc = "Creates a new uninitialized vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Creates a new uninitialized vector of [`wasm_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
```rust
|
||||
# use inline_c::assert_c;
|
||||
# fn main() {
|
||||
# (assert_c! {
|
||||
# #include \"tests/wasmer_wasm.h\"
|
||||
#
|
||||
int main() {
|
||||
// Creates an empty vector of `wasm_" $name "_t`.
|
||||
wasm_" $name "_vec_t vector;
|
||||
wasm_" $name "_vec_new_uninitialized(&vector, 3);
|
||||
|
||||
// Check that it contains 3 items.
|
||||
assert(vector.size == 3);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
}
|
||||
# })
|
||||
# .success();
|
||||
# }
|
||||
```"]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_new_uninitialized>](out: *mut [<wasm_ $name _vec_t>], length: usize) {
|
||||
let mut bytes: Vec<*mut [<wasm_ $name _t>]> = Vec::with_capacity(length);
|
||||
let mut bytes: Vec<*mut [<wasm_ $name _t>]> = vec![::std::ptr::null_mut(); length];
|
||||
let pointer = bytes.as_mut_ptr();
|
||||
|
||||
(*out).data = pointer;
|
||||
(*out).size = length;
|
||||
|
||||
::std::mem::forget(bytes);
|
||||
}
|
||||
|
||||
@@ -264,11 +408,14 @@ macro_rules! wasm_declare_boxed_vec {
|
||||
*out_ptr = in_ptr.clone();
|
||||
}
|
||||
|
||||
#[doc = "Deletes a vector of [`wasm_" $name "_t`].
|
||||
|
||||
#[doc = "Deletes a vector of [`wasm_" $name "_t`]."]
|
||||
# Example
|
||||
|
||||
See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_delete>](ptr: Option<&mut[<wasm_ $name _vec_t>]>) {
|
||||
if let Some(vec) = ptr {
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_delete>](ptr: Option<&mut [<wasm_ $name _vec_t>]>) {
|
||||
if let Some(vec) = ptr {
|
||||
if !vec.data.is_null() {
|
||||
let ptr: *mut Option<Box<[<wasm_ $name _t>]>> = vec.data as _;
|
||||
let data: Vec<Option<Box<[<wasm_ $name _t>]>>> = Vec::from_raw_parts(ptr, vec.size, vec.size);
|
||||
@@ -298,7 +445,6 @@ macro_rules! wasm_declare_ref_base {
|
||||
}
|
||||
|
||||
// TODO: finish this...
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user