1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #ifndef QDECLARATIVEPROPERTYCACHE_P_H
43 #define QDECLARATIVEPROPERTYCACHE_P_H
49 // This file is not part of the Qt API. It exists purely as an
50 // implementation detail. This header file may change from version to
51 // version without notice, or even be removed.
56 #include "private/qdeclarativerefcount_p.h"
57 #include "private/qdeclarativecleanup_p.h"
58 #include "private/qdeclarativenotifier_p.h"
60 #include "private/qhashedstring_p.h"
61 #include <QtCore/qvector.h>
63 #include <QtScript/private/qscriptdeclarativeclass_p.h>
66 class QDeclarativeEngine;
69 class QV8QObjectWrapper;
71 class Q_AUTOTEST_EXPORT QDeclarativePropertyCache : public QDeclarativeRefCount, public QDeclarativeCleanup
74 QDeclarativePropertyCache(QDeclarativeEngine *);
75 QDeclarativePropertyCache(QDeclarativeEngine *, const QMetaObject *);
76 virtual ~QDeclarativePropertyCache();
80 inline bool operator==(const Data &);
85 // Can apply to all properties, except IsFunction
86 IsConstant = 0x00000001, // Has CONST flag
87 IsWritable = 0x00000002, // Has WRITE function
88 IsResettable = 0x00000004, // Has RESET function
89 IsAlias = 0x00000008, // Is a QML alias to another property
90 IsFinal = 0x00000010, // Has FINAL flag
91 IsDirect = 0x00000020, // Exists on a C++ QMetaObject
93 // These are mutualy exclusive
94 IsFunction = 0x00000040, // Is an invokable
95 IsQObjectDerived = 0x00000080, // Property type is a QObject* derived type
96 IsEnumType = 0x00000100, // Property type is an enum
97 IsQList = 0x00000200, // Property type is a QML list
98 IsQmlBinding = 0x00000400, // Property type is a QDeclarativeBinding*
99 IsQScriptValue = 0x00000800, // Property type is a QScriptValue
100 IsV8Handle = 0x00001000, // Property type is a QDeclarativeV8Handle
102 // Apply only to IsFunctions
103 IsVMEFunction = 0x00002000, // Function was added by QML
104 HasArguments = 0x00004000, // Function takes arguments
105 IsSignal = 0x00008000, // Function is a signal
106 IsVMESignal = 0x00010000, // Signal was added by QML
107 IsV8Function = 0x00020000 // Function takes QDeclarativeV8Function* args
109 Q_DECLARE_FLAGS(Flags, Flag)
111 bool isValid() const { return coreIndex != -1; }
112 bool isConstant() const { return flags & IsConstant; }
113 bool isWritable() const { return flags & IsWritable; }
114 bool isResettable() const { return flags & IsResettable; }
115 bool isAlias() const { return flags & IsAlias; }
116 bool isFinal() const { return flags & IsFinal; }
117 bool isDirect() const { return flags & IsDirect; }
118 bool isFunction() const { return flags & IsFunction; }
119 bool isQObject() const { return flags & IsQObjectDerived; }
120 bool isEnum() const { return flags & IsEnumType; }
121 bool isQList() const { return flags & IsQList; }
122 bool isQmlBinding() const { return flags & IsQmlBinding; }
123 bool isQScriptValue() const { return flags & IsQScriptValue; }
124 bool isV8Handle() const { return flags & IsV8Handle; }
130 int notifyIndex; // When !IsFunction
131 int relatedIndex; // When IsFunction
133 uint overrideIndexIsProperty : 1;
134 int overrideIndex : 31;
136 int metaObjectOffset;
138 static Flags flagsForProperty(const QMetaProperty &, QDeclarativeEngine *engine = 0);
139 void load(const QMetaProperty &, QDeclarativeEngine *engine = 0);
140 void load(const QMetaMethod &);
141 QString name(QObject *);
142 QString name(const QMetaObject *);
145 struct ValueTypeData {
146 inline ValueTypeData();
147 inline bool operator==(const ValueTypeData &);
148 Data::Flags flags; // flags of the access property on the value type proxy object
149 int valueTypeCoreIdx; // The prop index of the access property on the value type proxy object
150 int valueTypePropType; // The QVariant::Type of access property on the value type proxy object
153 void update(QDeclarativeEngine *, const QMetaObject *);
155 QDeclarativePropertyCache *copy() const;
156 void append(QDeclarativeEngine *, const QMetaObject *, Data::Flag propertyFlags = Data::NoFlags,
157 Data::Flag methodFlags = Data::NoFlags, Data::Flag signalFlags = Data::NoFlags);
158 void append(QDeclarativeEngine *, const QMetaObject *, int revision, Data::Flag propertyFlags = Data::NoFlags,
159 Data::Flag methodFlags = Data::NoFlags, Data::Flag signalFlags = Data::NoFlags);
161 static Data create(const QMetaObject *, const QString &);
163 inline Data *property(const QHashedV8String &) const;
164 Data *property(const QString &) const;
165 Data *property(int) const;
166 Data *method(int) const;
167 QStringList propertyNames() const;
169 inline Data *overrideData(Data *) const;
170 inline bool isAllowedInRevision(Data *) const;
172 inline QDeclarativeEngine *qmlEngine() const;
173 static Data *property(QDeclarativeEngine *, QObject *, const QString &, Data &);
174 static Data *property(QDeclarativeEngine *, QObject *, const QHashedV8String &, Data &);
176 static bool isDynamicMetaObject(const QMetaObject *);
178 virtual void clear();
181 friend class QDeclarativeEnginePrivate;
182 friend class QV8QObjectWrapper;
184 // Implemented in v8/qv8qobjectwrapper.cpp
185 v8::Local<v8::Object> newQObject(QObject *, QV8Engine *);
187 // XXX is this worth it anymore?
188 struct RData : public Data, public QDeclarativeRefCount {
191 typedef QVector<RData *> IndexCache;
192 typedef QStringHash<RData *> StringCache;
193 typedef QVector<int> AllowedRevisionCache;
195 void updateRecur(QDeclarativeEngine *, const QMetaObject *);
197 QDeclarativeEngine *engine;
198 IndexCache indexCache;
199 IndexCache methodIndexCache;
200 StringCache stringCache;
201 AllowedRevisionCache allowedRevisionCache;
202 v8::Persistent<v8::Function> constructor;
204 Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativePropertyCache::Data::Flags);
206 QDeclarativePropertyCache::Data::Data()
207 : flags(0), propType(0), coreIndex(-1), notifyIndex(-1), overrideIndexIsProperty(false), overrideIndex(-1),
208 revision(0), metaObjectOffset(-1)
212 bool QDeclarativePropertyCache::Data::operator==(const QDeclarativePropertyCache::Data &other)
214 return flags == other.flags &&
215 propType == other.propType &&
216 coreIndex == other.coreIndex &&
217 notifyIndex == other.notifyIndex &&
218 revision == other.revision;
221 QDeclarativePropertyCache::Data *
222 QDeclarativePropertyCache::overrideData(Data *data) const
224 if (data->overrideIndex < 0)
227 if (data->overrideIndexIsProperty)
228 return indexCache.at(data->overrideIndex);
230 return methodIndexCache.at(data->overrideIndex);
233 QDeclarativePropertyCache::ValueTypeData::ValueTypeData()
234 : flags(QDeclarativePropertyCache::Data::NoFlags), valueTypeCoreIdx(-1), valueTypePropType(0)
238 bool QDeclarativePropertyCache::ValueTypeData::operator==(const ValueTypeData &o)
240 return flags == o.flags &&
241 valueTypeCoreIdx == o.valueTypeCoreIdx &&
242 valueTypePropType == o.valueTypePropType;
245 bool QDeclarativePropertyCache::isAllowedInRevision(Data *data) const
247 return (data->metaObjectOffset == -1 && data->revision == 0) ||
248 (allowedRevisionCache[data->metaObjectOffset] >= data->revision);
251 QDeclarativeEngine *QDeclarativePropertyCache::qmlEngine() const
256 QDeclarativePropertyCache::Data *QDeclarativePropertyCache::property(const QHashedV8String &str) const
258 QDeclarativePropertyCache::RData **rv = stringCache.value(str);
264 #endif // QDECLARATIVEPROPERTYCACHE_P_H