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