Remove v8 dependencies in qhashedstring
authorLars Knoll <lars.knoll@digia.com>
Tue, 21 May 2013 20:04:36 +0000 (22:04 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Wed, 22 May 2013 04:23:34 +0000 (06:23 +0200)
Also remove now unused API in v8::String

Change-Id: I2570aedf407c89ad85da01cf0e2153a52b4e562d
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
22 files changed:
src/qml/qml/ftw/qhashedstring.cpp
src/qml/qml/ftw/qhashedstring_p.h
src/qml/qml/qqmlintegercache_p.h
src/qml/qml/qqmlmetatype.cpp
src/qml/qml/qqmlmetatype_p.h
src/qml/qml/qqmlpropertycache.cpp
src/qml/qml/qqmlpropertycache_p.h
src/qml/qml/qqmltypenamecache.cpp
src/qml/qml/qqmltypenamecache_p.h
src/qml/qml/v4/qcalculatehash_p.h [deleted file]
src/qml/qml/v4/qv4string_p.h
src/qml/qml/v4/qv4v8.cpp
src/qml/qml/v4/qv4v8_p.h
src/qml/qml/v4/v4.pri
src/qml/qml/v8/qv8contextwrapper.cpp
src/qml/qml/v8/qv8engine_p.h
src/qml/qml/v8/qv8qobjectwrapper.cpp
src/qml/qml/v8/qv8qobjectwrapper_p.h
src/qml/qml/v8/qv8typewrapper.cpp
src/qml/qml/v8/qv8valuetypewrapper.cpp
src/qml/qml/v8/qv8valuetypewrapper_p.h
src/qml/types/qqmllistmodel.cpp

index 8f6c57e..577757f 100644 (file)
 ****************************************************************************/
 
 #include "qhashedstring_p.h"
-#include <private/qcalculatehash_p.h>
 
 inline quint32 stringHash(const QChar* data, int length)
 {
-    quint32 rv = calculateHash((quint16*)data, length);
-    Q_ASSERT(rv == v8::String::ComputeHash((uint16_t*)data, length));
-    return rv;
+    return QV4::String::createHashValue(data, length);
 }
 
 inline quint32 stringHash(const char *data, int length)
 {
-    quint32 rv = calculateHash((quint8*)data, length);
-    Q_ASSERT(rv == v8::String::ComputeHash((char *)data, length));
-    return rv;
+    QString s = QString::fromLatin1(data, length);
+    return QV4::String::createHashValue(s.constData(), s.length());
 }
 
 void QHashedString::computeHash() const
index 9393e1f..1198b02 100644 (file)
@@ -55,8 +55,8 @@
 
 #include <QtCore/qglobal.h>
 #include <QtCore/qstring.h>
-#include <private/qv8_p.h>
 #include <private/qv4string_p.h>
+#include <private/qv4value_p.h>
 
 #include <private/qflagpointer_p.h>
 
@@ -85,8 +85,6 @@ public:
     inline quint32 hash() const;
     inline quint32 existingHash() const;
 
-    static inline bool isUpper(const QChar &);
-
     static bool compare(const QChar *lhs, const QChar *rhs, int length);
     static inline bool compare(const QChar *lhs, const char *rhs, int length);
     static inline bool compare(const char *lhs, const char *rhs, int length);
@@ -98,27 +96,26 @@ private:
     mutable quint32 m_hash;
 };
 
-class Q_AUTOTEST_EXPORT QHashedV8String 
+class Q_AUTOTEST_EXPORT QHashedV4String
 {
 public:
-    inline QHashedV8String();
-    explicit inline QHashedV8String(v8::Handle<v8::String>);
-    inline QHashedV8String(const QHashedV8String &string);
-    inline QHashedV8String &operator=(const QHashedV8String &other);
+    inline QHashedV4String();
+    explicit inline QHashedV4String(const QV4::Value &s);
+    inline QHashedV4String(const QHashedV4String &string);
+    inline QHashedV4String &operator=(const QHashedV4String &other);
 
-    inline bool operator==(const QHashedV8String &string);
+    inline bool operator==(const QHashedV4String &string);
 
     inline quint32 hash() const;
     inline int length() const; 
     inline quint32 symbolId() const;
 
-    inline v8::Handle<v8::String> string() const;
+    inline QV4::Value string() const;
 
     inline QString toString() const;
 
 private:
-    v8::String::CompleteHashData m_hash;
-    v8::Handle<v8::String> m_string;
+    QV4::PersistentValue m_string;
 };
 
 class QHashedCStringRef;
@@ -262,19 +259,24 @@ public:
     inline char *cStrData() const { return (char *)ckey; }
     inline uint16_t *utf16Data() const { return (uint16_t *)strData->data(); }
 
-    inline bool equals(v8::Handle<v8::String> string) const {
-        v8::Handle<v8::String> data = isQString() ? v8::String::New(utf16Data(), length)
-                                                 : v8::String::New(cStrData(), length);
-        return string->Equals(data);
+    inline bool equals(const QV4::Value &string) const {
+        QString s = string.toQString();
+        if (isQString()) {
+            QStringDataPtr dd;
+            dd.ptr = strData;
+            return QString(dd) == s;
+        } else {
+            return QLatin1String(cStrData(), length) == s;
+        }
     }
 
-    inline bool symbolEquals(const QHashedV8String &string) const {
+    inline bool symbolEquals(const QHashedV4String &string) const {
         Q_ASSERT(string.symbolId() != 0);
         return length == string.length() && hash == string.hash() && 
                (string.symbolId() == symbolId || equals(string.string()));
     }
 
-    inline bool equals(const QHashedV8String &string) const {
+    inline bool equals(const QHashedV4String &string) const {
         return length == string.length() && hash == string.hash() && 
                equals(string.string());
     }
@@ -333,7 +335,7 @@ struct HashedForm {};
 template<> struct HashedForm<QString> { typedef QHashedString Type; };
 template<> struct HashedForm<QStringRef> { typedef QHashedStringRef Type; };
 template<> struct HashedForm<QHashedString> { typedef const QHashedString &Type; };
-template<> struct HashedForm<QHashedV8String> { typedef const QHashedV8String &Type; };
+template<> struct HashedForm<QHashedV4String> { typedef const QHashedV4String &Type; };
 template<> struct HashedForm<QHashedStringRef> { typedef const QHashedStringRef &Type; };
 template<> struct HashedForm<QLatin1String> { typedef QHashedCStringRef Type; };
 template<> struct HashedForm<QHashedCStringRef> { typedef const QHashedCStringRef &Type; };
@@ -344,7 +346,7 @@ public:
     static HashedForm<QString>::Type hashedString(const QString &s) { return QHashedString(s);}
     static HashedForm<QStringRef>::Type hashedString(const QStringRef &s) { return QHashedStringRef(s.constData(), s.size());}
     static HashedForm<QHashedString>::Type hashedString(const QHashedString &s) { return s; }
-    static HashedForm<QHashedV8String>::Type hashedString(const QHashedV8String &s) { return s; }
+    static HashedForm<QHashedV4String>::Type hashedString(const QHashedV4String &s) { return s; }
     static HashedForm<QHashedStringRef>::Type hashedString(const QHashedStringRef &s) { return s; }
 
     static HashedForm<QLatin1String>::Type hashedString(const QLatin1String &s) { return QHashedCStringRef(s.data(), s.size()); }
@@ -352,14 +354,14 @@ public:
 
     static const QString &toQString(const QString &s) { return s; }
     static const QString &toQString(const QHashedString &s) { return s; }
-    static QString toQString(const QHashedV8String &s) { return s.toString(); }
+    static QString toQString(const QHashedV4String &s) { return s.toString(); }
     static QString toQString(const QHashedStringRef &s) { return s.toString(); }
 
     static QString toQString(const QLatin1String &s) { return QString(s); }
     static QString toQString(const QHashedCStringRef &s) { return s.toUtf16(); }
 
     static inline quint32 hashOf(const QHashedStringRef &s) { return s.hash(); }
-    static inline quint32 hashOf(const QHashedV8String &s) { return s.hash(); }
+    static inline quint32 hashOf(const QHashedV4String &s) { return s.hash(); }
 
     template<typename K>
     static inline quint32 hashOf(const K &key) { return hashedString(key).hash(); }
@@ -402,7 +404,7 @@ public:
     template<typename K>
     inline Node *findNode(const K &) const;
 
-    inline Node *findSymbolNode(const QHashedV8String &) const;
+    inline Node *findSymbolNode(const QHashedV4String &) const;
 
     inline Node *createNode(const Node &o);
 
@@ -473,7 +475,7 @@ public:
     template<typename K>
     inline T *value(const K &) const;
 
-    inline T *value(const QHashedV8String &string) const;
+    inline T *value(const QHashedV4String &string) const;
     inline T *value(const ConstIterator &) const;
 
     template<typename K>
@@ -867,7 +869,7 @@ typename QStringHash<T>::Node *QStringHash<T>::findNode(const K &key) const
 }
 
 template<class T>
-typename QStringHash<T>::Node *QStringHash<T>::findSymbolNode(const QHashedV8String &string) const
+typename QStringHash<T>::Node *QStringHash<T>::findSymbolNode(const QHashedV4String &string) const
 {
     Q_ASSERT(string.symbolId() != 0);
 
@@ -897,7 +899,7 @@ T *QStringHash<T>::value(const ConstIterator &iter) const
 }
 
 template<class T>
-T *QStringHash<T>::value(const QHashedV8String &string) const
+T *QStringHash<T>::value(const QHashedV4String &string) const
 {
     Node *n = string.symbolId()?findSymbolNode(string):findNode(string);
     return n?&n->value:0;
@@ -1123,66 +1125,55 @@ quint32 QHashedString::existingHash() const
     return m_hash;
 }
 
-bool QHashedString::isUpper(const QChar &qc)
-{
-    ushort c = qc.unicode();
-    // Optimize for _, a-z and A-Z.
-    return ((c != '_' ) && (!(c >= 'a' && c <= 'z')) &&
-           ((c >= 'A' && c <= 'Z') || QChar::category(c) == QChar::Letter_Uppercase));
-}
-
-QHashedV8String::QHashedV8String()
+QHashedV4String::QHashedV4String()
 {
 }
 
-QHashedV8String::QHashedV8String(v8::Handle<v8::String> string)
-: m_hash(string->CompleteHash()), m_string(string)
+QHashedV4String::QHashedV4String(const QV4::Value &s)
+    : m_string(s)
 {
-    Q_ASSERT(!m_string.IsEmpty());
+    Q_ASSERT(!s.toQString().isEmpty());
 }
 
-QHashedV8String::QHashedV8String(const QHashedV8String &string)
-: m_hash(string.m_hash), m_string(string.m_string)
+QHashedV4String::QHashedV4String(const QHashedV4String &string)
+    : m_string(string.m_string)
 {
 }
 
-QHashedV8String &QHashedV8String::operator=(const QHashedV8String &other)
+QHashedV4String &QHashedV4String::operator=(const QHashedV4String &other)
 {
-    m_hash = other.m_hash;
     m_string = other.m_string;
     return *this;
 }
 
-bool QHashedV8String::operator==(const QHashedV8String &string)
+bool QHashedV4String::operator==(const QHashedV4String &string)
 {
-    return m_hash.hash == string.m_hash.hash && m_hash.length == string.m_hash.length &&
-           m_string.IsEmpty() == m_string.IsEmpty() && 
-           (m_string.IsEmpty() || m_string->StrictEquals(string.m_string));
+    return m_string.value().asString()->isEqualTo(string.m_string.value().asString());
 }
 
-quint32 QHashedV8String::hash() const
+quint32 QHashedV4String::hash() const
 {
-    return m_hash.hash;
+    return m_string.value().asString()->hashValue();
 }
 
-int QHashedV8String::length() const
+int QHashedV4String::length() const
 {
-    return m_hash.length;
+    return m_string.value().asString()->toQString().length();
 }
 
-quint32 QHashedV8String::symbolId() const
+quint32 QHashedV4String::symbolId() const
 {
-    return m_hash.symbol_id;
+    return m_string.value().asString()->identifier;
 }
 
-v8::Handle<v8::String> QHashedV8String::string() const
+QV4::Value QHashedV4String::string() const
 {
-    return m_string;
+    return m_string.value();
 }
 
-QString QHashedV8String::toString() const
+QString QHashedV4String::toString() const
 {
-    return m_string->v4Value().toQString();
+    return m_string.value().toQString();
 }
 
 QHashedStringRef::QHashedStringRef() 
@@ -1327,7 +1318,7 @@ bool QHashedStringRef::isLatin1() const
 bool QHashedStringRef::startsWithUpper() const
 {
     if (m_length < 1) return false;
-    return QHashedString::isUpper(m_data[0]);
+    return m_data[0].isUpper();
 }
 
 quint32 QHashedStringRef::hash() const
index 8b2f972..5fe4039 100644 (file)
@@ -71,7 +71,7 @@ public:
     void reserve(int);
 
     int value(const QString &);
-    inline int value(const QHashedV8String &);
+    inline int value(const QHashedV4String &);
 
     QString findId(int value) const;
 
@@ -80,7 +80,7 @@ private:
     StringCache stringCache;
 };
 
-int QQmlIntegerCache::value(const QHashedV8String &name)
+int QQmlIntegerCache::value(const QHashedV4String &name)
 {
     int *result = stringCache.value(name);
     return result?*result:-1;
index 372475d..c616d5c 100644 (file)
@@ -917,7 +917,7 @@ int QQmlType::enumValue(const QHashedCStringRef &name, bool *ok) const
     return -1;
 }
 
-int QQmlType::enumValue(const QHashedV8String &name, bool *ok) const
+int QQmlType::enumValue(const QHashedV4String &name, bool *ok) const
 {
     Q_ASSERT(ok);
     *ok = true;
@@ -991,7 +991,7 @@ QQmlType *QQmlTypeModule::type(const QHashedStringRef &name, int minor)
     return 0;
 }
 
-QQmlType *QQmlTypeModule::type(const QHashedV8String &name, int minor)
+QQmlType *QQmlTypeModule::type(const QHashedV4String &name, int minor)
 {
     QReadLocker lock(metaTypeDataLock());
 
@@ -1060,7 +1060,7 @@ QQmlType *QQmlTypeModuleVersion::type(const QHashedStringRef &name) const
     else return 0;
 }
 
-QQmlType *QQmlTypeModuleVersion::type(const QHashedV8String &name) const
+QQmlType *QQmlTypeModuleVersion::type(const QHashedV4String &name) const
 {
     if (m_module) return m_module->type(name, m_minor);
     else return 0;
index 497afff..5f3d115 100644 (file)
@@ -136,7 +136,7 @@ private:
 
 struct QQmlMetaTypeData;
 class QHashedCStringRef;
-class QHashedV8String;
+class QHashedV4String;
 class Q_QML_PRIVATE_EXPORT QQmlType
 {
 public:
@@ -213,7 +213,7 @@ public:
 
     int enumValue(const QHashedStringRef &, bool *ok) const;
     int enumValue(const QHashedCStringRef &, bool *ok) const;
-    int enumValue(const QHashedV8String &, bool *ok) const;
+    int enumValue(const QHashedV4String &, bool *ok) const;
 private:
     QQmlType *superType() const;
     friend class QQmlTypePrivate;
@@ -251,7 +251,7 @@ public:
     int maximumMinorVersion() const;
 
     QQmlType *type(const QHashedStringRef &, int);
-    QQmlType *type(const QHashedV8String &, int);
+    QQmlType *type(const QHashedV4String &, int);
 
     QList<QQmlType*> singletonTypes(int) const;
 
@@ -277,7 +277,7 @@ public:
     int minorVersion() const;
 
     QQmlType *type(const QHashedStringRef &) const;
-    QQmlType *type(const QHashedV8String &) const;
+    QQmlType *type(const QHashedV4String &) const;
 
 private:
     QQmlTypeModule *m_module;
index 55ecdff..4adb268 100644 (file)
@@ -1366,9 +1366,9 @@ inline const QString &qQmlPropertyCacheToString(const QString &string)
     return string;
 }
 
-inline QString qQmlPropertyCacheToString(const QHashedV8String &string)
+inline QString qQmlPropertyCacheToString(const QHashedV4String &string)
 {
-    return string.string()->v4Value().toQString();
+    return string.toString();
 }
 
 template<typename T>
@@ -1406,10 +1406,10 @@ qQmlPropertyCacheProperty(QQmlEngine *engine, QObject *obj, const T &name,
 }
 
 QQmlPropertyData *
-QQmlPropertyCache::property(QQmlEngine *engine, QObject *obj, const QHashedV8String &name,
+QQmlPropertyCache::property(QQmlEngine *engine, QObject *obj, const QHashedV4String &name,
                             QQmlContextData *context, QQmlPropertyData &local)
 {
-    return qQmlPropertyCacheProperty<QHashedV8String>(engine, obj, name, context, local);
+    return qQmlPropertyCacheProperty<QHashedV4String>(engine, obj, name, context, local);
 }
 
 QQmlPropertyData *
index 4f608e1..15bd83f 100644 (file)
@@ -304,7 +304,7 @@ public:
     inline QQmlEngine *qmlEngine() const;
     static QQmlPropertyData *property(QQmlEngine *, QObject *, const QString &,
                                               QQmlContextData *, QQmlPropertyData &);
-    static QQmlPropertyData *property(QQmlEngine *, QObject *, const QHashedV8String &,
+    static QQmlPropertyData *property(QQmlEngine *, QObject *, const QHashedV4String &,
                                               QQmlContextData *, QQmlPropertyData &);
     static int *methodParameterTypes(QObject *, int index, QVarLengthArray<int, 9> &dummy,
                                      QByteArray *unknownTypeError);
index 180c620..8c522c2 100644 (file)
@@ -91,7 +91,7 @@ QQmlTypeNameCache::Result QQmlTypeNameCache::query(const QHashedStringRef &name,
     return typeSearch(i->modules, name);
 }
 
-QQmlTypeNameCache::Result QQmlTypeNameCache::query(const QHashedV8String &name)
+QQmlTypeNameCache::Result QQmlTypeNameCache::query(const QHashedV4String &name)
 {
     Result result = query(m_namedImports, name);
 
@@ -101,7 +101,7 @@ QQmlTypeNameCache::Result QQmlTypeNameCache::query(const QHashedV8String &name)
     return result;
 }
 
-QQmlTypeNameCache::Result QQmlTypeNameCache::query(const QHashedV8String &name, const void *importNamespace)
+QQmlTypeNameCache::Result QQmlTypeNameCache::query(const QHashedV4String &name, const void *importNamespace)
 {
     Q_ASSERT(importNamespace);
     const Import *i = static_cast<const Import *>(importNamespace);
index 4484adf..33c0121 100644 (file)
@@ -90,8 +90,8 @@ public:
     };
     Result query(const QHashedStringRef &);
     Result query(const QHashedStringRef &, const void *importNamespace);
-    Result query(const QHashedV8String &);
-    Result query(const QHashedV8String &, const void *importNamespace);
+    Result query(const QHashedV4String &);
+    Result query(const QHashedV4String &, const void *importNamespace);
 
 private:
     friend class QQmlImports;
diff --git a/src/qml/qml/v4/qcalculatehash_p.h b/src/qml/qml/v4/qcalculatehash_p.h
deleted file mode 100644 (file)
index 8cccc5d..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtV8 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.  For licensing terms and
-** conditions see http://qt.digia.com/licensing.  For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights.  These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef CALCULATEHASH_P_H
-#define CALCULATEHASH_P_H
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the Qt API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qstring.h>
-#include "qv4v8_p.h"
-QT_BEGIN_NAMESPACE
-
-inline uint32_t calculateHash(const quint8* chars, int length)
-{
-    return v8::String::ComputeHash((char *)chars, length);
-}
-
-inline uint32_t calculateHash(const quint16* chars, int length)
-{
-    return v8::String::ComputeHash((uint16_t *)chars, length);
-}
-
-QT_END_NAMESPACE
-
-#endif // CALCULATEHASH_P_H
index 9db709a..e33c4d8 100644 (file)
@@ -110,6 +110,10 @@ struct String : public Managed {
     void createHashValue() const;
     static uint createHashValue(const QChar *ch, int length);
 
+    bool startsWithUpper() const {
+        return _text.length() && _text.at(0).isUpper();
+    }
+
     QString _text;
     mutable uint stringHash;
     mutable uint identifier;
index 9902528..ba9509e 100644 (file)
@@ -508,58 +508,6 @@ Handle<Value> Value::fromV4Value(const QV4::Value &v4Value)
 }
 
 
-int String::Length() const
-{
-    return asV4String()->toQString().length();
-}
-
-uint32_t String::Hash() const
-{
-    return asV4String()->hashValue();
-}
-
-
-String::CompleteHashData String::CompleteHash() const
-{
-    QV4::String *s = asV4String();
-    CompleteHashData data;
-    data.hash = s->hashValue();
-    data.length = s->toQString().length();
-    data.symbol_id = s->identifier;
-    return data;
-}
-
-uint32_t String::ComputeHash(uint16_t *string, int length)
-{
-    return QV4::String::createHashValue(reinterpret_cast<const QChar *>(string), length);
-}
-
-uint32_t String::ComputeHash(char *string, int length)
-{
-    // ### unefficient
-    QString s = QString::fromLatin1((char *)string, length);
-    return QV4::String::createHashValue(s.constData(), s.length());
-}
-
-bool String::Equals(uint16_t *str, int length)
-{
-    return asQString() == QString(reinterpret_cast<QChar*>(str), length);
-}
-
-bool String::Equals(char *str, int length)
-{
-    return asQString() == QString::fromLatin1(str, length);
-}
-
-int String::Write(uint16_t *buffer) const
-{
-    uint length = asQString().length();
-    if (length == 0)
-        return 0;
-    memcpy(buffer, asQString().constData(), length*sizeof(QChar));
-    return length;
-}
-
 String::ExternalStringResource *String::GetExternalStringResource() const
 {
     Q_UNIMPLEMENTED();
@@ -584,13 +532,6 @@ Handle<String> String::New(const uint16_t *data, int length)
     return v;
 }
 
-Handle<String> String::NewSymbol(const char *data, int length)
-{
-    QString str = QString::fromLatin1(data, length);
-    QV4::String *vmString = currentEngine()->newIdentifier(str);
-    return New(vmString);
-}
-
 Handle<String> String::New(QV4::String *s)
 {
     return QV4::Value::fromString(s);
index b73d26e..dcd44d5 100644 (file)
@@ -799,82 +799,6 @@ class V8EXPORT Value {
  */
 class V8EXPORT String : public Value {
  public:
-  /**
-   * Returns the number of characters in this string.
-   */
-  int Length() const;
-
-
-  /**
-   * Returns the hash of this string.
-   */
-  uint32_t Hash() const;
-
-  struct CompleteHashData {
-    CompleteHashData() : length(0), hash(0), symbol_id(0) {}
-    int length;
-    uint32_t hash;
-    uint32_t symbol_id;
-  };
-
-  /**
-   * Returns the "complete" hash of the string.  This is
-   * all the information about the string needed to implement
-   * a very efficient hash keyed on the string.
-   *
-   * The members of CompleteHashData are:
-   *    length: The length of the string.  Equivalent to Length()
-   *    hash: The hash of the string.  Equivalent to Hash()
-   *    symbol_id: If the string is a sequential symbol, the symbol
-   *        id, otherwise 0.  If the symbol ids of two strings are
-   *        the same (and non-zero) the two strings are identical.
-   *        If the symbol ids are different the strings may still be
-   *        identical, but an Equals() check must be performed.
-   */
-  CompleteHashData CompleteHash() const;
-
-  /**
-   * Compute a hash value for the passed UTF16 string
-   * data.
-   */
-  static uint32_t ComputeHash(uint16_t *string, int length);
-  static uint32_t ComputeHash(char *string, int length);
-
-  /**
-   * Returns true if this string is equal to the external
-   * string data provided.
-   */
-  bool Equals(uint16_t *string, int length);
-  bool Equals(char *string, int length);
-  bool Equals(Handle<Value> that) const {
-    return v8::Value::Equals(that);
-  }
-
-  /**
-   * Write the contents of the string to an external buffer.
-   * If no arguments are given, expects the buffer to be large
-   * enough to hold the entire string and NULL terminator. Copies
-   * the contents of the string and the NULL terminator into the
-   * buffer.
-   */
-  int Write(uint16_t* buffer) const;
-
-  class V8EXPORT ExternalStringResourceBase {  // NOLINT
-   public:
-    virtual ~ExternalStringResourceBase() {}
-
-   protected:
-    ExternalStringResourceBase() {}
-
-    /**
-     * Internally V8 will call this Dispose method when the external string
-     * resource is no longer needed. The default implementation will use the
-     * delete operator. This method can be overridden in subclasses to
-     * control how allocated external string resources are disposed.
-     */
-    virtual void Dispose() { delete this; }
-
-  };
 
   /**
    * An ExternalStringResource is a wrapper around a two-byte string
@@ -882,8 +806,7 @@ class V8EXPORT String : public Value {
    * ExternalStringResource to manage the life cycle of the underlying
    * buffer.  Note that the string data must be immutable.
    */
-  class V8EXPORT ExternalStringResource
-      : public ExternalStringResourceBase {
+  class V8EXPORT ExternalStringResource {
    public:
     /**
      * Override the destructor to manage the life cycle of the underlying
@@ -901,6 +824,8 @@ class V8EXPORT String : public Value {
      */
     virtual size_t length() const = 0;
 
+      virtual void Dispose() { delete this; }
+
    protected:
     ExternalStringResource() {}
   };
@@ -927,9 +852,6 @@ class V8EXPORT String : public Value {
   /** Allocates a new string from 16-bit character codes.*/
   static Handle<String> New(const uint16_t* data, int length = -1);
 
-  /** Creates a symbol. Returns one if it exists already.*/
-  static Handle<String> NewSymbol(const char* data, int length = -1);
-
   static Handle<String> New(QV4::String *s);
 
   /**
index b7dc9e6..15f41d6 100644 (file)
@@ -97,7 +97,6 @@ HEADERS += \
     $$PWD/qv4unwindhelper_p-arm.h \
     $$PWD/qv4serialize_p.h \
     $$PWD/qv4v8_p.h \
-    $$PWD/qcalculatehash_p.h \
     $$PWD/qv4util_p.h \
     $$PWD/qv4executableallocator_p.h \
     $$PWD/qv4sequenceobject_p.h
index 4bb89b8..fe4bfb8 100644 (file)
@@ -270,9 +270,9 @@ v8::Handle<v8::Value> QV8ContextWrapper::Getter(v8::Handle<v8::String> property,
 
     QObject *scopeObject = resource->getScopeObject();
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
-    if (context->imports && QV8Engine::startsWithUpper(property->v4Value().asString())) {
+    if (context->imports && property->v4Value().asString()->startsWithUpper()) {
         // Search for attached properties, enums and imported scripts
         QQmlTypeNameCache::Result r = context->imports->query(propertystring);
         
@@ -393,7 +393,7 @@ v8::Handle<v8::Value> QV8ContextWrapper::Setter(v8::Handle<v8::String> property,
     QV8Engine *engine = resource->engine;
     QObject *scopeObject = resource->getScopeObject();
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     QV8QObjectWrapper *qobjectWrapper = engine->qobjectWrapper();
 
index 7589315..eda6850 100644 (file)
@@ -289,8 +289,6 @@ public:
     QV4::Value getOwnPropertyNames(const QV4::Value &o);
     void freezeObject(const QV4::Value &value);
 
-    static inline bool startsWithUpper(QV4::String *);
-
     QVariant toVariant(const QV4::Value &value, int typeHint);
     QV4::Value fromVariant(const QVariant &);
 
@@ -522,15 +520,6 @@ QV4::Value QV8Engine::bindingFlagKey() const
     return m_bindingFlagKey;
 }
 
-// XXX Can this be made more optimal?  It is called prior to resolving each and every 
-// unqualified name in QV8ContextWrapper.
-bool QV8Engine::startsWithUpper(QV4::String *string)
-{
-    uint16_t c = string->toQString().at(0).unicode();
-    return (c >= 'A' && c <= 'Z') ||
-           (c > 127 && QChar::category(c) == QChar::Letter_Uppercase);
-}
-
 QV8Engine::Deletable *QV8Engine::extensionData(int index) const
 {
     if (index < m_extensionData.count())
index 93f7c9c..88f41e8 100644 (file)
@@ -312,8 +312,8 @@ void QV8QObjectWrapper::init(QV8Engine *engine)
     m_destroySymbol = QV4::Value::fromString(v4->newIdentifier("destroy"));
     m_hiddenObject = QV4::Value::fromObject(v4->newObject());
 
-    m_toStringString = QHashedV8String(m_toStringSymbol.value());
-    m_destroyString = QHashedV8String(m_destroySymbol.value());
+    m_toStringString = QHashedV4String(m_toStringSymbol.value());
+    m_destroyString = QHashedV4String(m_destroySymbol.value());
 
     toStringHash = m_toStringString.hash();
     destroyHash = m_destroyString.hash();
@@ -471,7 +471,7 @@ static v8::Handle<v8::Value> LoadProperty(QV8Engine *engine, QObject *object,
 
 v8::Handle<v8::Value> QV8QObjectWrapper::GetProperty(QV8Engine *engine, QObject *object, 
                                                      v8::Handle<v8::Value> *objectHandle, 
-                                                     const QHashedV8String &property,
+                                                     const QHashedV4String &property,
                                                      QQmlContextData *context,
                                                      QV8QObjectWrapper::RevisionMode revisionMode)
 {
@@ -714,7 +714,7 @@ static inline void StoreProperty(QV8Engine *engine, QObject *object, QQmlPropert
     }
 }
 
-bool QV8QObjectWrapper::SetProperty(QV8Engine *engine, QObject *object, const QHashedV8String &property, QQmlContextData *context,
+bool QV8QObjectWrapper::SetProperty(QV8Engine *engine, QObject *object, const QHashedV4String &property, QQmlContextData *context,
                                     v8::Handle<v8::Value> value, QV8QObjectWrapper::RevisionMode revisionMode)
 {
     if (engine->qobjectWrapper()->m_toStringString == property ||
@@ -739,7 +739,7 @@ bool QV8QObjectWrapper::SetProperty(QV8Engine *engine, QObject *object, const QH
 
     if (!result->isWritable() && !result->isQList()) {
         QString error = QLatin1String("Cannot assign to read-only property \"") +
-                        property.string()->v4Value().toQString() + QLatin1Char('\"');
+                        property.toString() + QLatin1Char('\"');
         v8::ThrowException(v8::Exception::Error(engine->toString(error)));
         return true;
     }
@@ -759,7 +759,7 @@ v8::Handle<v8::Value> QV8QObjectWrapper::Getter(v8::Handle<v8::String> property,
 
     QObject *object = resource->object;
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     QV8Engine *v8engine = resource->engine;
     QQmlContextData *context = v8engine->callingContext();
@@ -770,7 +770,7 @@ v8::Handle<v8::Value> QV8QObjectWrapper::Getter(v8::Handle<v8::String> property,
     if (!result.IsEmpty())
         return result;
 
-    if (QV8Engine::startsWithUpper(property->v4Value().asString())) {
+    if (property->v4Value().asString()->startsWithUpper()) {
         // Check for attached properties
         if (context && context->imports) {
             QQmlTypeNameCache::Result r = context->imports->query(propertystring);
@@ -803,7 +803,7 @@ v8::Handle<v8::Value> QV8QObjectWrapper::Setter(v8::Handle<v8::String> property,
 
     QObject *object = resource->object;
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     QV8Engine *v8engine = resource->engine;
     QQmlContextData *context = v8engine->callingContext();
@@ -831,7 +831,7 @@ v8::Handle<v8::Value> QV8QObjectWrapper::Query(v8::Handle<v8::String> property,
     QObject *object = resource->object;
     QQmlContextData *context = engine->callingContext();
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     QQmlPropertyData local;
     QQmlPropertyData *result = 0;
index f25bec0..426f122 100644 (file)
@@ -102,8 +102,8 @@ public:
     static QObject *toQObject(QV8ObjectResource *);
 
     enum RevisionMode { IgnoreRevision, CheckRevision };
-    inline v8::Handle<v8::Value> getProperty(QObject *, const QHashedV8String &, QQmlContextData *, RevisionMode);
-    inline bool setProperty(QObject *, const QHashedV8String &, QQmlContextData *, v8::Handle<v8::Value>, RevisionMode);
+    inline v8::Handle<v8::Value> getProperty(QObject *, const QHashedV4String &, QQmlContextData *, RevisionMode);
+    inline bool setProperty(QObject *, const QHashedV4String &, QQmlContextData *, v8::Handle<v8::Value>, RevisionMode);
 
     void registerWeakQObjectReference(QV8QObjectResource *resource)
     {
@@ -123,8 +123,8 @@ private:
     v8::Handle<v8::Object> newQObject(QObject *, QQmlData *, QV8Engine *);
     bool deleteWeakQObject(QV8QObjectResource *resource, bool calledFromEngineDtor = false);
     static v8::Handle<v8::Value> GetProperty(QV8Engine *, QObject *, v8::Handle<v8::Value> *, 
-                                             const QHashedV8String &, QQmlContextData *, QV8QObjectWrapper::RevisionMode);
-    static bool SetProperty(QV8Engine *, QObject *, const QHashedV8String &, QQmlContextData *,
+                                             const QHashedV4String &, QQmlContextData *, QV8QObjectWrapper::RevisionMode);
+    static bool SetProperty(QV8Engine *, QObject *, const QHashedV4String &, QQmlContextData *,
                             v8::Handle<v8::Value>, QV8QObjectWrapper::RevisionMode);
     static v8::Handle<v8::Value> Getter(v8::Handle<v8::String> property,
                                         const v8::AccessorInfo &info);
@@ -148,8 +148,8 @@ private:
     QV4::PersistentValue m_signalHandlerConstructor;
     QV4::PersistentValue m_toStringSymbol;
     QV4::PersistentValue m_destroySymbol;
-    QHashedV8String m_toStringString;
-    QHashedV8String m_destroyString;
+    QHashedV4String m_toStringString;
+    QHashedV4String m_destroyString;
     QV4::PersistentValue m_hiddenObject;
     QHash<QObject *, QV8QObjectConnectionList *> m_connections;
     typedef QHash<QObject *, QV8QObjectInstance *> TaintedHash;
@@ -157,7 +157,7 @@ private:
     QIntrusiveList<QV8QObjectResource, &QV8QObjectResource::weakResource> m_javaScriptOwnedWeakQObjects;
 };
 
-v8::Handle<v8::Value> QV8QObjectWrapper::getProperty(QObject *object, const QHashedV8String &string,  
+v8::Handle<v8::Value> QV8QObjectWrapper::getProperty(QObject *object, const QHashedV4String &string,
                                                      QQmlContextData *context, RevisionMode mode)
 {
     QQmlData *dd = QQmlData::get(object, false);
@@ -169,7 +169,7 @@ v8::Handle<v8::Value> QV8QObjectWrapper::getProperty(QObject *object, const QHas
     }
 }
 
-bool QV8QObjectWrapper::setProperty(QObject *object, const QHashedV8String &string, 
+bool QV8QObjectWrapper::setProperty(QObject *object, const QHashedV4String &string,
                                     QQmlContextData *context, v8::Handle<v8::Value> value, RevisionMode mode)
 {
     QQmlData *dd = QQmlData::get(object, false);
index e7660f7..c969976 100644 (file)
@@ -160,7 +160,7 @@ v8::Handle<v8::Value> QV8TypeWrapper::Getter(v8::Handle<v8::String> property,
 
     QObject *object = resource->object;
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     if (resource->type) {
         QQmlType *type = resource->type;
@@ -174,7 +174,7 @@ v8::Handle<v8::Value> QV8TypeWrapper::Getter(v8::Handle<v8::String> property,
             QObject *qobjectSingleton = siinfo->qobjectApi(e);
             if (qobjectSingleton) {
                 // check for enum value
-                if (QV8Engine::startsWithUpper(property->v4Value().asString())) {
+                if (property->v4Value().asString()->startsWithUpper()) {
                     if (resource->mode == IncludeEnums) {
                         QString name = property->v4Value().toQString();
 
@@ -207,7 +207,7 @@ v8::Handle<v8::Value> QV8TypeWrapper::Getter(v8::Handle<v8::String> property,
 
         } else {
 
-            if (QV8Engine::startsWithUpper(property->v4Value().asString())) {
+            if (property->v4Value().asString()->startsWithUpper()) {
                 bool ok = false;
                 int value = type->enumValue(propertystring, &ok);
                 if (ok)
@@ -271,7 +271,7 @@ v8::Handle<v8::Value> QV8TypeWrapper::Setter(v8::Handle<v8::String> property,
     QV8Engine *v8engine = resource->engine;
     QQmlContextData *context = v8engine->callingContext();
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     QQmlType *type = resource->type;
     if (type && !type->isSingleton() && resource->object) {
index cf2310d..9bf1169 100644 (file)
@@ -125,7 +125,7 @@ void QV8ValueTypeWrapper::init(QV8Engine *engine)
     m_constructor = ft->GetFunction()->v4Value();
 
     m_toStringSymbol = QV4::Value::fromString(QV8Engine::getV4(engine)->newIdentifier(QStringLiteral("toString")));
-    m_toStringString = QHashedV8String(m_toStringSymbol.value());
+    m_toStringString = QHashedV4String(m_toStringSymbol.value());
     toStringHash = m_toStringString.hash();
 }
 
@@ -282,7 +282,7 @@ v8::Handle<v8::Value> QV8ValueTypeWrapper::Getter(v8::Handle<v8::String> propert
     QV8ValueTypeResource *r =  v8_resource_cast<QV8ValueTypeResource>(info.This());
     if (!r) return v8::Handle<v8::Value>();
 
-    QHashedV8String propertystring(property);
+    QHashedV4String propertystring(property->v4Value());
 
     {
         // Comparing the hash first actually makes a measurable difference here, at least on x86
index ed97b13..c6c8775 100644 (file)
@@ -100,7 +100,7 @@ private:
     QV4::PersistentValue m_constructor;
     QV4::PersistentValue m_toString;
     QV4::PersistentValue m_toStringSymbol;
-    QHashedV8String m_toStringString;
+    QHashedV4String m_toStringString;
 };
 
 QT_END_NAMESPACE
index d44773c..6666f63 100644 (file)
@@ -105,7 +105,7 @@ const ListLayout::Role &ListLayout::getRoleOrCreate(const QString &key, Role::Da
 
 const ListLayout::Role &ListLayout::getRoleOrCreate(v8::Handle<v8::String> key, Role::DataType type)
 {
-    QHashedV8String hashedKey(key);
+    QHashedV4String hashedKey(key->v4Value());
     QStringHash<Role *>::Node *node = roleHash.findNode(hashedKey);
     if (node) {
         const Role &r = *node->value;
@@ -114,9 +114,7 @@ const ListLayout::Role &ListLayout::getRoleOrCreate(v8::Handle<v8::String> key,
         return r;
     }
 
-    QString qkey;
-    qkey.resize(key->Length());
-    key->Write(reinterpret_cast<uint16_t*>(qkey.data()));
+    QString qkey = key->asQString();
 
     return createRole(qkey, type);
 }
@@ -244,7 +242,7 @@ const ListLayout::Role *ListLayout::getExistingRole(const QString &key)
 const ListLayout::Role *ListLayout::getExistingRole(v8::Handle<v8::String> key)
 {
     Role *r = 0;
-    QHashedV8String hashedKey(key);
+    QHashedV4String hashedKey(key->v4Value());
     QStringHash<Role *>::Node *node = roleHash.findNode(hashedKey);
     if (node)
         r = node->value;
@@ -430,9 +428,7 @@ void ListModel::set(int elementIndex, v8::Handle<v8::Object> object, QVector<int
         if (propertyValue->IsString()) {
             const ListLayout::Role &r = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::String);
             v8::Handle<v8::String> jsString = propertyValue->ToString();
-            QString qstr;
-            qstr.resize(jsString->Length());
-            jsString->Write(reinterpret_cast<uint16_t*>(qstr.data()));
+            QString qstr = jsString->asQString();
             roleIndex = e->setStringProperty(r, qstr);
         } else if (propertyValue->IsNumber()) {
             const ListLayout::Role &r = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::Number);
@@ -499,9 +495,7 @@ void ListModel::set(int elementIndex, v8::Handle<v8::Object> object, QV8Engine *
             const ListLayout::Role &r = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::String);
             if (r.type == ListLayout::Role::String) {
                 v8::Handle<v8::String> jsString = propertyValue->ToString();
-                QString qstr;
-                qstr.resize(jsString->Length());
-                jsString->Write(reinterpret_cast<uint16_t*>(qstr.data()));
+                QString qstr = jsString->asQString();
                 e->setStringPropertyFast(r, qstr);
             }
         } else if (propertyValue->IsNumber()) {
@@ -1173,9 +1167,7 @@ int ListElement::setJsProperty(const ListLayout::Role &role, v8::Handle<v8::Valu
     // Add the value now
     if (d->IsString()) {
         v8::Handle<v8::String> jsString = d->ToString();
-        QString qstr;
-        qstr.resize(jsString->Length());
-        jsString->Write(reinterpret_cast<uint16_t*>(qstr.data()));
+        QString qstr = jsString->asQString();
         roleIndex = setStringProperty(role, qstr);
     } else if (d->IsNumber()) {
         roleIndex = setDoubleProperty(role, d->NumberValue());