aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4value_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-01-09 22:02:40 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2015-01-12 11:04:32 +0100
commit431458b685fa9f7355f50d21a09ee9f93bcb42d5 (patch)
treee6cd799e7d8d56f39bb017f560e5bc32de1ab2bc /src/qml/jsruntime/qv4value_p.h
parent53e144ae8dec84f70870a5e315c3043b16b57d92 (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.h34
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; }