-
Notifications
You must be signed in to change notification settings - Fork 10
Description
Structs defined in c++, such as b2Vec2 seem to cause many problems when they are passed over the FFI by-value. I think the reason is different calling conventions for C vs C++.
It seems like functions returning structs as-value or taking structs as input argument as-value cause problems. Take Body::world_point() as example, it does not work and return undefined data or some times crash. (All other demos from the testbed work because they never use any such function).
It is implemented as follows:
pub fn world_point(&self, local: &Vec2) -> Vec2 {
unsafe { ffi::Body_get_world_point(self.ptr(), local) }
}
b2Vec2 Body_get_world_point(const b2Body* self, const b2Vec2* local) {
return self->GetWorldPoint(*local);
}
Here the argument "local" will point to garbage no matter how you call the funcition and the program crashes. This is because the return value is a b2Vec2 as-value and b2Vec2 is compiled as struct/class by c++ code while the function Body_get_world_point is treated as C-code.