Skip to content

Commit 451d82b

Browse files
committed
cxx-qt-lib: ensure correct sizes for wasm 32bit
Related to #414
1 parent b560c29 commit 451d82b

File tree

6 files changed

+38
-8
lines changed

6 files changed

+38
-8
lines changed

crates/cxx-qt-lib/src/core/qmodelindex.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.h?h=v6.2.4#n195
1616
assert_alignment_and_size(QModelIndex,
1717
alignof(::std::size_t),
18-
sizeof(::std::size_t[3]));
18+
(sizeof(::std::int32_t) * 2) + sizeof(::std::size_t) +
19+
sizeof(::std::size_t));
1920

2021
static_assert(::std::is_trivially_copyable<QModelIndex>::value);

crates/cxx-qt-lib/src/core/qmodelindex.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ mod ffi {
5656
#[derive(Clone)]
5757
#[repr(C)]
5858
pub struct QModelIndex {
59-
_space: MaybeUninit<[usize; 3]>,
59+
_r: MaybeUninit<i32>,
60+
_c: MaybeUninit<i32>,
61+
_i: MaybeUninit<usize>,
62+
_m: MaybeUninit<usize>,
6063
}
6164

6265
impl Default for QModelIndex {

crates/cxx-qt-lib/src/core/qvariant/mod.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,21 @@ pub struct QVariant {
5151
///
5252
/// Qt5 QVariant has one member, which contains three uints (but they are optimised to a size of 8) and a union
5353
/// Qt6 QVariant has one member, which contains three pointers and a union (pointer largest)
54+
_data: MaybeUninit<usize>,
55+
56+
#[cfg(qt_version_major = "5")]
57+
_type: MaybeUninit<u32>,
58+
#[cfg(qt_version_major = "5")]
59+
_is_shared: MaybeUninit<u32>,
5460
#[cfg(qt_version_major = "5")]
55-
_space: MaybeUninit<[usize; 2]>,
61+
_is_null: MaybeUninit<u32>,
62+
63+
#[cfg(qt_version_major = "6")]
64+
_is_shared: MaybeUninit<usize>,
65+
#[cfg(qt_version_major = "6")]
66+
_is_null: MaybeUninit<usize>,
5667
#[cfg(qt_version_major = "6")]
57-
_space: MaybeUninit<[usize; 4]>,
68+
_packed_type: MaybeUninit<usize>,
5869
}
5970

6071
impl Clone for QVariant {

crates/cxx-qt-lib/src/core/qvariant/qvariant.cpp

+13-2
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,24 @@
2424
// https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/kernel/qvariant.h?h=v6.2.4#n540
2525
// https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/kernel/qvariant.h?h=v6.2.4#n474
2626
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
27+
28+
#if (QT_POINTER_SIZE == 4)
29+
// 32bit is 3 * 32bit ptr (12) + union with double (8) + 4 bytes padding
30+
// alignment is 8 byte on 32bit systems as well due to the double
31+
assert_alignment_and_size(QVariant,
32+
alignof(double),
33+
(sizeof(::std::size_t) * 3) + sizeof(double) + 4);
34+
#else
35+
// 64bit is 3 * 64ptr ptr (16) + union with double (8)
2736
assert_alignment_and_size(QVariant,
2837
alignof(::std::size_t),
29-
sizeof(::std::size_t[4]));
38+
(sizeof(::std::size_t) * 3) + sizeof(double));
39+
#endif
40+
3041
#else
3142
assert_alignment_and_size(QVariant,
3243
alignof(::std::size_t),
33-
sizeof(::std::size_t[2]));
44+
(sizeof(::std::uint32_t) * 3) + sizeof(::std::size_t)));
3445
#endif
3546

3647
static_assert(!::std::is_trivially_copy_assignable<QVariant>::value);

crates/cxx-qt-lib/src/gui/qcolor.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
// https://code.qt.io/cgit/qt/qtbase.git/tree/src/gui/painting/qcolor.h?h=v6.2.4#n237
1919
assert_alignment_and_size(QColor,
2020
alignof(::std::size_t),
21-
sizeof(::std::size_t[2]));
21+
sizeof(::std::size_t) +
22+
(sizeof(::std::uint16_t) * 5) +
23+
2 /* compiler padding */);
2224

2325
// QColor still had copy & move constructors in Qt 5 but they were basically
2426
// trivial.

crates/cxx-qt-lib/src/gui/qcolor.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ mod ffi {
5858
#[derive(Clone)]
5959
#[repr(C)]
6060
pub struct QColor {
61-
_space: MaybeUninit<[usize; 2]>,
61+
_cspec: MaybeUninit<usize>,
62+
_ct: MaybeUninit<[u16; 5]>,
63+
_padding: MaybeUninit<u16>,
6264
}
6365

6466
impl QColor {

0 commit comments

Comments
 (0)