1 /****************************************************************************
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
6 ** This file is part of the QtQml module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL21$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
32 ****************************************************************************/
36 #include <QtCore/QString>
37 #include <private/qv4global_p.h>
45 const VTable * const parent;
46 uint isExecutionContext : 1;
49 uint isFunctionObject : 1;
50 uint isErrorObject : 1;
54 const char *className;
55 void (*destroy)(Heap::Base *);
56 void (*markObjects)(Heap::Base *, ExecutionEngine *e);
57 bool (*isEqualTo)(Managed *m, Managed *other);
62 struct Q_QML_EXPORT Base {
63 quintptr mm_data; // vtable and markbit
65 inline ReturnedValue asReturnedValue() const;
66 inline void mark(QV4::ExecutionEngine *engine);
74 void setVtable(const VTable *v) {
75 Q_ASSERT(!(mm_data & MarkBit));
76 mm_data = reinterpret_cast<quintptr>(v);
78 VTable *vtable() const {
79 return reinterpret_cast<VTable *>(mm_data & PointerMask);
81 inline bool isMarked() const {
82 return mm_data & MarkBit;
84 inline void setMarkBit() {
87 inline void clearMarkBit() {
91 inline bool inUse() const {
92 return !(mm_data & NotInUse);
96 return reinterpret_cast<Base *>(mm_data & PointerMask);
98 void setNextFree(Base *m) {
99 mm_data = (reinterpret_cast<quintptr>(m) | NotInUse);
102 void *operator new(size_t, Managed *m) { return m; }
103 void *operator new(size_t, Heap::Base *m) { return m; }
104 void operator delete(void *, Heap::Base *) {}
107 template <typename T>
110 Pointer(T *t) : ptr(t) {}
112 T *operator->() const { return ptr; }
113 operator T *() const { return ptr; }
115 Pointer &operator =(T *t) { ptr = t; return *this; }
117 template <typename Type>
118 Type *cast() { return static_cast<Type *>(ptr); }