18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "qt_class.h"
225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "Identifier.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "qt_instance.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "qt_runtime.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <qdebug.h>
285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include <qmetaobject.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace Bindings {
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectQtClass::QtClass(const QMetaObject* mo)
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_metaObject(mo)
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectQtClass::~QtClass()
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef HashMap<const QMetaObject*, QtClass*> ClassesByMetaObject;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ClassesByMetaObject* classesByMetaObject = 0;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectQtClass* QtClass::classForObject(QObject* o)
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!classesByMetaObject)
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        classesByMetaObject = new ClassesByMetaObject;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QMetaObject* mo = o->metaObject();
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QtClass* aClass = classesByMetaObject->get(mo);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!aClass) {
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        aClass = new QtClass(mo);
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        classesByMetaObject->set(mo, aClass);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return aClass;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst char* QtClass::name() const
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_metaObject->className();
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// We use this to get at signals (so we can return a proper function object,
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// and not get wrapped in RuntimeMethod). Also, use this for methods,
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// so we can cache the object and return the same object for the same
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// identifier.
695f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue QtClass::fallbackObject(ExecState* exec, Instance* inst, const Identifier& identifier)
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QtInstance* qtinst = static_cast<QtInstance*>(inst);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    const UString& ustring = identifier.ustring();
74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    const QByteArray name = QString(reinterpret_cast<const QChar*>(ustring.characters()), ustring.length()).toAscii();
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First see if we have a cache hit
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSObject* val = qtinst->m_methods.value(name).get();
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (val)
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return val;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Nope, create an entry
826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    const QByteArray normal = QMetaObject::normalizedSignature(name.constData());
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // See if there is an exact match
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int index = -1;
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (normal.contains('(') && (index = m_metaObject->indexOfMethod(normal)) != -1) {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QMetaMethod m = m_metaObject->method(index);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m.access() != QMetaMethod::Private) {
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            QtRuntimeMetaMethod* val = new (exec) QtRuntimeMetaMethod(exec, identifier, static_cast<QtInstance*>(inst), index, normal, false);
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            qtinst->m_methods.insert(name, WriteBarrier<JSObject>(exec->globalData(), qtinst->createRuntimeObject(exec), val));
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return val;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Nope.. try a basename match
966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    const int count = m_metaObject->methodCount();
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (index = count - 1; index >= 0; --index) {
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const QMetaMethod m = m_metaObject->method(index);
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m.access() == QMetaMethod::Private)
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        int iter = 0;
1036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        const char* signature = m.signature();
1046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        while (signature[iter] && signature[iter] != '(')
1056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            ++iter;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (normal == QByteArray::fromRawData(signature, iter)) {
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            QtRuntimeMetaMethod* val = new (exec) QtRuntimeMetaMethod(exec, identifier, static_cast<QtInstance*>(inst), index, normal, false);
1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            qtinst->m_methods.insert(name, WriteBarrier<JSObject>(exec->globalData(), qtinst->createRuntimeObject(exec), val));
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return val;
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsUndefined();
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This functionality is handled by the fallback case above...
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMethodList QtClass::methodsNamed(const Identifier&, Instance*) const
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return MethodList();
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ### we may end up with a different search order than QtScript by not
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// folding this code into the fallbackMethod above, but Fields propagate out
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the binding code
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectField* QtClass::fieldNamed(const Identifier& identifier, Instance* instance) const
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check static properties first
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QtInstance* qtinst = static_cast<QtInstance*>(instance);
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QObject* obj = qtinst->getObject();
1326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    const UString& ustring = identifier.ustring();
133f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    const QString name(reinterpret_cast<const QChar*>(ustring.characters()), ustring.length());
1346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    const QByteArray ascii = name.toAscii();
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First check for a cached field
1376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    QtField* f = qtinst->m_fields.value(name);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (obj) {
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (f) {
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We only cache real metaproperties, but we do store the
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // other types so we can delete them later
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (f->fieldType() == QtField::MetaProperty)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return f;
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef QT_NO_PROPERTIES
1465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (f->fieldType() == QtField::DynamicProperty) {
1476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (obj->dynamicPropertyNames().indexOf(ascii) >= 0)
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return f;
1495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                // Dynamic property that disappeared
1505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                qtinst->m_fields.remove(name);
1515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                delete f;
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            else {
1556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                const QList<QObject*>& children = obj->children();
1566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                const int count = children.size();
1576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                for (int index = 0; index < count; ++index) {
1585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                    QObject* child = children.at(index);
1596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    if (child->objectName() == name)
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return f;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Didn't find it, delete it from the cache
1646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                qtinst->m_fields.remove(name);
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                delete f;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        int index = m_metaObject->indexOfProperty(ascii);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (index >= 0) {
1716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            const QMetaProperty prop = m_metaObject->property(index);
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (prop.isScriptable(obj)) {
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                f = new QtField(prop);
1756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                qtinst->m_fields.insert(name, f);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return f;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef QT_NO_PROPERTIES
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Dynamic properties
1826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        index = obj->dynamicPropertyNames().indexOf(ascii);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (index >= 0) {
1846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            f = new QtField(ascii);
1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            qtinst->m_fields.insert(name, f);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return f;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Child objects
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        const QList<QObject*>& children = obj->children();
1936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        const int count = children.count();
1946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        for (index = 0; index < count; ++index) {
1955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            QObject* child = children.at(index);
1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            if (child->objectName() == name) {
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                f = new QtField(child);
1986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                qtinst->m_fields.insert(name, f);
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return f;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Nothing named this
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
2055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
2065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // For compatibility with qtscript, cached methods don't cause
2075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // errors until they are accessed, so don't blindly create an error
2085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // here.
2095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (qtinst->m_methods.contains(ascii))
2105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        return 0;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef QT_NO_PROPERTIES
2135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // deleted qobject, but can't throw an error from here (no exec)
2145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // create a fake QtField that will throw upon access
2155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (!f) {
2165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        f = new QtField(ascii);
2175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        qtinst->m_fields.insert(name, f);
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
2205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    return f;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
226