diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-08-07 13:56:31 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-08-10 07:24:32 +0000 |
commit | 415f55d1400f6abdd3a8e3edaf5ff208ecdad216 (patch) | |
tree | 88e75e6c2b5d3b757ac59b644f71410158201354 /src/qml/memory/qv4heap_p.h | |
parent | f21e8c641af6b2d10f0d7e7e0fc6a755dab3673c (diff) |
Encapsulate and protect all accesses to the vtable of Heap objects
This is required, so we can safely access the vtable even while
we're marking objects during GC.
Change-Id: I34f56b61b4bca0d0742faf607eb5ab8b2c30685e
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/memory/qv4heap_p.h')
-rw-r--r-- | src/qml/memory/qv4heap_p.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/qml/memory/qv4heap_p.h b/src/qml/memory/qv4heap_p.h index 606fd47cbb..a93e4191b0 100644 --- a/src/qml/memory/qv4heap_p.h +++ b/src/qml/memory/qv4heap_p.h @@ -60,10 +60,7 @@ struct VTable namespace Heap { struct Q_QML_EXPORT Base { - union { - const VTable *vtable; - quintptr mm_data; - }; + quintptr mm_data; // vtable and markbit inline ReturnedValue asReturnedValue() const; inline void mark(QV4::ExecutionEngine *engine); @@ -74,7 +71,11 @@ struct Q_QML_EXPORT Base { PointerMask = ~0x3 }; - VTable *gcGetVtable() const { + void setVtable(const VTable *v) { + Q_ASSERT(!(mm_data & MarkBit)); + mm_data = reinterpret_cast<quintptr>(v); + } + VTable *vtable() const { return reinterpret_cast<VTable *>(mm_data & PointerMask); } inline bool isMarked() const { |