Skip to content

Commit

Permalink
Added constructor return type for wasm32 target (#1877)
Browse files Browse the repository at this point in the history
  • Loading branch information
emilio committed Aug 25, 2020
2 parents d492ac4 + d446a4f commit 4608a11
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/ir/context.rs
Expand Up @@ -577,6 +577,14 @@ If you encounter an error missing from this list, please file an issue or a PR!"
}
}

/// Returns `true` if the target architecture is wasm32
pub fn is_target_wasm32(&self) -> bool {
match self.target_info {
Some(ref ti) => ti.triple.starts_with("wasm32-"),
None => false,
}
}

/// Creates a timer for the current bindgen phase. If time_phases is `true`,
/// the timer will print to stderr when it is dropped, otherwise it will do
/// nothing.
Expand Down
10 changes: 9 additions & 1 deletion src/ir/function.rs
Expand Up @@ -495,7 +495,15 @@ impl FunctionSig {
} else {
ty.ret_type().ok_or(ParseError::Continue)?
};
let ret = Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx);

let ret = if is_constructor && ctx.is_target_wasm32() {
// Constructors in Clang wasm32 target return a pointer to the object
// being constructed.
let void = Item::builtin_type(TypeKind::Void, false, ctx);
Item::builtin_type(TypeKind::Pointer(void), false, ctx)
} else {
Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx)
};

// Clang plays with us at "find the calling convention", see #549 and
// co. This seems to be a better fix than that commit.
Expand Down
37 changes: 37 additions & 0 deletions tests/expectations/tests/libclang-3.9/wasm-constructor-returns.rs
@@ -0,0 +1,37 @@
#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]

#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct Foo {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_Foo() {
assert_eq!(
::std::mem::size_of::<Foo>(),
1usize,
concat!("Size of: ", stringify!(Foo))
);
assert_eq!(
::std::mem::align_of::<Foo>(),
1usize,
concat!("Alignment of ", stringify!(Foo))
);
}
extern "C" {
#[link_name = "\u{1}_ZN3FooC1Ei"]
pub fn Foo_Foo(this: *mut Foo, var: ::std::os::raw::c_int);
}
impl Foo {
#[inline]
pub unsafe fn new(var: ::std::os::raw::c_int) -> Self {
let mut __bindgen_tmp = ::std::mem::MaybeUninit::uninit();
Foo_Foo(__bindgen_tmp.as_mut_ptr(), var);
__bindgen_tmp.assume_init()
}
}
37 changes: 37 additions & 0 deletions tests/expectations/tests/libclang-4/wasm-constructor-returns.rs
@@ -0,0 +1,37 @@
#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]

#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct Foo {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_Foo() {
assert_eq!(
::std::mem::size_of::<Foo>(),
1usize,
concat!("Size of: ", stringify!(Foo))
);
assert_eq!(
::std::mem::align_of::<Foo>(),
1usize,
concat!("Alignment of ", stringify!(Foo))
);
}
extern "C" {
#[link_name = "\u{1}_ZN3FooC1Ei"]
pub fn Foo_Foo(this: *mut Foo, var: ::std::os::raw::c_int);
}
impl Foo {
#[inline]
pub unsafe fn new(var: ::std::os::raw::c_int) -> Self {
let mut __bindgen_tmp = ::std::mem::MaybeUninit::uninit();
Foo_Foo(__bindgen_tmp.as_mut_ptr(), var);
__bindgen_tmp.assume_init()
}
}
40 changes: 40 additions & 0 deletions tests/expectations/tests/wasm-constructor-returns.rs
@@ -0,0 +1,40 @@
#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]

#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct Foo {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_Foo() {
assert_eq!(
::std::mem::size_of::<Foo>(),
1usize,
concat!("Size of: ", stringify!(Foo))
);
assert_eq!(
::std::mem::align_of::<Foo>(),
1usize,
concat!("Alignment of ", stringify!(Foo))
);
}
extern "C" {
#[link_name = "\u{1}_ZN3FooC1Ei"]
pub fn Foo_Foo(
this: *mut Foo,
var: ::std::os::raw::c_int,
) -> *mut ::std::os::raw::c_void;
}
impl Foo {
#[inline]
pub unsafe fn new(var: ::std::os::raw::c_int) -> Self {
let mut __bindgen_tmp = ::std::mem::MaybeUninit::uninit();
Foo_Foo(__bindgen_tmp.as_mut_ptr(), var);
__bindgen_tmp.assume_init()
}
}
7 changes: 7 additions & 0 deletions tests/headers/wasm-constructor-returns.hpp
@@ -0,0 +1,7 @@
// bindgen-flags: --generate constructors,types -- -fvisibility=default --target=wasm32-unknown-emscripten

class Foo {
public:
Foo(int var);
};

0 comments on commit 4608a11

Please sign in to comment.