diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2023-10-05 16:58:33 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-10-06 19:41:52 +0000 |
commit | 3f8861dc42d20e8c67fe60dd6ea34dbe57aeb4fc (patch) | |
tree | b6e2d2fde3e1a7a93f89d0802cbb45d8198ce2ae /src/qml/memory/qv4mm_p.h | |
parent | d4bab563568a211bf05260fed1b80b4652b20507 (diff) |
qv4mm: Document and extend allocManaged overload set
Add some helper overloads to centralize the sizeof computation.
Add a doc note about the various variants of allocManaged, including a
note why we even need the size parameter.
Change-Id: I4e0c485217e87c339a7433c306cb05d6614d30e1
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml/memory/qv4mm_p.h')
-rw-r--r-- | src/qml/memory/qv4mm_p.h | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/qml/memory/qv4mm_p.h b/src/qml/memory/qv4mm_p.h index 378b36369d..3a05bca536 100644 --- a/src/qml/memory/qv4mm_p.h +++ b/src/qml/memory/qv4mm_p.h @@ -117,6 +117,14 @@ public: constexpr static inline std::size_t align(std::size_t size) { return (size + Chunk::SlotSize - 1) & ~(Chunk::SlotSize - 1); } + /* NOTE: allocManaged comes in various overloads. If size is not passed explicitly + sizeof(ManagedType::Data) is used for size. However, there are quite a few cases + where we allocate more than sizeof(ManagedType::Data); that's generally the case + when the Object has a ValueArray member. + If no internal class pointer is provided, ManagedType::defaultInternalClass(engine) + will be used as the internal class. + */ + template<typename ManagedType> inline typename ManagedType::Data *allocManaged(std::size_t size, Heap::InternalClass *ic) { @@ -130,12 +138,24 @@ public: } template<typename ManagedType> + inline typename ManagedType::Data *allocManaged(Heap::InternalClass *ic) + { + return allocManaged<ManagedType>(sizeof(typename ManagedType::Data), ic); + } + + template<typename ManagedType> inline typename ManagedType::Data *allocManaged(std::size_t size, InternalClass *ic) { return allocManaged<ManagedType>(size, ic->d()); } template<typename ManagedType> + inline typename ManagedType::Data *allocManaged(InternalClass *ic) + { + return allocManaged<ManagedType>(sizeof(typename ManagedType::Data), ic); + } + + template<typename ManagedType> inline typename ManagedType::Data *allocManaged(std::size_t size) { Scope scope(engine); @@ -143,6 +163,15 @@ public: return allocManaged<ManagedType>(size, ic); } + template<typename ManagedType> + inline typename ManagedType::Data *allocManaged() + { + auto constexpr size = sizeof(typename ManagedType::Data); + Scope scope(engine); + Scoped<InternalClass> ic(scope, ManagedType::defaultInternalClass(engine)); + return allocManaged<ManagedType>(size, ic); + } + template <typename ObjectType> typename ObjectType::Data *allocateObject(Heap::InternalClass *ic) { @@ -208,7 +237,7 @@ public: typename ManagedType::Data *alloc(Args&&... args) { Scope scope(engine); - Scoped<ManagedType> t(scope, allocManaged<ManagedType>(sizeof(typename ManagedType::Data))); + Scoped<ManagedType> t(scope, allocManaged<ManagedType>()); t->d_unchecked()->init(std::forward<Args>(args)...); return t->d(); } |