diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-01-04 10:20:34 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-01-19 10:13:58 +0000 |
commit | e1b166dd304ed3bed2d5ecb1404f253eddbf2d06 (patch) | |
tree | a39142a8d11e97a8241d3e3dc2ac264f9ecd79dc /src/qml/memory/qv4heap_p.h | |
parent | 1fe206712755b0d99f91bc7897f0a705ec583f2d (diff) |
Disentangle include dependencies around the write barrier
The write barrier header should have minimal dependencies.
Change-Id: I071718c2fafe5020d1093ca3b363844f7a9b7b35
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/memory/qv4heap_p.h')
-rw-r--r-- | src/qml/memory/qv4heap_p.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/qml/memory/qv4heap_p.h b/src/qml/memory/qv4heap_p.h index 7bc841b21d..53933cd090 100644 --- a/src/qml/memory/qv4heap_p.h +++ b/src/qml/memory/qv4heap_p.h @@ -53,6 +53,7 @@ #include <QtCore/QString> #include <private/qv4global_p.h> #include <private/qv4mmdefs_p.h> +#include <private/qv4writebarrier_p.h> #include <private/qv4internalclass_p.h> #include <QSharedPointer> @@ -195,6 +196,39 @@ void Heap::Base::mark(QV4::MarkStack *markStack) } } +namespace Heap { + +template <typename T, size_t o> +struct Pointer { + static Q_CONSTEXPR size_t offset = o; + T operator->() const { return get(); } + operator T () const { return get(); } + + Heap::Base *base() { + Heap::Base *base = reinterpret_cast<Heap::Base *>(this) - (offset/sizeof(Heap::Base)); + Q_ASSERT(base->inUse()); + return base; + } + + void set(EngineBase *e, T newVal) { + WriteBarrier::write(e, base(), &ptr, reinterpret_cast<Heap::Base *>(newVal)); + } + + T get() const { return reinterpret_cast<T>(ptr); } + + template <typename Type> + Type *cast() { return static_cast<Type *>(ptr); } + + Heap::Base *heapObject() const { return ptr; } + +private: + Heap::Base *ptr; +}; +typedef Pointer<char *, 0> V4PointerCheck; +Q_STATIC_ASSERT(std::is_trivial< V4PointerCheck >::value); + +} + #ifdef QT_NO_QOBJECT template <class T> struct QQmlQPointer { |