diff --git a/crates/cpp/tests/native_mesh/Makefile b/crates/cpp/tests/native_mesh/Makefile index 497019c6d..65a5a0a67 100644 --- a/crates/cpp/tests/native_mesh/Makefile +++ b/crates/cpp/tests/native_mesh/Makefile @@ -1,16 +1,16 @@ all: - make -C component_b $@ - make -C mesh $@ - make -C component_a $@ + make -C cpp/component_b $@ + make -C cpp/mesh $@ + make -C cpp/component_a $@ bindgen: - make -C component_b $@ - make -C mesh $@ - make -C component_a $@ + make -C cpp/component_b $@ + make -C cpp/mesh $@ + make -C cpp/component_a $@ clean: - make -C component_b $@ - make -C mesh $@ - make -C component_a $@ + make -C cpp/component_b $@ + make -C cpp/mesh $@ + make -C cpp/component_a $@ \ No newline at end of file diff --git a/crates/cpp/tests/native_mesh/component_a/Makefile b/crates/cpp/tests/native_mesh/cpp/component_a/Makefile similarity index 80% rename from crates/cpp/tests/native_mesh/component_a/Makefile rename to crates/cpp/tests/native_mesh/cpp/component_a/Makefile index 829b6275e..f4db940d2 100644 --- a/crates/cpp/tests/native_mesh/component_a/Makefile +++ b/crates/cpp/tests/native_mesh/cpp/component_a/Makefile @@ -1,4 +1,4 @@ -CXXFLAGS=-g -O0 -I../../../helper-types +CXXFLAGS=-g -O0 -I../../../../helper-types -std=c++1z all: component_a diff --git a/crates/cpp/tests/native_mesh/component_a/a.cpp b/crates/cpp/tests/native_mesh/cpp/component_a/a.cpp similarity index 100% rename from crates/cpp/tests/native_mesh/component_a/a.cpp rename to crates/cpp/tests/native_mesh/cpp/component_a/a.cpp diff --git a/crates/cpp/tests/native_mesh/component_a/a_cpp.h b/crates/cpp/tests/native_mesh/cpp/component_a/a_cpp.h similarity index 100% rename from crates/cpp/tests/native_mesh/component_a/a_cpp.h rename to crates/cpp/tests/native_mesh/cpp/component_a/a_cpp.h diff --git a/crates/cpp/tests/native_mesh/cpp/component_a/component_a b/crates/cpp/tests/native_mesh/cpp/component_a/component_a new file mode 100644 index 000000000..514e41cff Binary files /dev/null and b/crates/cpp/tests/native_mesh/cpp/component_a/component_a differ diff --git a/crates/cpp/tests/native_mesh/component_a/libcomponent_b.so b/crates/cpp/tests/native_mesh/cpp/component_a/libcomponent_b.so similarity index 100% rename from crates/cpp/tests/native_mesh/component_a/libcomponent_b.so rename to crates/cpp/tests/native_mesh/cpp/component_a/libcomponent_b.so diff --git a/crates/cpp/tests/native_mesh/component_a/libmesh.so b/crates/cpp/tests/native_mesh/cpp/component_a/libmesh.so similarity index 100% rename from crates/cpp/tests/native_mesh/component_a/libmesh.so rename to crates/cpp/tests/native_mesh/cpp/component_a/libmesh.so diff --git a/crates/cpp/tests/native_mesh/component_a/main.cpp b/crates/cpp/tests/native_mesh/cpp/component_a/main.cpp similarity index 100% rename from crates/cpp/tests/native_mesh/component_a/main.cpp rename to crates/cpp/tests/native_mesh/cpp/component_a/main.cpp diff --git a/crates/cpp/tests/native_mesh/component_b/Makefile b/crates/cpp/tests/native_mesh/cpp/component_b/Makefile similarity index 77% rename from crates/cpp/tests/native_mesh/component_b/Makefile rename to crates/cpp/tests/native_mesh/cpp/component_b/Makefile index 2fff54abd..75229f856 100644 --- a/crates/cpp/tests/native_mesh/component_b/Makefile +++ b/crates/cpp/tests/native_mesh/cpp/component_b/Makefile @@ -1,4 +1,4 @@ -CXXFLAGS=-fPIC -g -O0 -I../../../helper-types +CXXFLAGS=-fPIC -g -O0 -I../../../../helper-types -std=c++1z all: libcomponent_b.so diff --git a/crates/cpp/tests/native_mesh/component_b/b.cpp b/crates/cpp/tests/native_mesh/cpp/component_b/b.cpp similarity index 100% rename from crates/cpp/tests/native_mesh/component_b/b.cpp rename to crates/cpp/tests/native_mesh/cpp/component_b/b.cpp diff --git a/crates/cpp/tests/native_mesh/component_b/b_cpp.h b/crates/cpp/tests/native_mesh/cpp/component_b/b_cpp.h similarity index 100% rename from crates/cpp/tests/native_mesh/component_b/b_cpp.h rename to crates/cpp/tests/native_mesh/cpp/component_b/b_cpp.h diff --git a/crates/cpp/tests/native_mesh/component_b/exports-foo-foo-resources-R.h b/crates/cpp/tests/native_mesh/cpp/component_b/exports-foo-foo-resources-R.h similarity index 100% rename from crates/cpp/tests/native_mesh/component_b/exports-foo-foo-resources-R.h rename to crates/cpp/tests/native_mesh/cpp/component_b/exports-foo-foo-resources-R.h diff --git a/crates/cpp/tests/native_mesh/component_b/impl.cpp b/crates/cpp/tests/native_mesh/cpp/component_b/impl.cpp similarity index 100% rename from crates/cpp/tests/native_mesh/component_b/impl.cpp rename to crates/cpp/tests/native_mesh/cpp/component_b/impl.cpp diff --git a/crates/cpp/tests/native_mesh/cpp/component_b/libcomponent_b.so b/crates/cpp/tests/native_mesh/cpp/component_b/libcomponent_b.so new file mode 100644 index 000000000..33b295151 Binary files /dev/null and b/crates/cpp/tests/native_mesh/cpp/component_b/libcomponent_b.so differ diff --git a/crates/cpp/tests/native_mesh/mesh/Makefile b/crates/cpp/tests/native_mesh/cpp/mesh/Makefile similarity index 82% rename from crates/cpp/tests/native_mesh/mesh/Makefile rename to crates/cpp/tests/native_mesh/cpp/mesh/Makefile index 523755e76..8dcc0d504 100644 --- a/crates/cpp/tests/native_mesh/mesh/Makefile +++ b/crates/cpp/tests/native_mesh/cpp/mesh/Makefile @@ -1,4 +1,4 @@ -CXXFLAGS=-fPIC -g -O0 -I../../../helper-types +CXXFLAGS=-fPIC -g -O0 -I../../../../helper-types -std=c++1z all: libmesh.so diff --git a/crates/cpp/tests/native_mesh/mesh/impl.cpp b/crates/cpp/tests/native_mesh/cpp/mesh/impl.cpp similarity index 100% rename from crates/cpp/tests/native_mesh/mesh/impl.cpp rename to crates/cpp/tests/native_mesh/cpp/mesh/impl.cpp diff --git a/crates/cpp/tests/native_mesh/mesh/libcomponent_b.so b/crates/cpp/tests/native_mesh/cpp/mesh/libcomponent_b.so similarity index 100% rename from crates/cpp/tests/native_mesh/mesh/libcomponent_b.so rename to crates/cpp/tests/native_mesh/cpp/mesh/libcomponent_b.so diff --git a/crates/cpp/tests/native_mesh/cpp/mesh/libmesh.so b/crates/cpp/tests/native_mesh/cpp/mesh/libmesh.so new file mode 100644 index 000000000..bbb1b6504 Binary files /dev/null and b/crates/cpp/tests/native_mesh/cpp/mesh/libmesh.so differ diff --git a/crates/cpp/tests/native_mesh/mesh/mesh-exports-foo-foo-resources-R.h b/crates/cpp/tests/native_mesh/cpp/mesh/mesh-exports-foo-foo-resources-R.h similarity index 100% rename from crates/cpp/tests/native_mesh/mesh/mesh-exports-foo-foo-resources-R.h rename to crates/cpp/tests/native_mesh/cpp/mesh/mesh-exports-foo-foo-resources-R.h diff --git a/crates/cpp/tests/native_mesh/mesh/mesh-exports-foo-foo-resources.h b/crates/cpp/tests/native_mesh/cpp/mesh/mesh-exports-foo-foo-resources.h similarity index 100% rename from crates/cpp/tests/native_mesh/mesh/mesh-exports-foo-foo-resources.h rename to crates/cpp/tests/native_mesh/cpp/mesh/mesh-exports-foo-foo-resources.h diff --git a/crates/cpp/tests/native_mesh/mesh/mesh_cpp_native.h b/crates/cpp/tests/native_mesh/cpp/mesh/mesh_cpp_native.h similarity index 100% rename from crates/cpp/tests/native_mesh/mesh/mesh_cpp_native.h rename to crates/cpp/tests/native_mesh/cpp/mesh/mesh_cpp_native.h diff --git a/crates/cpp/tests/native_mesh/mesh/mesh_native.cpp b/crates/cpp/tests/native_mesh/cpp/mesh/mesh_native.cpp similarity index 100% rename from crates/cpp/tests/native_mesh/mesh/mesh_native.cpp rename to crates/cpp/tests/native_mesh/cpp/mesh/mesh_native.cpp diff --git a/crates/cpp/tests/native_strings/Makefile b/crates/cpp/tests/native_strings/Makefile index 54cdcdf09..0be82d7aa 100644 --- a/crates/cpp/tests/native_strings/Makefile +++ b/crates/cpp/tests/native_strings/Makefile @@ -1,26 +1,26 @@ -CXXFLAGS=-g -O0 -I../../helper-types +CXXFLAGS=-g -O0 -I../../helper-types --std=c++17 WIT_BINDGEN=../../../../target/debug/wit-bindgen all: libstrings.so app-strings -libstrings.so: the_world.pie.o guest.pie.o +libstrings.so: the_world.pie.o guest_exports.pie.o $(CXX) $(CXXFLAGS) -shared -o $@ $^ -Wl,--version-script=guest.lds %.pie.o: %.cpp $(CXX) $(CXXFLAGS) -fPIE -o $@ -c $^ -app-strings: the_world_native.o main.o - $(CXX) $(CXXFLAGS) -o $@ $^ -L. -lstrings +app-strings: the_world_native.o main.o guest_imports.o + $(CXX) $(CXXFLAGS) -o $@ $^ -g -L. -lstrings bindgen: wit/strings.wit $(WIT_BINDGEN) cpp wit --wasm64 --format $(WIT_BINDGEN) cpp wit --wasm64 --format --direct cd rust/src ; ../../$(WIT_BINDGEN) rust ../../wit --wasm64 -guest.wasm: the_world.cpp guest.cpp +guest.wasm: the_world.cpp guest_exports.cpp /opt/wasi-sdk/bin/clang++ -o $@ $^ $(CXXFLAGS) -guest_release.wasm: the_world.cpp guest.cpp +guest_release.wasm: the_world.cpp guest_exports.cpp /opt/wasi-sdk/bin/clang++ -o $@ $^ $(CXXFLAGS) -g0 -O3 clean: diff --git a/crates/cpp/tests/native_strings/guest.cpp b/crates/cpp/tests/native_strings/guest_exports.cpp similarity index 67% rename from crates/cpp/tests/native_strings/guest.cpp rename to crates/cpp/tests/native_strings/guest_exports.cpp index 90fa6258d..6d2938f1a 100644 --- a/crates/cpp/tests/native_strings/guest.cpp +++ b/crates/cpp/tests/native_strings/guest_exports.cpp @@ -1,13 +1,16 @@ #include "the_world_cpp.h" -void exports::foo::foo::strings::A(wit::string &&x) { +void exports::foo::foo::strings::A(wit::string &&x) +{ ::foo::foo::strings::A(x.get_view()); } -wit::string exports::foo::foo::strings::B() { +wit::string exports::foo::foo::strings::B() +{ return ::foo::foo::strings::B(); } -wit::string exports::foo::foo::strings::C(wit::string &&x, wit::string &&b) { +wit::string exports::foo::foo::strings::C(wit::string &&x, wit::string &&b) +{ return ::foo::foo::strings::C(x.get_view(), b.get_view()); } diff --git a/crates/cpp/tests/native_strings/guest_imports.cpp b/crates/cpp/tests/native_strings/guest_imports.cpp new file mode 100644 index 000000000..ce4cc515e --- /dev/null +++ b/crates/cpp/tests/native_strings/guest_imports.cpp @@ -0,0 +1,20 @@ +#include "the_world_cpp_native.h" +#include + +using namespace std; + +void foo::foo::strings::A(std::string_view x) +{ + std::cout << x << std::endl; +} +wit::string foo::foo::strings::B() +{ + wit::string b = wit::string::from_view(std::string_view("hello B")); + return b; +} +wit::string foo::foo::strings::C(std::string_view a, std::string_view b) +{ + std::cout << a << '|' << b << std::endl; + wit::string c = wit::string::from_view(std::string_view("hello C")); + return c; +} \ No newline at end of file diff --git a/crates/cpp/tests/native_strings/main.cpp b/crates/cpp/tests/native_strings/main.cpp index 0f86198e5..faef32df4 100644 --- a/crates/cpp/tests/native_strings/main.cpp +++ b/crates/cpp/tests/native_strings/main.cpp @@ -2,19 +2,6 @@ #include "the_world_cpp_native.h" #include -void foo::foo::strings::A(std::string_view x) { - std::cout << x << std::endl; -} -wit::string foo::foo::strings::B() { - wit::string b = wit::string::from_view(std::string_view("hello B")); - return b; -} -wit::string foo::foo::strings::C(std::string_view a, std::string_view b) { - std::cout << a << '|' << b << std::endl; - wit::string c = wit::string::from_view(std::string_view("hello C")); - return c; -} - int main() { wit::string a = wit::string::from_view(std::string_view("hello A")); exports::foo::foo::strings::A(a); diff --git a/crates/cpp/tests/native_strings/rust/src/lib.rs b/crates/cpp/tests/native_strings/rust/src/lib.rs index 0fb041a18..4ab10ffe0 100644 --- a/crates/cpp/tests/native_strings/rust/src/lib.rs +++ b/crates/cpp/tests/native_strings/rust/src/lib.rs @@ -3,6 +3,7 @@ use std::alloc::Layout; use the_world::exports::foo::foo::strings::Guest; mod the_world; +mod the_world_native; struct MyWorld; @@ -22,6 +23,7 @@ impl Guest for MyWorld { the_world::export!(MyWorld with_types_in the_world); + // the crate wit-bindgen-rt doesn't work on native #[no_mangle] pub unsafe extern "C" fn cabi_realloc( diff --git a/crates/cpp/tests/native_strings/rust/src/the_world.rs b/crates/cpp/tests/native_strings/rust/src/the_world.rs index 5c05d404b..9f53259ca 100644 --- a/crates/cpp/tests/native_strings/rust/src/the_world.rs +++ b/crates/cpp/tests/native_strings/rust/src/the_world.rs @@ -1,159 +1,180 @@ // Generated by `wit-bindgen` 0.24.0. DO NOT EDIT! // Options used: + #[allow(dead_code)] pub mod foo { - #[allow(dead_code)] - pub mod foo { - #[allow(dead_code, clippy::all)] - pub mod strings { - #[used] - #[doc(hidden)] - #[cfg(target_arch = "wasm32")] - static __FORCE_SECTION_REF: fn() = super::super::super::__link_custom_section_describing_imports; - use super::super::super::_rt; - #[allow(unused_unsafe, clippy::all)] - pub fn a(x: &str,){ - unsafe { - let vec0 = x; - let ptr0 = vec0.as_ptr().cast::(); - let len0 = vec0.len(); + #[allow(dead_code)] + pub mod foo { + #[allow(dead_code, clippy::all)] + pub mod strings { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::__link_custom_section_describing_imports; + use crate::the_world_native; - #[link(wasm_import_module = "foo:foo/strings")] - extern "C" { - #[cfg_attr(target_arch = "wasm32", link_name = "a")] - fn fooX3AfooX2FstringsX00a(_: *mut u8, _: usize, ); - } - fooX3AfooX2FstringsX00a(ptr0.cast_mut(), len0); - } - } - #[allow(unused_unsafe, clippy::all)] - pub fn b() -> _rt::String{ - unsafe { - #[repr(align(8))] - struct RetArea([::core::mem::MaybeUninit::; 16]); - let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 16]); - let ptr0 = ret_area.0.as_mut_ptr().cast::(); - #[link(wasm_import_module = "foo:foo/strings")] - extern "C" { - #[cfg_attr(target_arch = "wasm32", link_name = "b")] - fn fooX3AfooX2FstringsX00b(_: *mut u8, ); - } - fooX3AfooX2FstringsX00b(ptr0); - let l1 = *ptr0.add(0).cast::<*mut u8>(); - let l2 = *ptr0.add(8).cast::(); - let len3 = l2; - let bytes3 = _rt::Vec::from_raw_parts(l1.cast(), len3, len3); - _rt::string_lift(bytes3) - } - } - #[allow(unused_unsafe, clippy::all)] - pub fn c(a: &str,b: &str,) -> _rt::String{ - unsafe { - #[repr(align(8))] - struct RetArea([::core::mem::MaybeUninit::; 16]); - let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 16]); - let vec0 = a; - let ptr0 = vec0.as_ptr().cast::(); - let len0 = vec0.len(); - let vec1 = b; - let ptr1 = vec1.as_ptr().cast::(); - let len1 = vec1.len(); - let ptr2 = ret_area.0.as_mut_ptr().cast::(); - #[link(wasm_import_module = "foo:foo/strings")] - extern "C" { - #[cfg_attr(target_arch = "wasm32", link_name = "c")] - fn fooX3AfooX2FstringsX00c(_: *mut u8, _: usize, _: *mut u8, _: usize, _: *mut u8, ); - } - fooX3AfooX2FstringsX00c(ptr0.cast_mut(), len0, ptr1.cast_mut(), len1, ptr2); - let l3 = *ptr2.add(0).cast::<*mut u8>(); - let l4 = *ptr2.add(8).cast::(); - let len5 = l4; - let bytes5 = _rt::Vec::from_raw_parts(l3.cast(), len5, len5); - _rt::string_lift(bytes5) - } - } + use super::super::super::_rt; + #[allow(unused_unsafe, clippy::all)] + pub fn a(x: &str) { + unsafe { + let vec0 = x; + let ptr0 = vec0.as_ptr().cast::(); + let len0 = vec0.len(); + #[link(wasm_import_module = "foo:foo/strings")] + extern "C" { + #[cfg_attr(target_arch = "wasm32", link_name = "a")] + fn fooX3AfooX2FstringsX00a(_: *mut u8, _: usize); + } + the_world_native::fooX3AfooX2FstringsX00a(ptr0.cast_mut(), len0); + } + } + #[allow(unused_unsafe, clippy::all)] + pub fn b() -> _rt::String { + unsafe { + #[repr(align(8))] + struct RetArea([::core::mem::MaybeUninit; 16]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 16]); + let ptr0 = ret_area.0.as_mut_ptr().cast::(); + #[link(wasm_import_module = "foo:foo/strings")] + extern "C" { + #[cfg_attr(target_arch = "wasm32", link_name = "b")] + fn fooX3AfooX2FstringsX00b(_: *mut u8); + } + fooX3AfooX2FstringsX00b(ptr0); + let l1 = *ptr0.add(0).cast::<*mut u8>(); + let l2 = *ptr0.add(8).cast::(); + let len3 = l2; + let bytes3 = _rt::Vec::from_raw_parts(l1.cast(), len3, len3); + _rt::string_lift(bytes3) + } + } + #[allow(unused_unsafe, clippy::all)] + pub fn c(a: &str, b: &str) -> _rt::String { + unsafe { + #[repr(align(8))] + struct RetArea([::core::mem::MaybeUninit; 16]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 16]); + let vec0 = a; + let ptr0 = vec0.as_ptr().cast::(); + let len0 = vec0.len(); + let vec1 = b; + let ptr1 = vec1.as_ptr().cast::(); + let len1 = vec1.len(); + let ptr2 = ret_area.0.as_mut_ptr().cast::(); + #[link(wasm_import_module = "foo:foo/strings")] + extern "C" { + #[cfg_attr(target_arch = "wasm32", link_name = "c")] + fn fooX3AfooX2FstringsX00c( + _: *mut u8, + _: usize, + _: *mut u8, + _: usize, + _: *mut u8, + ); + } + fooX3AfooX2FstringsX00c(ptr0.cast_mut(), len0, ptr1.cast_mut(), len1, ptr2); + let l3 = *ptr2.add(0).cast::<*mut u8>(); + let l4 = *ptr2.add(8).cast::(); + let len5 = l4; + let bytes5 = _rt::Vec::from_raw_parts(l3.cast(), len5, len5); + _rt::string_lift(bytes5) + } + } + } } - - } } #[allow(dead_code)] pub mod exports { - #[allow(dead_code)] - pub mod foo { #[allow(dead_code)] pub mod foo { - #[allow(dead_code, clippy::all)] - pub mod strings { - #[used] - #[doc(hidden)] - #[cfg(target_arch = "wasm32")] - static __FORCE_SECTION_REF: fn() = super::super::super::super::__link_custom_section_describing_imports; - use super::super::super::super::_rt; - #[doc(hidden)] - #[allow(non_snake_case)] - pub unsafe fn _export_a_cabi(arg0: *mut u8,arg1: usize,) {#[cfg(target_arch="wasm32")] - _rt::run_ctors_once();let len0 = arg1; - let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); - T::a(_rt::string_lift(bytes0)); - } - #[doc(hidden)] - #[allow(non_snake_case)] - pub unsafe fn _export_b_cabi() -> *mut u8 {#[cfg(target_arch="wasm32")] - _rt::run_ctors_once();let result0 = T::b(); - let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); - let vec2 = (result0.into_bytes()).into_boxed_slice(); - let ptr2 = vec2.as_ptr().cast::(); - let len2 = vec2.len(); - ::core::mem::forget(vec2); - *ptr1.add(8).cast::() = len2; - *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); - ptr1 - } - #[doc(hidden)] - #[allow(non_snake_case)] - pub unsafe fn __post_return_b(arg0: *mut u8,) { - let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0.add(8).cast::(); - _rt::cabi_dealloc(l0, l1, 1); - } - #[doc(hidden)] - #[allow(non_snake_case)] - pub unsafe fn _export_c_cabi(arg0: *mut u8,arg1: usize,arg2: *mut u8,arg3: usize,) -> *mut u8 {#[cfg(target_arch="wasm32")] - _rt::run_ctors_once();let len0 = arg1; - let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); - let len1 = arg3; - let bytes1 = _rt::Vec::from_raw_parts(arg2.cast(), len1, len1); - let result2 = T::c(_rt::string_lift(bytes0), _rt::string_lift(bytes1)); - let ptr3 = _RET_AREA.0.as_mut_ptr().cast::(); - let vec4 = (result2.into_bytes()).into_boxed_slice(); - let ptr4 = vec4.as_ptr().cast::(); - let len4 = vec4.len(); - ::core::mem::forget(vec4); - *ptr3.add(8).cast::() = len4; - *ptr3.add(0).cast::<*mut u8>() = ptr4.cast_mut(); - ptr3 - } - #[doc(hidden)] - #[allow(non_snake_case)] - pub unsafe fn __post_return_c(arg0: *mut u8,) { - let l0 = *arg0.add(0).cast::<*mut u8>(); - let l1 = *arg0.add(8).cast::(); - _rt::cabi_dealloc(l0, l1, 1); - } - pub trait Guest { - fn a(x: _rt::String,); - fn b() -> _rt::String; - fn c(a: _rt::String,b: _rt::String,) -> _rt::String; - } - #[doc(hidden)] - - macro_rules! __export_foo_foo_strings_cabi{ + #[allow(dead_code)] + pub mod foo { + #[allow(dead_code, clippy::all)] + pub mod strings { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::super::__link_custom_section_describing_imports; + use super::super::super::super::_rt; + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_a_cabi(arg0: *mut u8, arg1: usize) { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let len0 = arg1; + let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); + T::a(_rt::string_lift(bytes0)); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_b_cabi() -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::b(); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec2 = (result0.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(8).cast::() = len2; + *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_b(arg0: *mut u8) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(8).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_c_cabi( + arg0: *mut u8, + arg1: usize, + arg2: *mut u8, + arg3: usize, + ) -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let len0 = arg1; + let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); + let len1 = arg3; + let bytes1 = _rt::Vec::from_raw_parts(arg2.cast(), len1, len1); + let result2 = T::c(_rt::string_lift(bytes0), _rt::string_lift(bytes1)); + let ptr3 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec4 = (result2.into_bytes()).into_boxed_slice(); + let ptr4 = vec4.as_ptr().cast::(); + let len4 = vec4.len(); + ::core::mem::forget(vec4); + *ptr3.add(8).cast::() = len4; + *ptr3.add(0).cast::<*mut u8>() = ptr4.cast_mut(); + ptr3 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_c(arg0: *mut u8) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(8).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + pub trait Guest { + fn a(x: _rt::String); + fn b() -> _rt::String; + fn c(a: _rt::String, b: _rt::String) -> _rt::String; + } + #[doc(hidden)] + #[macro_export] + macro_rules! __export_foo_foo_strings_cabi{ ($ty:ident with_types_in $($path_to_types:tt)*) => (const _: () = { #[cfg_attr(target_arch = "wasm32", export_name = "foo:foo/strings#a")] #[cfg_attr(not(target_arch = "wasm32"), no_mangle)] - unsafe extern "C" fn fooX3AfooX2FstringsX23a(arg0: *mut u8,arg1: usize,) { + pub unsafe extern "C" fn fooX3AfooX2FstringsX23a(arg0: *mut u8,arg1: usize,) { + println!("fooX3AfooX2FstringsX23a"); $($path_to_types)*::_export_a_cabi::<$ty>(arg0, arg1) } #[cfg_attr(target_arch = "wasm32", export_name = "foo:foo/strings#b")] @@ -178,41 +199,39 @@ pub mod exports { } };); } - #[doc(hidden)] - pub(crate) use __export_foo_foo_strings_cabi; - #[repr(align(8))] - struct _RetArea([::core::mem::MaybeUninit::; 16]); - static mut _RET_AREA: _RetArea = _RetArea([::core::mem::MaybeUninit::uninit(); 16]); - -} - -} -} + #[doc(hidden)] + pub(crate) use __export_foo_foo_strings_cabi; + #[repr(align(8))] + struct _RetArea([::core::mem::MaybeUninit; 16]); + static mut _RET_AREA: _RetArea = _RetArea([::core::mem::MaybeUninit::uninit(); 16]); + } + } + } } mod _rt { - pub use alloc_crate::string::String; - pub use alloc_crate::vec::Vec; - pub unsafe fn string_lift(bytes: Vec) -> String { - if cfg!(debug_assertions) { - String::from_utf8(bytes).unwrap() - } else { - String::from_utf8_unchecked(bytes) + pub use alloc_crate::string::String; + pub use alloc_crate::vec::Vec; + pub unsafe fn string_lift(bytes: Vec) -> String { + if cfg!(debug_assertions) { + String::from_utf8(bytes).unwrap() + } else { + String::from_utf8_unchecked(bytes) + } } - } - - #[cfg(target_arch = "wasm32")] - pub fn run_ctors_once() { - wit_bindgen::rt::run_ctors_once(); - } - pub unsafe fn cabi_dealloc(ptr: *mut u8, size: usize, align: usize) { - if size == 0 { - return; + + #[cfg(target_arch = "wasm32")] + pub fn run_ctors_once() { + wit_bindgen::rt::run_ctors_once(); } - let layout = alloc::Layout::from_size_align_unchecked(size, align); - alloc::dealloc(ptr as *mut u8, layout); - } - extern crate alloc as alloc_crate; - pub use alloc_crate::alloc; + pub unsafe fn cabi_dealloc(ptr: *mut u8, size: usize, align: usize) { + if size == 0 { + return; + } + let layout = alloc::Layout::from_size_align_unchecked(size, align); + alloc::dealloc(ptr as *mut u8, layout); + } + extern crate alloc as alloc_crate; + pub use alloc_crate::alloc; } /// Generates `#[no_mangle]` functions to export the specified type as the @@ -259,6 +278,5 @@ processed-by\x02\x0dwit-component\x070.207.0\x10wit-bindgen-rust\x060.24.0"; #[doc(hidden)] #[cfg(target_arch = "wasm32")] pub fn __link_custom_section_describing_imports() { - wit_bindgen::rt::maybe_link_cabi_realloc(); + wit_bindgen::rt::maybe_link_cabi_realloc(); } - diff --git a/crates/cpp/tests/native_strings/the_world.cpp b/crates/cpp/tests/native_strings/the_world.cpp index 9ab7b9c5c..d7538bb90 100644 --- a/crates/cpp/tests/native_strings/the_world.cpp +++ b/crates/cpp/tests/native_strings/the_world.cpp @@ -63,7 +63,7 @@ wit::string foo::foo::strings::C(std::string_view a, std::string_view b) { return wit::string((char const *)(*((uint8_t **)(ptr2 + 0))), len3); } extern "C" __attribute__((__export_name__("foo:foo/strings#a"))) void -fooX3AfooX2FstringsX23a(uint8_t *arg0, size_t arg1) { +fooX3AfooX2FstringsX23a(uint8_t *arg0, size_t arg1) { auto len0 = arg1; exports::foo::foo::strings::A(wit::string((char const *)(arg0), len0)); diff --git a/crates/cpp/tests/native_strings/the_world_native.cpp b/crates/cpp/tests/native_strings/the_world_native.cpp index 2ba8a4083..9284ff6ca 100644 --- a/crates/cpp/tests/native_strings/the_world_native.cpp +++ b/crates/cpp/tests/native_strings/the_world_native.cpp @@ -44,11 +44,12 @@ extern "C" void fooX3AfooX2FstringsX00c(uint8_t *arg0, size_t arg1, *((size_t *)(arg4 + 8)) = len3; *((uint8_t **)(arg4 + 0)) = ptr3; } -void exports::foo::foo::strings::A(wit::string x) { +void exports::foo::foo::strings::A(wit::string x) { auto const &vec0 = x; auto ptr0 = vec0.data(); auto len0 = vec0.size(); fooX3AfooX2FstringsX23a(ptr0, len0); + } wit::guest_owned exports::foo::foo::strings::B() { auto ret = fooX3AfooX2FstringsX23b();