Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativepropertycache.cpp
index bd3bc33..4418ffa 100644 (file)
@@ -1,8 +1,7 @@
 /****************************************************************************
 **
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
 **
 ** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
@@ -35,6 +34,7 @@
 **
 **
 **
+**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -146,6 +146,9 @@ void QDeclarativePropertyData::lazyLoad(const QMetaProperty &p, QDeclarativeEngi
     if (type == QMetaType::QObjectStar || type == QMetaType::QWidgetStar) {
         propType = type;
         flags |= QDeclarativePropertyData::IsQObjectDerived;
+    } else if (type == QMetaType::QVariant) {
+        propType = type;
+        flags |= QDeclarativePropertyData::IsQVariant;
     } else if (type == QVariant::UserType || type == -1) {
         propTypeName = p.typeName();
         flags |= QDeclarativePropertyData::NotFullyResolved;
@@ -157,8 +160,6 @@ void QDeclarativePropertyData::lazyLoad(const QMetaProperty &p, QDeclarativeEngi
 void QDeclarativePropertyData::load(const QMetaProperty &p, QDeclarativeEngine *engine)
 {
     propType = p.userType();
-    if (QVariant::Type(propType) == QVariant::LastType)
-        propType = QMetaType::QVariant;
     coreIndex = p.propertyIndex();
     notifyIndex = p.notifySignalIndex();
     flags = fastFlagsForProperty(p) | flagsForPropertyType(propType, engine);
@@ -254,7 +255,7 @@ QDeclarativePropertyCache::~QDeclarativePropertyCache()
     QDeclarativePropertyCacheMethodArguments *args = argumentsCache;
     while (args) {
         QDeclarativePropertyCacheMethodArguments *next = args->next;
-        qFree(args);
+        free(args);
         args = next;
     }
 
@@ -280,7 +281,7 @@ void QDeclarativePropertyCache::clear()
     engine = 0;
 }
 
-QDeclarativePropertyCache *QDeclarativePropertyCache::copy(int reserve) 
+QDeclarativePropertyCache *QDeclarativePropertyCache::copy(int reserve)
 {
     QDeclarativePropertyCache *cache = new QDeclarativePropertyCache(engine);
     cache->parent = this;
@@ -297,6 +298,41 @@ QDeclarativePropertyCache *QDeclarativePropertyCache::copy(int reserve)
     return cache;
 }
 
+QDeclarativePropertyCache *QDeclarativePropertyCache::copy()
+{
+    return copy(0);
+}
+
+QDeclarativePropertyCache *
+QDeclarativePropertyCache::copyAndAppend(QDeclarativeEngine *engine, const QMetaObject *metaObject,
+                                         QDeclarativePropertyData::Flag propertyFlags,
+                                         QDeclarativePropertyData::Flag methodFlags,
+                                         QDeclarativePropertyData::Flag signalFlags)
+{
+    return copyAndAppend(engine, metaObject, -1, propertyFlags, methodFlags, signalFlags);
+}
+
+QDeclarativePropertyCache *
+QDeclarativePropertyCache::copyAndAppend(QDeclarativeEngine *engine, const QMetaObject *metaObject,
+                                         int revision,
+                                         QDeclarativePropertyData::Flag propertyFlags,
+                                         QDeclarativePropertyData::Flag methodFlags,
+                                         QDeclarativePropertyData::Flag signalFlags)
+{
+    Q_ASSERT(QMetaObjectPrivate::get(metaObject)->revision >= 4);
+
+    // Reserve enough space in the name hash for all the methods (including signals), all the
+    // signal handlers and all the properties.  This assumes no name clashes, but this is the
+    // common case.
+    QDeclarativePropertyCache *rv = copy(QMetaObjectPrivate::get(metaObject)->methodCount +
+                                         QMetaObjectPrivate::get(metaObject)->signalCount +
+                                         QMetaObjectPrivate::get(metaObject)->propertyCount);
+
+    rv->append(engine, metaObject, revision, propertyFlags, methodFlags, signalFlags);
+
+    return rv;
+}
+
 void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaObject *metaObject, 
                                        QDeclarativePropertyData::Flag propertyFlags,
                                        QDeclarativePropertyData::Flag methodFlags,
@@ -514,8 +550,6 @@ void QDeclarativePropertyCache::resolve(QDeclarativePropertyData *data) const
     Q_ASSERT(data->notFullyResolved());
 
     data->propType = QMetaType::type(data->propTypeName);
-    if (QVariant::Type(data->propType) == QVariant::LastType)
-        data->propType = QMetaType::QVariant;
 
     if (!data->isFunction())
         data->flags |= flagsForPropertyType(data->propType, engine);
@@ -690,7 +724,7 @@ int *QDeclarativePropertyCache::methodParameterTypes(QObject *object, int index,
         QMetaMethod m = metaObject->method(index);
         QList<QByteArray> argTypeNames = m.parameterTypes();
 
-        A *args = static_cast<A *>(qMalloc(sizeof(A) + (argTypeNames.count() + 1) * sizeof(int)));
+        A *args = static_cast<A *>(malloc(sizeof(A) + (argTypeNames.count() + 1) * sizeof(int)));
         args->arguments[0] = argTypeNames.count();
 
         for (int ii = 0; ii < argTypeNames.count(); ++ii) {
@@ -699,7 +733,7 @@ int *QDeclarativePropertyCache::methodParameterTypes(QObject *object, int index,
                 type = EnumType(object->metaObject(), argTypeNames.at(ii));
             if (type == QVariant::Invalid) {
                 if (unknownTypeError) *unknownTypeError = argTypeNames.at(ii);
-                qFree(args);
+                free(args);
                 return 0;
             }
             args->arguments[ii + 1] = type;