diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-01-09 22:02:40 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2015-01-12 11:04:32 +0100 |
commit | 431458b685fa9f7355f50d21a09ee9f93bcb42d5 (patch) | |
tree | e6cd799e7d8d56f39bb017f560e5bc32de1ab2bc /src/qml/jsruntime/qv4value_p.h | |
parent | 53e144ae8dec84f70870a5e315c3043b16b57d92 (diff) |
Fold the markBit into the internalClass pointer
Change-Id: I79f9286275f833dd01a3193042976d1f86ed5019
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4value_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4value_p.h | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/qml/jsruntime/qv4value_p.h b/src/qml/jsruntime/qv4value_p.h index 12e81d4f30..31db8a21c5 100644 --- a/src/qml/jsruntime/qv4value_p.h +++ b/src/qml/jsruntime/qv4value_p.h @@ -50,15 +50,18 @@ struct Q_QML_EXPORT Base { Base() {} Base(InternalClass *internal) : internalClass(internal) - , markBit(0) , extensible(1) { + Q_ASSERT(inUse() && !isMarked()); // #### // Q_ASSERT(internal && internal->vtable); } - InternalClass *internalClass; + union { + InternalClass *internalClass; + quintptr mm_data; + }; struct { - uchar markBit : 1; + uchar _markBit : 1; uchar _inUse : 1; uchar extensible : 1; // used by Object uchar _needsActivation : 1; // used by FunctionObject @@ -76,23 +79,34 @@ struct Q_QML_EXPORT Base { inline ReturnedValue asReturnedValue() const; inline void mark(QV4::ExecutionEngine *engine); - inline bool isMarked() const { - return markBit; - } - enum { + MarkBit = 0x1, NotInUse = 0x2, PointerMask = ~0x3 }; + + InternalClass *gcGetInternalClass() const { + return reinterpret_cast<InternalClass *>(mm_data & PointerMask); + } + inline bool isMarked() const { + return mm_data & MarkBit; + } + inline void setMarkBit() { + mm_data |= MarkBit; + } + inline void clearMarkBit() { + mm_data &= ~MarkBit; + } + inline bool inUse() const { - return !((quintptr)internalClass & NotInUse); + return !(mm_data & NotInUse); } Base *nextFree() { - return reinterpret_cast<Base *>(reinterpret_cast<quintptr>(internalClass) & PointerMask); + return reinterpret_cast<Base *>(mm_data & PointerMask); } void setNextFree(Base *m) { - internalClass = reinterpret_cast<InternalClass *>(reinterpret_cast<quintptr>(m) | NotInUse); + mm_data = (reinterpret_cast<quintptr>(m) | NotInUse); } void *operator new(size_t, Managed *m) { return m; } |