diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-11-02 16:02:10 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2017-11-14 21:45:42 +0000 |
commit | 002fdc48d43e4fd67921e0cd46c28d28aee06848 (patch) | |
tree | 08fdc81dc91153649d8b6c6514ed3b49ad970064 /src/qml/memory/qv4mmdefs_p.h | |
parent | 010197a42150ee73a17cb53fbe397a6c55b2d342 (diff) |
Bring back markObjects(), this time generated
Doing the marking of objects in a function instead of
using the table seems to be somewhat faster.
Change-Id: I9ec00cc0264f9a15c69b285db493bee31d99bf96
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/memory/qv4mmdefs_p.h')
-rw-r--r-- | src/qml/memory/qv4mmdefs_p.h | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/src/qml/memory/qv4mmdefs_p.h b/src/qml/memory/qv4mmdefs_p.h index 328797fb5e..6d911e69f6 100644 --- a/src/qml/memory/qv4mmdefs_p.h +++ b/src/qml/memory/qv4mmdefs_p.h @@ -287,32 +287,8 @@ struct MarkStack { }; -// Some helper classes and macros to automate the generation of our -// tables used for marking objects - -enum MarkFlags { - Mark_NoMark = 0, - Mark_Value = 1, - Mark_Pointer = 2, - Mark_ValueArray = 3 -}; - -template <typename T> -struct MarkFlagEvaluator { - static Q_CONSTEXPR quint64 value = 0; -}; -template <typename T, size_t o> -struct MarkFlagEvaluator<Heap::Pointer<T, o>> { - static Q_CONSTEXPR quint64 value = static_cast<quint64>(Mark_Pointer) << (2*o / sizeof(quintptr)); -}; -template <size_t o> -struct MarkFlagEvaluator<ValueArray<o>> { - static Q_CONSTEXPR quint64 value = static_cast<quint64>(Mark_ValueArray) << (2*o / sizeof(quintptr)); -}; -template <size_t o> -struct MarkFlagEvaluator<HeapValue<o>> { - static Q_CONSTEXPR quint64 value = static_cast<quint64>(Mark_Value) << (2 *o / sizeof(quintptr)); -}; +// Some helper to automate the generation of our +// functions used for marking objects #define HEAP_OBJECT_OFFSET_MEMBER_EXPANSION(c, gcType, type, name) \ HEAP_OBJECT_OFFSET_MEMBER_EXPANSION_##gcType(c, type, name) @@ -334,25 +310,42 @@ struct MarkFlagEvaluator<HeapValue<o>> { #define HEAP_OBJECT_MEMBER_EXPANSION_ValueArray(c, type, name) \ type<offsetof(c##OffsetStruct, name) + baseOffset> name; -#define HEAP_OBJECT_MARK_EXPANSION(class, gcType, type, name) \ - MarkFlagEvaluator<decltype(class::name)>::value | +#define HEAP_OBJECT_MARKOBJECTS_EXPANSION(c, gcType, type, name) \ + HEAP_OBJECT_MARKOBJECTS_EXPANSION_##gcType(c, type, name) +#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_Pointer(c, type, name) \ + if (o->name) o->name.heapObject()->mark(stack); +#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_NoMark(c, type, name) +#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_HeapValue(c, type, name) \ + o->name.mark(stack); +#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_ValueArray(c, type, name) \ + o->name.mark(stack); -#define DECLARE_HEAP_OBJECT(name, base) \ + +#define DECLARE_HEAP_OBJECT_BASE(name, base) \ struct name##OffsetStruct { \ name##Members(name, HEAP_OBJECT_OFFSET_MEMBER_EXPANSION) \ }; \ struct name##SizeStruct : base, name##OffsetStruct {}; \ struct name##Data { \ + typedef base SuperClass; \ static Q_CONSTEXPR size_t baseOffset = sizeof(name##SizeStruct) - sizeof(name##OffsetStruct); \ name##Members(name, HEAP_OBJECT_MEMBER_EXPANSION) \ }; \ Q_STATIC_ASSERT(sizeof(name##SizeStruct) == sizeof(name##Data) + name##Data::baseOffset); \ -static Q_CONSTEXPR quint64 name##_markTable = \ - (name##Members(name##Data, HEAP_OBJECT_MARK_EXPANSION) 0) | QV4::Heap::base::markTable; \ - \ -struct name : base, name##Data -#define DECLARE_MARK_TABLE(class) static Q_CONSTEXPR quint64 markTable = class##_markTable +#define DECLARE_HEAP_OBJECT(name, base) \ +DECLARE_HEAP_OBJECT_BASE(name, base) \ +struct name : base, name##Data +#define DECLARE_EXPORTED_HEAP_OBJECT(name, base) \ +DECLARE_HEAP_OBJECT_BASE(name, base) \ +struct Q_QML_EXPORT name : base, name##Data + +#define DECLARE_MARKOBJECTS(class) \ + static void markObjects(Heap::Base *b, MarkStack *stack) { \ + class *o = static_cast<class *>(b); \ + class##Data::SuperClass::markObjects(o, stack); \ + class##Members(class, HEAP_OBJECT_MARKOBJECTS_EXPANSION) \ + } } |