From 451d82bd76a7159b09a6048523ff5aa19a3aa228 Mon Sep 17 00:00:00 2001 From: Andrew Hayzen Date: Tue, 14 Feb 2023 17:35:56 +0000 Subject: [PATCH] cxx-qt-lib: ensure correct sizes for wasm 32bit Related to #414 --- crates/cxx-qt-lib/src/core/qmodelindex.cpp | 3 ++- crates/cxx-qt-lib/src/core/qmodelindex.rs | 5 ++++- crates/cxx-qt-lib/src/core/qvariant/mod.rs | 15 +++++++++++++-- crates/cxx-qt-lib/src/core/qvariant/qvariant.cpp | 15 +++++++++++++-- crates/cxx-qt-lib/src/gui/qcolor.cpp | 4 +++- crates/cxx-qt-lib/src/gui/qcolor.rs | 4 +++- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/crates/cxx-qt-lib/src/core/qmodelindex.cpp b/crates/cxx-qt-lib/src/core/qmodelindex.cpp index e55f09053..731f115e3 100644 --- a/crates/cxx-qt-lib/src/core/qmodelindex.cpp +++ b/crates/cxx-qt-lib/src/core/qmodelindex.cpp @@ -15,6 +15,7 @@ // https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.h?h=v6.2.4#n195 assert_alignment_and_size(QModelIndex, alignof(::std::size_t), - sizeof(::std::size_t[3])); + (sizeof(::std::int32_t) * 2) + sizeof(::std::size_t) + + sizeof(::std::size_t)); static_assert(::std::is_trivially_copyable::value); diff --git a/crates/cxx-qt-lib/src/core/qmodelindex.rs b/crates/cxx-qt-lib/src/core/qmodelindex.rs index 751a52c37..26532f490 100644 --- a/crates/cxx-qt-lib/src/core/qmodelindex.rs +++ b/crates/cxx-qt-lib/src/core/qmodelindex.rs @@ -56,7 +56,10 @@ mod ffi { #[derive(Clone)] #[repr(C)] pub struct QModelIndex { - _space: MaybeUninit<[usize; 3]>, + _r: MaybeUninit, + _c: MaybeUninit, + _i: MaybeUninit, + _m: MaybeUninit, } impl Default for QModelIndex { diff --git a/crates/cxx-qt-lib/src/core/qvariant/mod.rs b/crates/cxx-qt-lib/src/core/qvariant/mod.rs index 985bffaff..4826278b4 100644 --- a/crates/cxx-qt-lib/src/core/qvariant/mod.rs +++ b/crates/cxx-qt-lib/src/core/qvariant/mod.rs @@ -51,10 +51,21 @@ pub struct QVariant { /// /// Qt5 QVariant has one member, which contains three uints (but they are optimised to a size of 8) and a union /// Qt6 QVariant has one member, which contains three pointers and a union (pointer largest) + _data: MaybeUninit, + + #[cfg(qt_version_major = "5")] + _type: MaybeUninit, + #[cfg(qt_version_major = "5")] + _is_shared: MaybeUninit, #[cfg(qt_version_major = "5")] - _space: MaybeUninit<[usize; 2]>, + _is_null: MaybeUninit, + + #[cfg(qt_version_major = "6")] + _is_shared: MaybeUninit, + #[cfg(qt_version_major = "6")] + _is_null: MaybeUninit, #[cfg(qt_version_major = "6")] - _space: MaybeUninit<[usize; 4]>, + _packed_type: MaybeUninit, } impl Clone for QVariant { diff --git a/crates/cxx-qt-lib/src/core/qvariant/qvariant.cpp b/crates/cxx-qt-lib/src/core/qvariant/qvariant.cpp index cb3f95e5d..e34de026f 100644 --- a/crates/cxx-qt-lib/src/core/qvariant/qvariant.cpp +++ b/crates/cxx-qt-lib/src/core/qvariant/qvariant.cpp @@ -24,13 +24,24 @@ // https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/kernel/qvariant.h?h=v6.2.4#n540 // https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/kernel/qvariant.h?h=v6.2.4#n474 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + +#if (QT_POINTER_SIZE == 4) +// 32bit is 3 * 32bit ptr (12) + union with double (8) + 4 bytes padding +// alignment is 8 byte on 32bit systems as well due to the double +assert_alignment_and_size(QVariant, + alignof(double), + (sizeof(::std::size_t) * 3) + sizeof(double) + 4); +#else +// 64bit is 3 * 64ptr ptr (16) + union with double (8) assert_alignment_and_size(QVariant, alignof(::std::size_t), - sizeof(::std::size_t[4])); + (sizeof(::std::size_t) * 3) + sizeof(double)); +#endif + #else assert_alignment_and_size(QVariant, alignof(::std::size_t), - sizeof(::std::size_t[2])); + (sizeof(::std::uint32_t) * 3) + sizeof(::std::size_t))); #endif static_assert(!::std::is_trivially_copy_assignable::value); diff --git a/crates/cxx-qt-lib/src/gui/qcolor.cpp b/crates/cxx-qt-lib/src/gui/qcolor.cpp index 0af9d25b3..4301efd5c 100644 --- a/crates/cxx-qt-lib/src/gui/qcolor.cpp +++ b/crates/cxx-qt-lib/src/gui/qcolor.cpp @@ -18,7 +18,9 @@ // https://code.qt.io/cgit/qt/qtbase.git/tree/src/gui/painting/qcolor.h?h=v6.2.4#n237 assert_alignment_and_size(QColor, alignof(::std::size_t), - sizeof(::std::size_t[2])); + sizeof(::std::size_t) + + (sizeof(::std::uint16_t) * 5) + + 2 /* compiler padding */); // QColor still had copy & move constructors in Qt 5 but they were basically // trivial. diff --git a/crates/cxx-qt-lib/src/gui/qcolor.rs b/crates/cxx-qt-lib/src/gui/qcolor.rs index f85e7fbed..e09a56205 100644 --- a/crates/cxx-qt-lib/src/gui/qcolor.rs +++ b/crates/cxx-qt-lib/src/gui/qcolor.rs @@ -58,7 +58,9 @@ mod ffi { #[derive(Clone)] #[repr(C)] pub struct QColor { - _space: MaybeUninit<[usize; 2]>, + _cspec: MaybeUninit, + _ct: MaybeUninit<[u16; 5]>, + _padding: MaybeUninit, } impl QColor {