17#include <private/qv4global_p.h>
18#include <private/qv4runtimeapi_p.h>
19#include <QtCore/qalgorithms.h>
20#include <QtCore/qmath.h>
65#if QT_POINTER_SIZE == 8
171 T *
as() {
return static_cast<T *
>(
reinterpret_cast<Heap::Base *
>(
this)); }
179 std::ptrdiff_t
index =
this -
c->realBase();
184 std::ptrdiff_t
index =
this -
c->realBase();
191 size_t index =
this -
c->realBase();
203 std::ptrdiff_t
index =
this -
c->realBase();
215 return reinterpret_cast<HeapItem *
>(
this);
237 if (m_top < m_softLimit)
243 if (m_drainRecursion * segmentSize <=
quintptr(m_top - m_softLimit)) {
247 }
else if (m_top == m_hardLimit) {
248 qFatal(
"GC mark stack overrun. Either simplify your application or"
249 "increase QV4_GC_MAX_STACK_SIZE");
259 Heap::Base **m_top =
nullptr;
260 Heap::Base **m_base =
nullptr;
261 Heap::Base **m_softLimit =
nullptr;
262 Heap::Base **m_hardLimit =
nullptr;
263 ExecutionEngine *m_engine =
nullptr;
270#define HEAP_OBJECT_OFFSET_MEMBER_EXPANSION(c, gcType, type, name) \
271 HEAP_OBJECT_OFFSET_MEMBER_EXPANSION_##gcType(c, type, name)
273#define HEAP_OBJECT_OFFSET_MEMBER_EXPANSION_Pointer(c, type, name) Pointer<type, 0> name;
274#define HEAP_OBJECT_OFFSET_MEMBER_EXPANSION_NoMark(c, type, name) type name;
275#define HEAP_OBJECT_OFFSET_MEMBER_EXPANSION_HeapValue(c, type, name) HeapValue<0> name;
276#define HEAP_OBJECT_OFFSET_MEMBER_EXPANSION_ValueArray(c, type, name) type<0> name;
278#define HEAP_OBJECT_MEMBER_EXPANSION(c, gcType, type, name) \
279 HEAP_OBJECT_MEMBER_EXPANSION_##gcType(c, type, name)
281#define HEAP_OBJECT_MEMBER_EXPANSION_Pointer(c, type, name) \
282 Pointer<type, offsetof(c##OffsetStruct, name) + baseOffset> name;
283#define HEAP_OBJECT_MEMBER_EXPANSION_NoMark(c, type, name) \
285#define HEAP_OBJECT_MEMBER_EXPANSION_HeapValue(c, type, name) \
286 HeapValue<offsetof(c##OffsetStruct, name) + baseOffset> name;
287#define HEAP_OBJECT_MEMBER_EXPANSION_ValueArray(c, type, name) \
288 type<offsetof(c##OffsetStruct, name) + baseOffset> name;
290#define HEAP_OBJECT_MARKOBJECTS_EXPANSION(c, gcType, type, name) \
291 HEAP_OBJECT_MARKOBJECTS_EXPANSION_##gcType(c, type, name)
292#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_Pointer(c, type, name) \
293 if (o->name) o->name.heapObject()->mark(stack);
294#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_NoMark(c, type, name)
295#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_HeapValue(c, type, name) \
297#define HEAP_OBJECT_MARKOBJECTS_EXPANSION_ValueArray(c, type, name) \
301#define DECLARE_HEAP_OBJECT_BASE(name, base) \
302 struct name##OffsetStruct { \
303 name##Members(name, HEAP_OBJECT_OFFSET_MEMBER_EXPANSION) \
305 struct name##SizeStruct : base, name##OffsetStruct {}; \
306 struct name##Data { \
307 typedef base SuperClass; \
308 static constexpr size_t baseOffset = sizeof(name##SizeStruct) - sizeof(name##OffsetStruct); \
309 name##Members(name, HEAP_OBJECT_MEMBER_EXPANSION) \
311 Q_STATIC_ASSERT(sizeof(name##SizeStruct) == sizeof(name##Data) + name##Data::baseOffset); \
313#define DECLARE_HEAP_OBJECT(name, base) \
314 DECLARE_HEAP_OBJECT_BASE(name, base) \
315 struct name : base, name##Data
316#define DECLARE_EXPORTED_HEAP_OBJECT(name, base) \
317 DECLARE_HEAP_OBJECT_BASE(name, base) \
318 struct Q_QML_EXPORT name : base, name##Data
320#define DECLARE_MARKOBJECTS(class) \
321 static void markObjects(Heap::Base *b, MarkStack *stack) { \
322 class *o = static_cast<class *>(b); \
323 class##Data::SuperClass::markObjects(o, stack); \
324 class##Members(class, HEAP_OBJECT_MARKOBJECTS_EXPANSION) \
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
void(* ClassDestroyStatsCallback)(const char *)
constexpr uint qCountTrailingZeroBits(quint32 v) noexcept
Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR uint qPopulationCount(quint32 v) noexcept
#define Q_STATIC_ASSERT(Condition)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
constexpr quint32 qNextPowerOfTwo(quint32 v)
constexpr const T & qMin(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLsizei GLfixed GLfixed GLfixed GLfixed const GLubyte * bitmap
unsigned long long quint64
quintptr objectBitmap[BitmapSize/sizeof(quintptr)]
static void setBit(quintptr *bitmap, size_t index)
char data[ChunkSize - HeaderSize]
static uint lowestNonZeroBit(quintptr *bitmap)
static bool hasNonZeroBit(quintptr *bitmap)
static bool testBit(quintptr *bitmap, size_t index)
static Q_ALWAYS_INLINE quintptr bitForIndex(size_t index)
void freeAll(ExecutionEngine *engine)
quintptr extendsBitmap[BitmapSize/sizeof(quintptr)]
void sortIntoBins(HeapItem **bins, uint nBins)
static Q_ALWAYS_INLINE size_t bitmapIndex(size_t index)
static void setBits(quintptr *bitmap, size_t index, size_t nBits)
quintptr blackBitmap[BitmapSize/sizeof(quintptr)]
static void clearBit(quintptr *bitmap, size_t index)
bool sweep(ClassDestroyStatsCallback classCountPtr)
quint64 payload[Chunk::SlotSize/sizeof(quint64)]
struct QV4::HeapItem::@641::@645 freeData
void setAllocatedSlots(size_t nSlots)
ExecutionEngine * engine() const