From 98474002ad4b10e39df6e151e1595b5f48afe68a Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Thu, 28 Jan 2010 14:11:56 +0100 Subject: [PATCH] Store all the object-based values in the QML/JS interpreter. --- src/libs/qmljs/qmljsinterpreter.cpp | 41 +++++++++-------------------- src/libs/qmljs/qmljsinterpreter.h | 7 +++-- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index e04fee48162..4c440b7f681 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -127,7 +127,6 @@ public: MetaFunction(const QMetaMethod &method, Engine *engine) : FunctionValue(engine), _method(method) { - engine->registerObject(this); } virtual const Value *returnValue() const @@ -748,8 +747,11 @@ bool MemberProcessor::processGeneratedSlot(const QString &, const Value *) } ObjectValue::ObjectValue(Engine *engine) - : _engine(engine), _prototype(0), _scope(0) + : _engine(engine), + _prototype(0), + _scope(0) { + engine->registerObject(this); } ObjectValue::~ObjectValue() @@ -869,9 +871,8 @@ const Value *ObjectValue::lookupMember(const QString &name) const return 0; } -Activation::Activation(Engine *engine) - : ObjectValue(engine), - _thisObject(0), +Activation::Activation() + : _thisObject(0), _calledAsFunction(true) { } @@ -931,7 +932,7 @@ FunctionValue::~FunctionValue() const Value *FunctionValue::construct(const ValueList &actuals) const { - Activation activation(engine()); // ### FIXME: create on the heap + Activation activation; activation.setCalledAsConstructor(true); activation.setThisObject(engine()->newObject()); activation.setArguments(actuals); @@ -940,7 +941,7 @@ const Value *FunctionValue::construct(const ValueList &actuals) const const Value *FunctionValue::call(const ValueList &actuals) const { - Activation activation(engine()); // ### FIXME: create on the heap + Activation activation; activation.setCalledAsFunction(true); activation.setThisObject(engine()->globalObject()); // ### FIXME: it should be `null' activation.setArguments(actuals); @@ -949,7 +950,7 @@ const Value *FunctionValue::call(const ValueList &actuals) const const Value *FunctionValue::call(const ObjectValue *thisObject, const ValueList &actuals) const { - Activation activation(engine()); // ### FIXME: create on the heap + Activation activation; activation.setCalledAsFunction(true); activation.setThisObject(const_cast<ObjectValue *>(thisObject)); // ### FIXME: remove the const_cast activation.setArguments(actuals); @@ -1316,10 +1317,7 @@ Engine::Engine() Engine::~Engine() { - QList<ObjectValue *>::iterator it = _objects.begin(); - - for (; it != _objects.end(); ++it) - delete *it; + qDeleteAll(_registeredObjects); } const NullValue *Engine::nullValue() const @@ -1361,14 +1359,13 @@ ObjectValue *Engine::newObject(const ObjectValue *prototype) { ObjectValue *object = new ObjectValue(this); object->setPrototype(prototype); - _objects.push_back(object); return object; } -Function *Engine::newFunction() { +Function *Engine::newFunction() +{ Function *function = new Function(this); function->setPrototype(functionPrototype()); - _objects.push_back(function); return function; } @@ -1464,7 +1461,7 @@ const ObjectValue *Engine::mathObject() const void Engine::registerObject(ObjectValue *object) { - _objects.append(object); + _registeredObjects.append(object); } const Value *Engine::convertToBoolean(const Value *value) @@ -1527,42 +1524,34 @@ void Engine::initializePrototypes() // set up the default Object prototype _objectCtor = new ObjectCtor(this); _objectCtor->setPrototype(_functionPrototype); - _objects.push_back(_objectCtor); _objectCtor->setProperty("prototype", _objectPrototype); _functionCtor = new FunctionCtor(this); _functionCtor->setPrototype(_functionPrototype); - _objects.push_back(_functionCtor); _functionCtor->setProperty("prototype", _functionPrototype); _arrayCtor = new ArrayCtor(this); _arrayCtor->setPrototype(_functionPrototype); - _objects.push_back(_arrayCtor); _arrayCtor->setProperty("prototype", _arrayPrototype); _stringCtor = new StringCtor(this); _stringCtor->setPrototype(_functionPrototype); - _objects.push_back(_stringCtor); _stringCtor->setProperty("prototype", _stringPrototype); _booleanCtor = new BooleanCtor(this); _booleanCtor->setPrototype(_functionPrototype); - _objects.push_back(_booleanCtor); _booleanCtor->setProperty("prototype", _booleanPrototype); _numberCtor = new NumberCtor(this); _numberCtor->setPrototype(_functionPrototype); - _objects.push_back(_numberCtor); _numberCtor->setProperty("prototype", _numberPrototype); _dateCtor = new DateCtor(this); _dateCtor->setPrototype(_functionPrototype); - _objects.push_back(_dateCtor); _dateCtor->setProperty("prototype", _datePrototype); _regexpCtor = new RegExpCtor(this); _regexpCtor->setPrototype(_functionPrototype); - _objects.push_back(_regexpCtor); _regexpCtor->setProperty("prototype", _regexpPrototype); addFunction(_objectCtor, "getPrototypeOf", 1); @@ -1764,7 +1753,6 @@ void Engine::initializePrototypes() #ifndef NO_DECLARATIVE_BACKEND _qmlKeysObject = new QmlAttachedKeys(this); _globalObject->setProperty("Keys", _qmlKeysObject); // ### attach it to the current scope, and not to the global object - registerObject(_qmlKeysObject); #endif } @@ -1795,11 +1783,9 @@ QmlObjectValue *Engine::newQmlObject(const QString &name, const QString &prefix, { if (name == QLatin1String("QmlGraphicsAnchors")) { QmlObjectValue *object = new QmlObjectValue(&QmlGraphicsAnchors::staticMetaObject, QLatin1String("Anchors"), -1, -1, this); - _objects.append(object); return object; } else if (name == QLatin1String("QmlGraphicsPen")) { QmlObjectValue *object = new QmlObjectValue(&QmlGraphicsPen::staticMetaObject, QLatin1String("Pen"), -1, -1, this); - _objects.append(object); return object; } else if (name == QLatin1String("QmlGraphicsScaleGrid")) { QmlObjectValue *object = new QmlObjectValue(&QObject::staticMetaObject, QLatin1String("ScaleGrid"), -1, -1, this); @@ -1817,7 +1803,6 @@ QmlObjectValue *Engine::newQmlObject(const QString &name, const QString &prefix, const QString typeName = qmlType->qmlTypeName(); const QString strippedTypeName = typeName.mid(typeName.lastIndexOf('/') + 1); QmlObjectValue *object = new QmlObjectValue(qmlType->metaObject(), strippedTypeName, majorVersion, minorVersion, this); - _objects.append(object); return object; } diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index ea61857770c..cb0291caa8f 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -281,10 +281,10 @@ private: #endif // !NO_DECLARATIVE_BACKEND -class QMLJS_EXPORT Activation: public ObjectValue +class QMLJS_EXPORT Activation { public: - Activation(Engine *engine); + Activation(); virtual ~Activation(); bool calledAsConstructor() const; @@ -514,7 +514,6 @@ public: const MetaTypeSystem &metaTypeSystem() const { return _metaTypeSystem; } - private: void initializePrototypes(); @@ -551,7 +550,7 @@ private: NumberValue _numberValue; BooleanValue _booleanValue; StringValue _stringValue; - QList<ObjectValue *> _objects; + QList<ObjectValue *> _registeredObjects; ConvertToNumber _convertToNumber; ConvertToString _convertToString; -- GitLab