diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2017-11-21 12:29:40 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-11-21 12:29:40 +0100 |
commit | d373d5e7d70e968cfba8957596ed6fe4f46990c8 (patch) | |
tree | c52bf2b0fbbfdb13d644b4050aa7a931ef4b7109 /src/qml/memory/qv4mmdefs_p.h | |
parent | 9880acb424fd814501ba5fc4ae1caa989e23fafa (diff) | |
parent | 9af8a47746b69b6040fc149c1d24602a1e25b08f (diff) |
Merge remote-tracking branch 'origin/wip/new-backend' into dev
Conflicts:
src/qml/compiler/qv4isel_moth.cpp
src/qml/compiler/qv4jsir_p.h
src/qml/jsruntime/qv4engine_p.h
src/qml/jsruntime/qv4vme_moth.cpp
tests/auto/qml/qml.pro
Change-Id: Ia7b6ec24c7fcbcbb1786d9e798d2df294020ae37
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) \ + } } |