aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/memory
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-01-30 22:22:00 +0100
committerLars Knoll <lars.knoll@qt.io>2017-03-09 08:58:28 +0000
commit8b3cbc4403e3eac286613691c11aa1ded588da59 (patch)
tree48bc8592a69ce2585639f4e83258bb776c4f32ab /src/qml/memory
parent2fbb5c93c765ea53c3bd5f30b8bf769ccc88874a (diff)
Refactor how we define Heap objects
Declare the type of Heap object in the Member() macro, instead of deducing it from templates. This allows us to encode the offset of the member in the second template argument to Pointer<> in a second step. Change-Id: I2cfb73785749d3fb991689b4e0554a72b3e5e13f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/memory')
-rw-r--r--src/qml/memory/qv4heap_p.h13
-rw-r--r--src/qml/memory/qv4mm.cpp8
-rw-r--r--src/qml/memory/qv4mmdefs_p.h29
3 files changed, 19 insertions, 31 deletions
diff --git a/src/qml/memory/qv4heap_p.h b/src/qml/memory/qv4heap_p.h
index 28d39b7fb7..febe4e6446 100644
--- a/src/qml/memory/qv4heap_p.h
+++ b/src/qml/memory/qv4heap_p.h
@@ -164,19 +164,20 @@ struct Q_QML_EXPORT Base {
};
V4_ASSERT_IS_TRIVIAL(Base)
-template <typename T>
+template <typename T, size_t>
struct Pointer {
- T *operator->() const { return ptr; }
- operator T *() const { return ptr; }
+ T operator->() const { return ptr; }
+ operator T () const { return ptr; }
- Pointer &operator =(T *t) { ptr = t; return *this; }
+ Pointer &operator =(T t) { ptr = t; return *this; }
template <typename Type>
Type *cast() { return static_cast<Type *>(ptr); }
- T *ptr;
+ T ptr;
};
-V4_ASSERT_IS_TRIVIAL(Pointer<void>)
+typedef Pointer<char *, 0> V4PointerCheck;
+V4_ASSERT_IS_TRIVIAL(V4PointerCheck)
}
diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp
index 259f221a86..89cf9caf9e 100644
--- a/src/qml/memory/qv4mm.cpp
+++ b/src/qml/memory/qv4mm.cpp
@@ -762,15 +762,15 @@ void MemoryManager::drainMarkStack(Value *markBase)
break;
case Mark_Pointer: {
// qDebug() << "marking pointer at " << mem;
- Heap::Pointer<Heap::Base> *p = reinterpret_cast<Heap::Pointer<Heap::Base> *>(mem);
- if (*p)
- (*p)->mark(engine);
+ Heap::Base *p = reinterpret_cast<Heap::Base *>(mem);
+ if (p)
+ p->mark(engine);
break;
}
case Mark_ValueArray: {
Q_ASSERT(m == Mark_ValueArray);
// qDebug() << "marking Value Array at offset" << hex << (mem - reinterpret_cast<void **>(h));
- ValueArray *a = reinterpret_cast<ValueArray *>(mem);
+ ValueArray<0> *a = reinterpret_cast<ValueArray<0> *>(mem);
Value *v = a->v;
const Value *end = v + a->alloc;
while (v < end) {
diff --git a/src/qml/memory/qv4mmdefs_p.h b/src/qml/memory/qv4mmdefs_p.h
index a987c3a200..e4d5ce9da2 100644
--- a/src/qml/memory/qv4mmdefs_p.h
+++ b/src/qml/memory/qv4mmdefs_p.h
@@ -265,27 +265,16 @@ enum MarkFlags {
Mark_ValueArray = 3
};
-template<typename T>
-struct MarkFlagsForType {
- static const quint64 markFlags = Mark_NoMark;
-};
-template<typename T>
-struct MarkFlagsForType<Heap::Pointer<T>> {
- static const quint64 markFlags = Mark_Pointer;
-};
-template<>
-struct MarkFlagsForType<Value> {
- static const quint64 markFlags = Mark_Value;
-};
-template<>
-struct MarkFlagsForType<ValueArray> {
- static const quint64 markFlags = Mark_ValueArray;
-};
+#define HEAP_OBJECT_MEMBER_EXPANSION(c, gcType, type, name) \
+ HEAP_OBJECT_MEMBER_EXPANSION_##gcType(c, type, name)
-#define HEAP_OBJECT_MEMBER_EXPANSION(c, type, name) type name;
+#define HEAP_OBJECT_MEMBER_EXPANSION_Pointer(c, type, name) Pointer<type, 0> name;
+#define HEAP_OBJECT_MEMBER_EXPANSION_NoMark(c, type, name) type name;
+#define HEAP_OBJECT_MEMBER_EXPANSION_Value(c, type, name) type name;
+#define HEAP_OBJECT_MEMBER_EXPANSION_ValueArray(c, type, name) ValueArray<0> name;
-#define HEAP_OBJECT_MARK_EXPANSION(class, type, name) \
- (MarkFlagsForType<decltype(class::name)>::markFlags << (offsetof(class, name) >> 2)) |
+#define HEAP_OBJECT_MARK_EXPANSION(class, gcType, type, name) \
+ (Mark_##gcType << (offsetof(class, name) >> 2)) |
#define DECLARE_HEAP_OBJECT(name, base) \
struct name##Data { \
@@ -299,8 +288,6 @@ struct name : base, name##Data
#define DECLARE_MARK_TABLE(class) static Q_CONSTEXPR quint64 markTable = class##_markTable
-
-
}
QT_END_NAMESPACE