mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-08 13:48:26 +00:00
chore(c-api) Formalize API prefixes.
The new rule is the following: * `wasm_` for the standard C API, * `wasmer_` or `wasi_` for the Wasmer non-standard C API. For all symbols inside the `unstable` module, the renaming `wasm_` to `wasmer_` is done without deprecations. It was clear that those API were unstable. For all the other symbols, symbols have been renamed to `wasmer_` but the old symbols have been kept with deprecation warnings. Special note: The `wasm_named_extern_t` type (and associated functions) was in `wasi` by mistake. Its place was in the `unstable` module. This patch also fixes that. The `wasm_declare_vec_*` macros have been updated to support a default prefix, or a user-defined prefix. It's now possible to write `wasm_declare_boxed_vec!(foo);` to get all the API prefixed by `wasm_` (as previously), or `wasm_declare_boxed_vec!(foo, wasmer);` to prefix with `wasmer_`. A user not using symbols from the `unstable` module will continue to get working code, modulo some deprecations, after this patch.
This commit is contained in:
@@ -2,8 +2,12 @@
|
||||
#[macro_export]
|
||||
macro_rules! wasm_declare_vec_inner {
|
||||
($name:ident) => {
|
||||
wasm_declare_vec_inner!($name, wasm);
|
||||
};
|
||||
|
||||
($name:ident, $prefix:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Creates an empty vector of [`wasm_" $name "_t`].
|
||||
#[doc = "Creates an empty vector of [`" $prefix "_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
@@ -14,24 +18,24 @@ macro_rules! wasm_declare_vec_inner {
|
||||
# #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);
|
||||
// Creates an empty vector of `" $prefix "_" $name "_t`.
|
||||
" $prefix "_" $name "_vec_t vector;
|
||||
" $prefix "_" $name "_vec_new_empty(&vector);
|
||||
|
||||
// Check that it is empty.
|
||||
assert(vector.size == 0);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
" $prefix "_" $name "_vec_delete(&vector);
|
||||
}
|
||||
# })
|
||||
# .success();
|
||||
# }
|
||||
```"]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_new_empty>](out: *mut [<wasm_ $name _vec_t>]) {
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_new_empty>](out: *mut [<$prefix _ $name _vec_t>]) {
|
||||
// TODO: actually implement this
|
||||
[<wasm_ $name _vec_new_uninitialized>](out, 0);
|
||||
[<$prefix _ $name _vec_new_uninitialized>](out, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -41,10 +45,14 @@ int main() {
|
||||
#[macro_export]
|
||||
macro_rules! wasm_declare_vec {
|
||||
($name:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Represents a vector of `wasm_" $name "_t`.
|
||||
wasm_declare_vec!($name, wasm);
|
||||
};
|
||||
|
||||
Read the documentation of [`wasm_" $name "_t`] to see more concrete examples.
|
||||
($name:ident, $prefix:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Represents a vector of `" $prefix "_" $name "_t`.
|
||||
|
||||
Read the documentation of [`" $prefix "_" $name "_t`] to see more concrete examples.
|
||||
|
||||
# Example
|
||||
|
||||
@@ -55,19 +63,19 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples.
|
||||
# #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};
|
||||
// Create a vector of 2 `" $prefix "_" $name "_t`.
|
||||
" $prefix "_" $name "_t x;
|
||||
" $prefix "_" $name "_t y;
|
||||
" $prefix "_" $name "_t* items[2] = {&x, &y};
|
||||
|
||||
wasm_" $name "_vec_t vector;
|
||||
wasm_" $name "_vec_new(&vector, 2, (wasm_" $name "_t*) items);
|
||||
" $prefix "_" $name "_vec_t vector;
|
||||
" $prefix "_" $name "_vec_new(&vector, 2, (" $prefix "_" $name "_t*) items);
|
||||
|
||||
// Check that it contains 2 items.
|
||||
assert(vector.size == 2);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
" $prefix "_" $name "_vec_delete(&vector);
|
||||
}
|
||||
# })
|
||||
# .success();
|
||||
@@ -75,12 +83,12 @@ int main() {
|
||||
```"]
|
||||
#[derive(Debug)]
|
||||
#[repr(C)]
|
||||
pub struct [<wasm_ $name _vec_t>] {
|
||||
pub struct [<$prefix _ $name _vec_t>] {
|
||||
pub size: usize,
|
||||
pub data: *mut [<wasm_ $name _t>],
|
||||
pub data: *mut [<$prefix _ $name _t>],
|
||||
}
|
||||
|
||||
impl Clone for [<wasm_ $name _vec_t>] {
|
||||
impl Clone for [<$prefix _ $name _vec_t>] {
|
||||
fn clone(&self) -> Self {
|
||||
if self.data.is_null() {
|
||||
return Self {
|
||||
@@ -107,8 +115,8 @@ int main() {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> From<Vec<[<wasm_ $name _t>]>> for [<wasm_ $name _vec_t>] {
|
||||
fn from(mut vec: Vec<[<wasm_ $name _t>]>) -> Self {
|
||||
impl<'a> From<Vec<[<$prefix _ $name _t>]>> for [<$prefix _ $name _vec_t>] {
|
||||
fn from(mut vec: Vec<[<$prefix _ $name _t>]>) -> Self {
|
||||
vec.shrink_to_fit();
|
||||
|
||||
let length = vec.len();
|
||||
@@ -123,14 +131,14 @@ int main() {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: Into<[<wasm_ $name _t>]> + Clone> From<&'a [T]> for [<wasm_ $name _vec_t>] {
|
||||
impl<'a, T: Into<[<$prefix _ $name _t>]> + Clone> From<&'a [T]> for [<$prefix _ $name _vec_t>] {
|
||||
fn from(other: &'a [T]) -> Self {
|
||||
let size = other.len();
|
||||
let mut copied_data = other
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(Into::into)
|
||||
.collect::<Vec<[<wasm_ $name _t>]>>()
|
||||
.collect::<Vec<[<$prefix _ $name _t>]>>()
|
||||
.into_boxed_slice();
|
||||
let data = copied_data.as_mut_ptr();
|
||||
::std::mem::forget(copied_data);
|
||||
@@ -142,8 +150,8 @@ int main() {
|
||||
}
|
||||
}
|
||||
|
||||
impl [<wasm_ $name _vec_t>] {
|
||||
pub unsafe fn into_slice(&self) -> Option<&[[<wasm_ $name _t>]]>{
|
||||
impl [<$prefix _ $name _vec_t>] {
|
||||
pub unsafe fn into_slice(&self) -> Option<&[[<$prefix _ $name _t>]]>{
|
||||
if self.is_uninitialized() {
|
||||
return None;
|
||||
}
|
||||
@@ -151,7 +159,7 @@ int main() {
|
||||
Some(::std::slice::from_raw_parts(self.data, self.size))
|
||||
}
|
||||
|
||||
pub unsafe fn into_slice_mut(&mut self) -> Option<&mut [[<wasm_ $name _t>]]>{
|
||||
pub unsafe fn into_slice_mut(&mut self) -> Option<&mut [[<$prefix _ $name _t>]]>{
|
||||
if self.is_uninitialized() {
|
||||
return None;
|
||||
}
|
||||
@@ -165,14 +173,14 @@ int main() {
|
||||
}
|
||||
|
||||
// TODO: investigate possible memory leak on `init` (owned pointer)
|
||||
#[doc = "Creates a new vector of [`wasm_" $name "_t`].
|
||||
#[doc = "Creates a new vector of [`" $prefix "_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
See the [`" $prefix "_" $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);
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_new>](out: *mut [<$prefix _ $name _vec_t>], length: usize, init: *mut [<$prefix _ $name _t>]) {
|
||||
let mut bytes: Vec<[<$prefix _ $name _t>]> = Vec::with_capacity(length);
|
||||
|
||||
for i in 0..length {
|
||||
bytes.push(::std::ptr::read(init.add(i)));
|
||||
@@ -186,7 +194,7 @@ See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
::std::mem::forget(bytes);
|
||||
}
|
||||
|
||||
#[doc = "Creates a new uninitialized vector of [`wasm_" $name "_t`].
|
||||
#[doc = "Creates a new uninitialized vector of [`" $prefix "_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
@@ -197,23 +205,23 @@ See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
# #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);
|
||||
// Creates an empty vector of `" $prefix "_" $name "_t`.
|
||||
" $prefix "_" $name "_vec_t vector;
|
||||
" $prefix "_" $name "_vec_new_uninitialized(&vector, 3);
|
||||
|
||||
// Check that it contains 3 items.
|
||||
assert(vector.size == 3);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
" $prefix "_" $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);
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_new_uninitialized>](out: *mut [<$prefix _ $name _vec_t>], length: usize) {
|
||||
let mut bytes: Vec<[<$prefix _ $name _t>]> = Vec::with_capacity(length);
|
||||
let pointer = bytes.as_mut_ptr();
|
||||
|
||||
(*out).data = pointer;
|
||||
@@ -222,22 +230,22 @@ int main() {
|
||||
::std::mem::forget(bytes);
|
||||
}
|
||||
|
||||
#[doc = "Performs a deep copy of a vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Performs a deep copy of a vector of [`" $prefix "_" $name "_t`]."]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_copy>](
|
||||
out_ptr: &mut [<wasm_ $name _vec_t>],
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_copy>](
|
||||
out_ptr: &mut [<$prefix _ $name _vec_t>],
|
||||
in_ptr: & [<wasm _$name _vec_t>])
|
||||
{
|
||||
*out_ptr = in_ptr.clone();
|
||||
}
|
||||
|
||||
#[doc = "Deletes a vector of [`wasm_" $name "_t`].
|
||||
#[doc = "Deletes a vector of [`" $prefix "_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
See the [`" $prefix "_" $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>]>) {
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_delete>](ptr: Option<&mut [<$prefix _ $name _vec_t>]>) {
|
||||
if let Some(vec) = ptr {
|
||||
if !vec.data.is_null() {
|
||||
Vec::from_raw_parts(vec.data, vec.size, vec.size);
|
||||
@@ -248,7 +256,7 @@ See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
}
|
||||
}
|
||||
|
||||
wasm_declare_vec_inner!($name);
|
||||
wasm_declare_vec_inner!($name, $prefix);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -256,18 +264,22 @@ See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
#[macro_export]
|
||||
macro_rules! wasm_declare_boxed_vec {
|
||||
($name:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Represents a vector of `wasm_" $name "_t`.
|
||||
wasm_declare_boxed_vec!($name, wasm);
|
||||
};
|
||||
|
||||
Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
($name:ident, $prefix:ident) => {
|
||||
paste::paste! {
|
||||
#[doc = "Represents a vector of `" $prefix "_" $name "_t`.
|
||||
|
||||
Read the documentation of [`" $prefix "_" $name "_t`] to see more concrete examples."]
|
||||
#[derive(Debug)]
|
||||
#[repr(C)]
|
||||
pub struct [<wasm_ $name _vec_t>] {
|
||||
pub struct [<$prefix _ $name _vec_t>] {
|
||||
pub size: usize,
|
||||
pub data: *mut *mut [<wasm_ $name _t>],
|
||||
pub data: *mut *mut [<$prefix _ $name _t>],
|
||||
}
|
||||
|
||||
impl Clone for [<wasm_ $name _vec_t>] {
|
||||
impl Clone for [<$prefix _ $name _vec_t>] {
|
||||
fn clone(&self) -> Self {
|
||||
if self.data.is_null() {
|
||||
return Self {
|
||||
@@ -277,10 +289,10 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
}
|
||||
let data =
|
||||
unsafe {
|
||||
let data: *mut Option<Box<[<wasm_ $name _t>]>> = self.data as _;
|
||||
let data: *mut Option<Box<[<$prefix _ $name _t>]>> = self.data as _;
|
||||
let vec = Vec::from_raw_parts(data, self.size, self.size);
|
||||
let mut vec_copy = vec.clone().into_boxed_slice();
|
||||
let new_ptr = vec_copy.as_mut_ptr() as *mut *mut [<wasm_ $name _t>];
|
||||
let new_ptr = vec_copy.as_mut_ptr() as *mut *mut [<$prefix _ $name _t>];
|
||||
|
||||
::std::mem::forget(vec);
|
||||
::std::mem::forget(vec_copy);
|
||||
@@ -295,10 +307,10 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> From<Vec<Box<[<wasm_ $name _t>]>>> for [<wasm_ $name _vec_t>] {
|
||||
fn from(other: Vec<Box<[<wasm_ $name _t>]>>) -> Self {
|
||||
let boxed_slice: Box<[Box<[<wasm_ $name _t>]>]> = other.into_boxed_slice();
|
||||
let mut boxed_slice: Box<[*mut [<wasm_ $name _t>]]> = unsafe { ::std::mem::transmute(boxed_slice) };
|
||||
impl<'a> From<Vec<Box<[<$prefix _ $name _t>]>>> for [<$prefix _ $name _vec_t>] {
|
||||
fn from(other: Vec<Box<[<$prefix _ $name _t>]>>) -> Self {
|
||||
let boxed_slice: Box<[Box<[<$prefix _ $name _t>]>]> = other.into_boxed_slice();
|
||||
let mut boxed_slice: Box<[*mut [<$prefix _ $name _t>]]> = unsafe { ::std::mem::transmute(boxed_slice) };
|
||||
let size = boxed_slice.len();
|
||||
let data = boxed_slice.as_mut_ptr();
|
||||
|
||||
@@ -310,7 +322,7 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: Into<[<wasm_ $name _t>]> + Clone> From<&'a [T]> for [<wasm_ $name _vec_t>] {
|
||||
impl<'a, T: Into<[<$prefix _ $name _t>]> + Clone> From<&'a [T]> for [<$prefix _ $name _vec_t>] {
|
||||
fn from(other: &'a [T]) -> Self {
|
||||
let size = other.len();
|
||||
let mut copied_data = other
|
||||
@@ -319,7 +331,7 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
.map(Into::into)
|
||||
.map(Box::new)
|
||||
.map(Box::into_raw)
|
||||
.collect::<Vec<*mut [<wasm_ $name _t>]>>()
|
||||
.collect::<Vec<*mut [<$prefix _ $name _t>]>>()
|
||||
.into_boxed_slice();
|
||||
let data = copied_data.as_mut_ptr();
|
||||
::std::mem::forget(copied_data);
|
||||
@@ -332,23 +344,23 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
}
|
||||
|
||||
// TODO: do this properly
|
||||
impl [<wasm_ $name _vec_t>] {
|
||||
pub unsafe fn into_slice(&self) -> Option<&[Box<[<wasm_ $name _t>]>]>{
|
||||
impl [<$prefix _ $name _vec_t>] {
|
||||
pub unsafe fn into_slice(&self) -> Option<&[Box<[<$prefix _ $name _t>]>]>{
|
||||
if self.data.is_null() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let slice: &[*mut [<wasm_ $name _t>]] = ::std::slice::from_raw_parts(self.data, self.size);
|
||||
let slice: &[Box<[<wasm_ $name _t>]>] = ::std::mem::transmute(slice);
|
||||
let slice: &[*mut [<$prefix _ $name _t>]] = ::std::slice::from_raw_parts(self.data, self.size);
|
||||
let slice: &[Box<[<$prefix _ $name _t>]>] = ::std::mem::transmute(slice);
|
||||
Some(slice)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: investigate possible memory leak on `init` (owned pointer)
|
||||
#[doc = "Creates a new vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Creates a new vector of [`" $prefix "_" $name "_t`]."]
|
||||
#[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);
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_new>](out: *mut [<$prefix _ $name _vec_t>], length: usize, init: *const *mut [<$prefix _ $name _t>]) {
|
||||
let mut bytes: Vec<*mut [<$prefix _ $name _t>]> = Vec::with_capacity(length);
|
||||
|
||||
for i in 0..length {
|
||||
bytes.push(*init.add(i));
|
||||
@@ -363,7 +375,7 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
::std::mem::forget(boxed_vec);
|
||||
}
|
||||
|
||||
#[doc = "Creates a new uninitialized vector of [`wasm_" $name "_t`].
|
||||
#[doc = "Creates a new uninitialized vector of [`" $prefix "_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
@@ -374,23 +386,23 @@ Read the documentation of [`wasm_" $name "_t`] to see more concrete examples."]
|
||||
# #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);
|
||||
// Creates an empty vector of `" $prefix "_" $name "_t`.
|
||||
" $prefix "_" $name "_vec_t vector;
|
||||
" $prefix "_" $name "_vec_new_uninitialized(&vector, 3);
|
||||
|
||||
// Check that it contains 3 items.
|
||||
assert(vector.size == 3);
|
||||
|
||||
// Free it.
|
||||
wasm_" $name "_vec_delete(&vector);
|
||||
" $prefix "_" $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![::std::ptr::null_mut(); length];
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_new_uninitialized>](out: *mut [<$prefix _ $name _vec_t>], length: usize) {
|
||||
let mut bytes: Vec<*mut [<$prefix _ $name _t>]> = vec![::std::ptr::null_mut(); length];
|
||||
let pointer = bytes.as_mut_ptr();
|
||||
|
||||
(*out).data = pointer;
|
||||
@@ -399,26 +411,26 @@ int main() {
|
||||
::std::mem::forget(bytes);
|
||||
}
|
||||
|
||||
#[doc = "Performs a deep copy of a vector of [`wasm_" $name "_t`]."]
|
||||
#[doc = "Performs a deep copy of a vector of [`" $prefix "_" $name "_t`]."]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn [<wasm_ $name _vec_copy>](
|
||||
out_ptr: &mut [<wasm_ $name _vec_t>],
|
||||
in_ptr: & [<wasm_ $name _vec_t>])
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_copy>](
|
||||
out_ptr: &mut [<$prefix _ $name _vec_t>],
|
||||
in_ptr: & [<$prefix _ $name _vec_t>])
|
||||
{
|
||||
*out_ptr = in_ptr.clone();
|
||||
}
|
||||
|
||||
#[doc = "Deletes a vector of [`wasm_" $name "_t`].
|
||||
#[doc = "Deletes a vector of [`" $prefix "_" $name "_t`].
|
||||
|
||||
# Example
|
||||
|
||||
See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
See the [`" $prefix "_" $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>]>) {
|
||||
pub unsafe extern "C" fn [<$prefix _ $name _vec_delete>](ptr: Option<&mut [<$prefix _ $name _vec_t>]>) {
|
||||
if let Some(vec) = ptr {
|
||||
if !vec.data.is_null() {
|
||||
let data = vec.data as *mut Option<Box<[<wasm_ $name _t>]>>;
|
||||
let _data: Vec<Option<Box<[<wasm_ $name _t>]>>> = Vec::from_raw_parts(data, vec.size, vec.size);
|
||||
let data = vec.data as *mut Option<Box<[<$prefix _ $name _t>]>>;
|
||||
let _data: Vec<Option<Box<[<$prefix _ $name _t>]>>> = Vec::from_raw_parts(data, vec.size, vec.size);
|
||||
|
||||
vec.data = ::std::ptr::null_mut();
|
||||
vec.size = 0;
|
||||
@@ -427,7 +439,7 @@ See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
}
|
||||
}
|
||||
|
||||
wasm_declare_vec_inner!($name);
|
||||
wasm_declare_vec_inner!($name, $prefix);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -435,11 +447,15 @@ See the [`wasm_" $name "_vec_t`] type to get an example."]
|
||||
#[macro_export]
|
||||
macro_rules! wasm_declare_ref_base {
|
||||
($name:ident) => {
|
||||
wasm_declare_own!($name);
|
||||
wasm_declare_ref_base!($name, wasm);
|
||||
};
|
||||
|
||||
($name:ident, $prefix:ident) => {
|
||||
wasm_declare_own!($name, $prefix);
|
||||
|
||||
paste::paste! {
|
||||
#[no_mangle]
|
||||
pub extern "C" fn [<wasm_ $name _copy>](_arg: *const [<wasm_ $name _t>]) -> *mut [<wasm_ $name _t>] {
|
||||
pub extern "C" fn [<$prefix _ $name _copy>](_arg: *const [<$prefix _ $name _t>]) -> *mut [<$prefix _ $name _t>] {
|
||||
todo!("in generated declare ref base");
|
||||
//ptr::null_mut()
|
||||
}
|
||||
@@ -453,12 +469,16 @@ macro_rules! wasm_declare_ref_base {
|
||||
#[macro_export]
|
||||
macro_rules! wasm_declare_own {
|
||||
($name:ident) => {
|
||||
wasm_declare_own!($name, $prefix);
|
||||
};
|
||||
|
||||
($name:ident, $prefix:ident) => {
|
||||
paste::paste! {
|
||||
#[repr(C)]
|
||||
pub struct [<wasm_ $name _t>] {}
|
||||
pub struct [<$prefix _ $name _t>] {}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn [<wasm_ $name _delete>](_arg: *mut [<wasm_ $name _t>]) {
|
||||
pub extern "C" fn [<$prefix _ $name _delete>](_arg: *mut [<$prefix _ $name _t>]) {
|
||||
todo!("in generated delete")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user