Encapsulate and protect all accesses to the vtable of Heap objects
[platform/upstream/qtdeclarative.git] / src / qml / memory / qv4heap_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtQml module of the Qt Toolkit.
7 **
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.
16 **
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.
25 **
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.
29 **
30 ** $QT_END_LICENSE$
31 **
32 ****************************************************************************/
33 #ifndef QV4HEAP_P_H
34 #define QV4HEAP_P_H
35
36 #include <QtCore/QString>
37 #include <private/qv4global_p.h>
38
39 QT_BEGIN_NAMESPACE
40
41 namespace QV4 {
42
43 struct VTable
44 {
45     const VTable * const parent;
46     uint isExecutionContext : 1;
47     uint isString : 1;
48     uint isObject : 1;
49     uint isFunctionObject : 1;
50     uint isErrorObject : 1;
51     uint isArrayData : 1;
52     uint unused : 18;
53     uint type : 8;
54     const char *className;
55     void (*destroy)(Heap::Base *);
56     void (*markObjects)(Heap::Base *, ExecutionEngine *e);
57     bool (*isEqualTo)(Managed *m, Managed *other);
58 };
59
60 namespace Heap {
61
62 struct Q_QML_EXPORT Base {
63     quintptr mm_data; // vtable and markbit
64
65     inline ReturnedValue asReturnedValue() const;
66     inline void mark(QV4::ExecutionEngine *engine);
67
68     enum {
69         MarkBit = 0x1,
70         NotInUse = 0x2,
71         PointerMask = ~0x3
72     };
73
74     void setVtable(const VTable *v) {
75         Q_ASSERT(!(mm_data & MarkBit));
76         mm_data = reinterpret_cast<quintptr>(v);
77     }
78     VTable *vtable() const {
79         return reinterpret_cast<VTable *>(mm_data & PointerMask);
80     }
81     inline bool isMarked() const {
82         return mm_data & MarkBit;
83     }
84     inline void setMarkBit() {
85         mm_data |= MarkBit;
86     }
87     inline void clearMarkBit() {
88         mm_data &= ~MarkBit;
89     }
90
91     inline bool inUse() const {
92         return !(mm_data & NotInUse);
93     }
94
95     Base *nextFree() {
96         return reinterpret_cast<Base *>(mm_data & PointerMask);
97     }
98     void setNextFree(Base *m) {
99         mm_data = (reinterpret_cast<quintptr>(m) | NotInUse);
100     }
101
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 *) {}
105 };
106
107 template <typename T>
108 struct Pointer {
109     Pointer() {}
110     Pointer(T *t) : ptr(t) {}
111
112     T *operator->() const { return ptr; }
113     operator T *() const { return ptr; }
114
115     Pointer &operator =(T *t) { ptr = t; return *this; }
116
117     template <typename Type>
118     Type *cast() { return static_cast<Type *>(ptr); }
119
120     T *ptr;
121 };
122
123 }
124
125 }
126
127 QT_END_NAMESPACE
128
129 #endif