diff options
Diffstat (limited to 'src/qml/qml')
38 files changed, 1358 insertions, 1264 deletions
diff --git a/src/qml/qml/ftw/qhashedstring_p.h b/src/qml/qml/ftw/qhashedstring_p.h index 61a492013d..57217a6bf8 100644 --- a/src/qml/qml/ftw/qhashedstring_p.h +++ b/src/qml/qml/ftw/qhashedstring_p.h @@ -245,7 +245,7 @@ public: } inline bool equals(const QV4::String *string) const { - if (length != string->length() || hash != string->hashValue()) + if (length != string->d()->length() || hash != string->hashValue()) return false; if (isQString()) { QStringDataPtr dd; diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 721f2cc5a8..86cb395c3d 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -198,6 +198,44 @@ int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMin return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } +template<typename T, typename E> +int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) +{ + QML_GETTYPENAMES + + QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc<E>(); + const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject<E>(); + if (!attached) { + attached = QQmlPrivate::attachedPropertiesFunc<T>(); + attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject<T>(); + } + + QQmlPrivate::RegisterType type = { + 0, + + qRegisterNormalizedMetaType<T *>(pointerName.constData()), + qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()), + 0, 0, + reason, + + uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject, + + attached, + attachedMetaObject, + + QQmlPrivate::StaticCastSelector<T,QQmlParserStatus>::cast(), + QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), + QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), + + QQmlPrivate::createParent<E>, &E::staticMetaObject, + + 0, + 0 + }; + + return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); +} + template<typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { @@ -414,6 +452,45 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } +template<typename T, typename E> +int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int versionMinor, + const char *qmlName, QQmlCustomParser *parser) +{ + QML_GETTYPENAMES + + QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc<E>(); + const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject<E>(); + if (!attached) { + attached = QQmlPrivate::attachedPropertiesFunc<T>(); + attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject<T>(); + } + + QQmlPrivate::RegisterType type = { + 0, + + qRegisterNormalizedMetaType<T *>(pointerName.constData()), + qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()), + sizeof(T), QQmlPrivate::createInto<T>, + QString(), + + uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject, + + attached, + attachedMetaObject, + + QQmlPrivate::StaticCastSelector<T,QQmlParserStatus>::cast(), + QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), + QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), + + QQmlPrivate::createParent<E>, &E::staticMetaObject, + + parser, + 0 + }; + + return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); +} + class QQmlContext; class QQmlEngine; class QJSValue; diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index 571d78312e..1ba7a8091d 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -71,34 +71,6 @@ QQmlAbstractBinding::VTable QQmlBinding_vtable = { QQmlBinding::Identifier QQmlBinding::Invalid = -1; -QQmlBinding * -QQmlBinding::createBinding(Identifier id, QObject *obj, QQmlContext *ctxt) -{ - if (id < 0) - return 0; - - QQmlBinding *rv = 0; - - QQmlContextData *ctxtdata = QQmlContextData::get(ctxt); - QQmlEnginePrivate *engine = QQmlEnginePrivate::get(ctxt->engine()); - if (engine && ctxtdata && !ctxtdata->url.isEmpty()) { - QQmlTypeData *typeData = engine->typeLoader.getType(ctxtdata->url); - Q_ASSERT(typeData); - - if (QQmlCompiledData *cdata = typeData->compiledData()) { - QV4::ExecutionEngine *v4 = engine->v4engine(); - QV4::Scope valueScope(v4); - QV4::Function *runtimeFunction = cdata->compilationUnit->runtimeFunctions[cdata->customParserBindings[id]]; - QV4::ScopedValue function(valueScope, QV4::QmlBindingWrapper::createQmlCallableForFunction(ctxtdata, obj, runtimeFunction)); - rv = new QQmlBinding(function, obj, ctxtdata); - } - - typeData->release(); - } - - return rv; -} - static QQmlJavaScriptExpression::VTable QQmlBinding_jsvtable = { QQmlBinding::expressionIdentifier, QQmlBinding::expressionChanged @@ -134,7 +106,7 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte Q_ASSERT(typeData); if (QQmlCompiledData *cdata = typeData->compiledData()) { - url = cdata->name; + url = cdata->fileName(); if (scriptPrivate->bindingId != QQmlBinding::Invalid) runtimeFunction = cdata->compilationUnit->runtimeFunctions.at(scriptPrivate->bindingId); } @@ -213,13 +185,13 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags) QV4::Scope scope(ep->v4engine()); QV4::ScopedFunctionObject f(scope, v4function.value()); Q_ASSERT(f); - if (f->bindingKeyFlag) { - QQmlSourceLocation loc = f->as<QV4::QQmlBindingFunction>()->bindingLocation; + if (f->bindingKeyFlag()) { + QQmlSourceLocation loc = f->as<QV4::QQmlBindingFunction>()->d()->bindingLocation; url = loc.sourceFile; lineNumber = loc.line; columnNumber = loc.column; } else { - QV4::Function *function = f->asFunctionObject()->function; + QV4::Function *function = f->asFunctionObject()->function(); Q_ASSERT(function); url = function->sourceFile(); @@ -312,7 +284,7 @@ QString QQmlBinding::expressionIdentifier(QQmlJavaScriptExpression *e) QQmlEnginePrivate *ep = QQmlEnginePrivate::get(This->context()->engine); QV4::Scope scope(ep->v4engine()); QV4::ScopedValue f(scope, This->v4function.value()); - QV4::Function *function = f->asFunctionObject()->function; + QV4::Function *function = f->asFunctionObject()->function(); QString url = function->sourceFile(); quint16 lineNumber = function->compiledFunction->location.line; diff --git a/src/qml/qml/qqmlbinding_p.h b/src/qml/qml/qqmlbinding_p.h index 3c2c832e0c..879129fe85 100644 --- a/src/qml/qml/qqmlbinding_p.h +++ b/src/qml/qml/qqmlbinding_p.h @@ -112,8 +112,6 @@ public: typedef int Identifier; static Identifier Invalid; - static QQmlBinding *createBinding(Identifier, QObject *, QQmlContext *); - QVariant evaluate(); static QString expressionIdentifier(QQmlJavaScriptExpression *); diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index 876f367097..cec5c31898 100644 --- a/src/qml/qml/qqmlboundsignal.cpp +++ b/src/qml/qml/qqmlboundsignal.cpp @@ -190,7 +190,7 @@ QV4::Function *QQmlBoundSignalExpression::function() const Q_ASSERT (context() && engine()); QV4::Scope scope(QQmlEnginePrivate::get(engine())->v4engine()); QV4::Scoped<QV4::FunctionObject> v(scope, m_v8function.value()); - return v ? v->function : 0; + return v ? v->function() : 0; } return 0; } diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h index f3b6f621ce..129d312ad1 100644 --- a/src/qml/qml/qqmlcompiler_p.h +++ b/src/qml/qml/qqmlcompiler_p.h @@ -91,8 +91,8 @@ public: QQmlEngine *engine; - QString name; - QUrl url; + QString fileName() const { return compilationUnit->fileName(); } + QUrl url() const { return QUrl(fileName()); } QQmlTypeNameCache *importCache; int metaTypeId; @@ -136,13 +136,8 @@ public: // index in first hash is component index, hash inside maps from object index in that scope to integer id QHash<int, QHash<int, int> > objectIndexToIdPerComponent; QHash<int, int> objectIndexToIdForRoot; - // hash key is object index - struct CustomParserData { - QByteArray compilationArtifact; // produced by custom parser - QBitArray bindings; // bindings covered by the custom parser - }; - QHash<int, CustomParserData> customParserData; - QVector<int> customParserBindings; // index is binding identifier, value is compiled function index. + // hash key is object index, value is indicies of bindings covered by custom parser + QHash<int, QBitArray> customParserBindings; QHash<int, QBitArray> deferredBindingsPerObject; // index is object index int totalBindingsCount; // Number of bindings used in this type int totalParserStatusCount; // Number of instantiated types that are QQmlParserStatus subclasses @@ -154,9 +149,6 @@ public: bool isInitialized() const { return hasEngine(); } void initialize(QQmlEngine *); - QV4::Function *functionForBindingId(int bindingId) const - { return compilationUnit->runtimeFunctions[customParserBindings[bindingId]]; } - protected: virtual void destroy(); // From QQmlRefCount virtual void clear(); // From QQmlCleanup diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index b5af502a10..e087785901 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -592,7 +592,7 @@ QQmlComponent::QQmlComponent(QQmlEngine *engine, QQmlCompiledData *cc, int start d->cc = cc; cc->addref(); d->start = start; - d->url = cc->url; + d->url = cc->url(); d->progress = 1.0; } @@ -1079,11 +1079,18 @@ void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context, class QQmlComponentIncubator; -class QmlIncubatorObject : public QV4::Object +struct QmlIncubatorObject : public QV4::Object { - V4_OBJECT -public: - QmlIncubatorObject(QV8Engine *engine, QQmlIncubator::IncubationMode = QQmlIncubator::Asynchronous); + struct Data : QV4::Object::Data { + Data(QV8Engine *engine, QQmlIncubator::IncubationMode = QQmlIncubator::Asynchronous); + QScopedPointer<QQmlComponentIncubator> incubator; + QV8Engine *v8; + QPointer<QObject> parent; + QV4::Value valuemap; + QV4::Value qmlGlobal; + QV4::Value statusChanged; + }; + V4_OBJECT(QV4::Object) static QV4::ReturnedValue method_get_statusChanged(QV4::CallContext *ctx); static QV4::ReturnedValue method_set_statusChanged(QV4::CallContext *ctx); @@ -1094,13 +1101,6 @@ public: static void destroy(Managed *that); static void markObjects(Managed *that, QV4::ExecutionEngine *e); - QScopedPointer<QQmlComponentIncubator> incubator; - QV8Engine *v8; - QPointer<QObject> parent; - QV4::Value valuemap; - QV4::Value qmlGlobal; - QV4::Value m_statusChanged; - void statusChanged(QQmlIncubator::Status); void setInitialState(QObject *); }; @@ -1110,20 +1110,24 @@ DEFINE_OBJECT_VTABLE(QmlIncubatorObject); class QQmlComponentIncubator : public QQmlIncubator { public: - QQmlComponentIncubator(QmlIncubatorObject *inc, IncubationMode mode) + QQmlComponentIncubator(QmlIncubatorObject::Data *inc, IncubationMode mode) : QQmlIncubator(mode) , incubatorObject(inc) {} virtual void statusChanged(Status s) { - incubatorObject->statusChanged(s); + QV4::Scope scope(incubatorObject->internalClass->engine); + QV4::Scoped<QmlIncubatorObject> i(scope, incubatorObject); + i->statusChanged(s); } virtual void setInitialState(QObject *o) { - incubatorObject->setInitialState(o); + QV4::Scope scope(incubatorObject->internalClass->engine); + QV4::Scoped<QmlIncubatorObject> i(scope, incubatorObject); + i->setInitialState(o); } - QmlIncubatorObject *incubatorObject; + QmlIncubatorObject::Data *incubatorObject; }; @@ -1359,17 +1363,17 @@ void QQmlComponent::incubateObject(QQmlV4Function *args) QQmlComponentExtension *e = componentExtension(args->engine()); - QV4::Scoped<QmlIncubatorObject> r(scope, new (v4->memoryManager) QmlIncubatorObject(args->engine(), mode)); + QV4::Scoped<QmlIncubatorObject> r(scope, v4->memoryManager->alloc<QmlIncubatorObject>(args->engine(), mode)); QV4::ScopedObject p(scope, e->incubationProto.value()); r->setPrototype(p.getPointer()); if (!valuemap->isUndefined()) { - r->valuemap = valuemap; - r->qmlGlobal = args->qmlGlobal(); + r->d()->valuemap = valuemap; + r->d()->qmlGlobal = args->qmlGlobal(); } - r->parent = parent; + r->d()->parent = parent; - QQmlIncubator *incubator = r.getPointer()->incubator.data(); + QQmlIncubator *incubator = r.getPointer()->d()->incubator.data(); create(*incubator, creationContext()); if (incubator->status() == QQmlIncubator::Null) { @@ -1419,21 +1423,21 @@ QQmlComponentExtension::QQmlComponentExtension(QV8Engine *engine) QV4::ReturnedValue QmlIncubatorObject::method_get_object(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QmlIncubatorObject> o(scope, ctx->callData->thisObject.as<QmlIncubatorObject>()); + QV4::Scoped<QmlIncubatorObject> o(scope, ctx->d()->callData->thisObject.as<QmlIncubatorObject>()); if (!o) return ctx->throwTypeError(); - return QV4::QObjectWrapper::wrap(ctx->engine, o->incubator->object()); + return QV4::QObjectWrapper::wrap(ctx->d()->engine, o->d()->incubator->object()); } QV4::ReturnedValue QmlIncubatorObject::method_forceCompletion(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QmlIncubatorObject> o(scope, ctx->callData->thisObject.as<QmlIncubatorObject>()); + QV4::Scoped<QmlIncubatorObject> o(scope, ctx->d()->callData->thisObject.as<QmlIncubatorObject>()); if (!o) return ctx->throwTypeError(); - o->incubator->forceCompletion(); + o->d()->incubator->forceCompletion(); return QV4::Encode::undefined(); } @@ -1441,32 +1445,32 @@ QV4::ReturnedValue QmlIncubatorObject::method_forceCompletion(QV4::CallContext * QV4::ReturnedValue QmlIncubatorObject::method_get_status(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QmlIncubatorObject> o(scope, ctx->callData->thisObject.as<QmlIncubatorObject>()); + QV4::Scoped<QmlIncubatorObject> o(scope, ctx->d()->callData->thisObject.as<QmlIncubatorObject>()); if (!o) return ctx->throwTypeError(); - return QV4::Encode(o->incubator->status()); + return QV4::Encode(o->d()->incubator->status()); } QV4::ReturnedValue QmlIncubatorObject::method_get_statusChanged(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QmlIncubatorObject> o(scope, ctx->callData->thisObject.as<QmlIncubatorObject>()); + QV4::Scoped<QmlIncubatorObject> o(scope, ctx->d()->callData->thisObject.as<QmlIncubatorObject>()); if (!o) return ctx->throwTypeError(); - return o->m_statusChanged.asReturnedValue(); + return o->d()->statusChanged.asReturnedValue(); } QV4::ReturnedValue QmlIncubatorObject::method_set_statusChanged(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QmlIncubatorObject> o(scope, ctx->callData->thisObject.as<QmlIncubatorObject>()); - if (!o || ctx->callData->argc < 1) + QV4::Scoped<QmlIncubatorObject> o(scope, ctx->d()->callData->thisObject.as<QmlIncubatorObject>()); + if (!o || ctx->d()->callData->argc < 1) return ctx->throwTypeError(); - o->m_statusChanged = ctx->callData->args[0]; + o->d()->statusChanged = ctx->d()->callData->args[0]; return QV4::Encode::undefined(); } @@ -1474,65 +1478,63 @@ QQmlComponentExtension::~QQmlComponentExtension() { } -QmlIncubatorObject::QmlIncubatorObject(QV8Engine *engine, QQmlIncubator::IncubationMode m) - : Object(QV8Engine::getV4(engine)) +QmlIncubatorObject::Data::Data(QV8Engine *engine, QQmlIncubator::IncubationMode m) + : Object::Data(QV8Engine::getV4(engine)) + , v8(engine) + , valuemap(QV4::Primitive::undefinedValue()) + , qmlGlobal(QV4::Primitive::undefinedValue()) + , statusChanged(QV4::Primitive::undefinedValue()) { - incubator.reset(new QQmlComponentIncubator(this, m)); - v8 = engine; setVTable(staticVTable()); - valuemap = QV4::Primitive::undefinedValue(); - qmlGlobal = QV4::Primitive::undefinedValue(); - m_statusChanged = QV4::Primitive::undefinedValue(); + incubator.reset(new QQmlComponentIncubator(this, m)); } void QmlIncubatorObject::setInitialState(QObject *o) { - QQmlComponent_setQmlParent(o, parent); + QQmlComponent_setQmlParent(o, d()->parent); - if (!valuemap.isUndefined()) { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(v8); + if (!d()->valuemap.isUndefined()) { + QV4::ExecutionEngine *v4 = QV8Engine::getV4(d()->v8); QV4::Scope scope(v4); - QV4::Scoped<QV4::FunctionObject> f(scope, QV4::Script::evaluate(v4, QString::fromLatin1(INITIALPROPERTIES_SOURCE), qmlGlobal)); + QV4::Scoped<QV4::FunctionObject> f(scope, QV4::Script::evaluate(v4, QString::fromLatin1(INITIALPROPERTIES_SOURCE), d()->qmlGlobal.asObject())); QV4::ScopedCallData callData(scope, 2); callData->thisObject = v4->globalObject; callData->args[0] = QV4::QObjectWrapper::wrap(v4, o); - callData->args[1] = valuemap; + callData->args[1] = d()->valuemap; f->call(callData); } } void QmlIncubatorObject::destroy(Managed *that) { - QmlIncubatorObject *o = that->as<QmlIncubatorObject>(); - Q_ASSERT(o); - o->~QmlIncubatorObject(); + that->as<QmlIncubatorObject>()->d()->~Data(); } void QmlIncubatorObject::markObjects(QV4::Managed *that, QV4::ExecutionEngine *e) { QmlIncubatorObject *o = that->as<QmlIncubatorObject>(); Q_ASSERT(o); - o->valuemap.mark(e); - o->qmlGlobal.mark(e); - o->m_statusChanged.mark(e); + o->d()->valuemap.mark(e); + o->d()->qmlGlobal.mark(e); + o->d()->statusChanged.mark(e); Object::markObjects(that, e); } void QmlIncubatorObject::statusChanged(QQmlIncubator::Status s) { - QV4::Scope scope(QV8Engine::getV4(v8)); + QV4::Scope scope(QV8Engine::getV4(d()->v8)); // hold the incubated object in a scoped value to prevent it's destruction before this method returns - QV4::ScopedObject incubatedObject(scope, QV4::QObjectWrapper::wrap(scope.engine, incubator->object())); + QV4::ScopedObject incubatedObject(scope, QV4::QObjectWrapper::wrap(scope.engine, d()->incubator->object())); if (s == QQmlIncubator::Ready) { - Q_ASSERT(QQmlData::get(incubator->object())); - QQmlData::get(incubator->object())->explicitIndestructibleSet = false; - QQmlData::get(incubator->object())->indestructible = false; + Q_ASSERT(QQmlData::get(d()->incubator->object())); + QQmlData::get(d()->incubator->object())->explicitIndestructibleSet = false; + QQmlData::get(d()->incubator->object())->indestructible = false; } - QV4::ScopedFunctionObject f(scope, m_statusChanged); + QV4::ScopedFunctionObject f(scope, d()->statusChanged); if (f) { QV4::ExecutionContext *ctx = scope.engine->currentContext(); QV4::ScopedCallData callData(scope, 1); @@ -1541,7 +1543,7 @@ void QmlIncubatorObject::statusChanged(QQmlIncubator::Status s) f->call(callData); if (scope.hasException()) { QQmlError error = QV4::ExecutionEngine::catchExceptionAsQmlError(ctx); - QQmlEnginePrivate::warning(QQmlEnginePrivate::get(v8->engine()), error); + QQmlEnginePrivate::warning(QQmlEnginePrivate::get(d()->v8->engine()), error); } } } diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index a5574b706a..83ef8c6230 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -61,15 +61,18 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(QmlContextWrapper); -QmlContextWrapper::QmlContextWrapper(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext) - : Object(QV8Engine::getV4(engine)), - readOnly(true), ownsContext(ownsContext), isNullWrapper(false), - context(context), scopeObject(scopeObject), idObjectsWrapper(0) +QmlContextWrapper::Data::Data(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext) + : Object::Data(QV8Engine::getV4(engine)) + , readOnly(true) + , ownsContext(ownsContext) + , isNullWrapper(false) + , context(context) + , scopeObject(scopeObject) { setVTable(staticVTable()); } -QmlContextWrapper::~QmlContextWrapper() +QmlContextWrapper::Data::~Data() { if (context && ownsContext) context->destroy(); @@ -80,7 +83,7 @@ ReturnedValue QmlContextWrapper::qmlScope(QV8Engine *v8, QQmlContextData *ctxt, ExecutionEngine *v4 = QV8Engine::getV4(v8); Scope valueScope(v4); - Scoped<QmlContextWrapper> w(valueScope, new (v4->memoryManager) QmlContextWrapper(v8, ctxt, scope)); + Scoped<QmlContextWrapper> w(valueScope, v4->memoryManager->alloc<QmlContextWrapper>(v8, ctxt, scope)); return w.asReturnedValue(); } @@ -94,8 +97,8 @@ ReturnedValue QmlContextWrapper::urlScope(QV8Engine *v8, const QUrl &url) context->isInternal = true; context->isJSContext = true; - Scoped<QmlContextWrapper> w(scope, new (v4->memoryManager) QmlContextWrapper(v8, context, 0, true)); - w->isNullWrapper = true; + Scoped<QmlContextWrapper> w(scope, v4->memoryManager->alloc<QmlContextWrapper>(v8, context, (QObject*)0, true)); + w->d()->isNullWrapper = true; return w.asReturnedValue(); } @@ -127,11 +130,11 @@ void QmlContextWrapper::takeContextOwnership(const ValueRef qmlglobal) Scope scope(v4); QV4::Scoped<QmlContextWrapper> c(scope, qmlglobal); Q_ASSERT(c); - c->ownsContext = true; + c->d()->ownsContext = true; } -ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *hasProperty) +ReturnedValue QmlContextWrapper::get(Managed *m, String *name, bool *hasProperty) { QV4::ExecutionEngine *v4 = m->engine(); QV4::Scope scope(v4); @@ -149,10 +152,10 @@ ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *has return result.asReturnedValue(); } - if (resource->isNullWrapper) + if (resource->d()->isNullWrapper) return Object::get(m, name, hasProperty); - if (QV4::QmlContextWrapper::callingContext(v4) != resource->context) + if (QV4::QmlContextWrapper::callingContext(v4) != resource->d()->context) return Object::get(m, name, hasProperty); result = Object::get(m, name, &hasProp); @@ -211,7 +214,7 @@ ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *has while (context) { // Search context properties if (context->propertyNames.count()) { - int propertyIdx = context->propertyNames.value(name.getPointer()); + int propertyIdx = context->propertyNames.value(name); if (propertyIdx != -1) { @@ -247,7 +250,7 @@ ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *has if (scopeObject) { bool hasProp = false; QV4::ScopedValue result(scope, QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, scopeObject, - name.getPointer(), QV4::QObjectWrapper::CheckRevision, &hasProp)); + name, QV4::QObjectWrapper::CheckRevision, &hasProp)); if (hasProp) { if (hasProperty) *hasProperty = true; @@ -260,7 +263,7 @@ ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *has // Search context object if (context->contextObject) { bool hasProp = false; - result = QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, context->contextObject, name.getPointer(), QV4::QObjectWrapper::CheckRevision, &hasProp); + result = QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, context->contextObject, name, QV4::QObjectWrapper::CheckRevision, &hasProp); if (hasProp) { if (hasProperty) *hasProperty = true; @@ -276,7 +279,7 @@ ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *has return Primitive::undefinedValue().asReturnedValue(); } -void QmlContextWrapper::put(Managed *m, const StringRef name, const ValueRef value) +void QmlContextWrapper::put(Managed *m, String *name, const ValueRef value) { ExecutionEngine *v4 = m->engine(); QV4::Scope scope(v4); @@ -295,11 +298,11 @@ void QmlContextWrapper::put(Managed *m, const StringRef name, const ValueRef val return; } - if (wrapper->isNullWrapper) { - if (wrapper && wrapper->readOnly) { + if (wrapper->d()->isNullWrapper) { + if (wrapper && wrapper->d()->readOnly) { QString error = QLatin1String("Invalid write to global property \"") + name->toQString() + QLatin1Char('"'); - Scoped<String> e(scope, v4->currentContext()->engine->newString(error)); + Scoped<String> e(scope, v4->currentContext()->d()->engine->newString(error)); v4->currentContext()->throwError(e); return; } @@ -322,18 +325,18 @@ void QmlContextWrapper::put(Managed *m, const StringRef name, const ValueRef val while (context) { // Search context properties - if (context->propertyNames.count() && -1 != context->propertyNames.value(name.getPointer())) + if (context->propertyNames.count() && -1 != context->propertyNames.value(name)) return; // Search scope object if (scopeObject && - QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, scopeObject, name.getPointer(), QV4::QObjectWrapper::CheckRevision, value)) + QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, scopeObject, name, QV4::QObjectWrapper::CheckRevision, value)) return; scopeObject = 0; // Search context object if (context->contextObject && - QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, context->contextObject, name.getPointer(), QV4::QObjectWrapper::CheckRevision, value)) + QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, context->contextObject, name, QV4::QObjectWrapper::CheckRevision, value)) return; context = context->parent; @@ -341,7 +344,7 @@ void QmlContextWrapper::put(Managed *m, const StringRef name, const ValueRef val expressionContext->unresolvedNames = true; - if (wrapper->readOnly) { + if (wrapper->d()->readOnly) { QString error = QLatin1String("Invalid write to global property \"") + name->toQString() + QLatin1Char('"'); v4->currentContext()->throwError(error); @@ -353,14 +356,14 @@ void QmlContextWrapper::put(Managed *m, const StringRef name, const ValueRef val void QmlContextWrapper::destroy(Managed *that) { - static_cast<QmlContextWrapper *>(that)->~QmlContextWrapper(); + static_cast<QmlContextWrapper *>(that)->d()->~Data(); } void QmlContextWrapper::markObjects(Managed *m, ExecutionEngine *engine) { QmlContextWrapper *This = static_cast<QmlContextWrapper*>(m); - if (This->idObjectsWrapper) - This->idObjectsWrapper->mark(engine); + if (This->d()->idObjectsWrapper) + This->d()->idObjectsWrapper->mark(engine); Object::markObjects(m, engine); } @@ -409,19 +412,21 @@ void QmlContextWrapper::registerQmlDependencies(ExecutionEngine *engine, const C ReturnedValue QmlContextWrapper::idObjectsArray() { - if (!idObjectsWrapper) { + if (!d()->idObjectsWrapper) { ExecutionEngine *v4 = engine(); - idObjectsWrapper = new (v4->memoryManager) QQmlIdObjectsArray(v4, this); + Scope scope(v4); + Scoped<QQmlIdObjectsArray> a(scope, v4->memoryManager->alloc<QQmlIdObjectsArray>(v4, this)); + d()->idObjectsWrapper = a.getPointer(); } - return idObjectsWrapper->asReturnedValue(); + return d()->idObjectsWrapper->asReturnedValue(); } -ReturnedValue QmlContextWrapper::qmlSingletonWrapper(QV8Engine *v8, const StringRef &name) +ReturnedValue QmlContextWrapper::qmlSingletonWrapper(QV8Engine *v8, String *name) { - if (!context->imports) + if (!d()->context->imports) return Encode::undefined(); // Search for attached properties, enums and imported scripts - QQmlTypeNameCache::Result r = context->imports->query(name); + QQmlTypeNameCache::Result r = d()->context->imports->query(name); Q_ASSERT(r.isValid()); Q_ASSERT(r.type); @@ -439,8 +444,8 @@ ReturnedValue QmlContextWrapper::qmlSingletonWrapper(QV8Engine *v8, const String DEFINE_OBJECT_VTABLE(QQmlIdObjectsArray); -QQmlIdObjectsArray::QQmlIdObjectsArray(ExecutionEngine *engine, QmlContextWrapper *contextWrapper) - : Object(engine) +QQmlIdObjectsArray::Data::Data(ExecutionEngine *engine, QmlContextWrapper *contextWrapper) + : Object::Data(engine) , contextWrapper(contextWrapper) { setVTable(staticVTable()); @@ -449,7 +454,7 @@ QQmlIdObjectsArray::QQmlIdObjectsArray(ExecutionEngine *engine, QmlContextWrappe ReturnedValue QQmlIdObjectsArray::getIndexed(Managed *m, uint index, bool *hasProperty) { QQmlIdObjectsArray *This = static_cast<QQmlIdObjectsArray*>(m); - QQmlContextData *context = This->contextWrapper->getContext(); + QQmlContextData *context = This->d()->contextWrapper->getContext(); if (!context) { if (hasProperty) *hasProperty = false; @@ -475,7 +480,7 @@ ReturnedValue QQmlIdObjectsArray::getIndexed(Managed *m, uint index, bool *hasPr void QQmlIdObjectsArray::markObjects(Managed *that, ExecutionEngine *engine) { QQmlIdObjectsArray *This = static_cast<QQmlIdObjectsArray*>(that); - This->contextWrapper->mark(engine); + This->d()->contextWrapper->mark(engine); Object::markObjects(that, engine); } diff --git a/src/qml/qml/qqmlcontextwrapper_p.h b/src/qml/qml/qqmlcontextwrapper_p.h index 3facf71aa0..d6f25ac79a 100644 --- a/src/qml/qml/qqmlcontextwrapper_p.h +++ b/src/qml/qml/qqmlcontextwrapper_p.h @@ -73,9 +73,18 @@ struct QQmlIdObjectsArray; struct Q_QML_EXPORT QmlContextWrapper : Object { - V4_OBJECT - QmlContextWrapper(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext = false); - ~QmlContextWrapper(); + struct Data : Object::Data { + Data(QV8Engine *engine, QQmlContextData *context, QObject *scopeObject, bool ownsContext = false); + ~Data(); + bool readOnly; + bool ownsContext; + bool isNullWrapper; + + QQmlGuardedContextData context; + QPointer<QObject> scopeObject; + QQmlIdObjectsArray *idObjectsWrapper; + }; + V4_OBJECT(Object) static ReturnedValue qmlScope(QV8Engine *e, QQmlContextData *ctxt, QObject *scope); static ReturnedValue urlScope(QV8Engine *e, const QUrl &); @@ -83,41 +92,35 @@ struct Q_QML_EXPORT QmlContextWrapper : Object static QQmlContextData *callingContext(ExecutionEngine *v4); static void takeContextOwnership(const ValueRef qmlglobal); - inline QObject *getScopeObject() const { return scopeObject; } - inline QQmlContextData *getContext() const { return context; } + inline QObject *getScopeObject() const { return d()->scopeObject; } + inline QQmlContextData *getContext() const { return d()->context; } static QQmlContextData *getContext(const ValueRef value); - void setReadOnly(bool b) { readOnly = b; } + void setReadOnly(bool b) { d()->readOnly = b; } - static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty); - static void put(Managed *m, const StringRef name, const ValueRef value); + static ReturnedValue get(Managed *m, String *name, bool *hasProperty); + static void put(Managed *m, String *name, const ValueRef value); static void destroy(Managed *that); static void markObjects(Managed *m, ExecutionEngine *engine); static void registerQmlDependencies(ExecutionEngine *context, const CompiledData::Function *compiledFunction); ReturnedValue idObjectsArray(); - ReturnedValue qmlSingletonWrapper(QV8Engine *e, const StringRef &name); + ReturnedValue qmlSingletonWrapper(QV8Engine *e, String *name); - bool readOnly; - bool ownsContext; - bool isNullWrapper; - - QQmlGuardedContextData context; - QPointer<QObject> scopeObject; -private: - QQmlIdObjectsArray *idObjectsWrapper; }; struct QQmlIdObjectsArray : public Object { - V4_OBJECT - QQmlIdObjectsArray(ExecutionEngine *engine, QmlContextWrapper *contextWrapper); + struct Data : Object::Data { + Data(ExecutionEngine *engine, QmlContextWrapper *contextWrapper); + QmlContextWrapper *contextWrapper; + }; + V4_OBJECT(Object) static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty); static void markObjects(Managed *that, ExecutionEngine *engine); - QmlContextWrapper *contextWrapper; }; } diff --git a/src/qml/qml/qqmlcustomparser.cpp b/src/qml/qml/qqmlcustomparser.cpp index 75acbdb778..312c4a8a10 100644 --- a/src/qml/qml/qqmlcustomparser.cpp +++ b/src/qml/qml/qqmlcustomparser.cpp @@ -109,6 +109,12 @@ void QQmlCustomParser::error(const QV4::CompiledData::Location &location, const exceptions << error; } +struct StaticQtMetaObject : public QObject +{ + static const QMetaObject *get() + { return &staticQtMetaObject; } +}; + /*! If \a script is a simple enumeration expression (eg. Text.AlignLeft), returns the integer equivalent (eg. 1), and sets \a ok to true. @@ -125,7 +131,34 @@ int QQmlCustomParser::evaluateEnum(const QByteArray& script, bool *ok) const if (dot == -1) return -1; - return compiler->evaluateEnum(QString::fromUtf8(script.left(dot)), script.mid(dot+1), ok); + + QString scope = QString::fromUtf8(script.left(dot)); + QByteArray enumValue = script.mid(dot+1); + + if (scope != QLatin1String("Qt")) { + if (imports.isNull()) + return -1; + QQmlType *type = 0; + + if (imports.isT1()) { + imports.asT1()->resolveType(scope, &type, 0, 0, 0); + } else { + QQmlTypeNameCache::Result result = imports.asT2()->query(scope); + if (result.isValid()) + type = result.type; + } + + return type ? type->enumValue(QHashedCStringRef(enumValue.constData(), enumValue.length()), ok) : -1; + } + + const QMetaObject *mo = StaticQtMetaObject::get(); + int i = mo->enumeratorCount(); + while (i--) { + int v = mo->enumerator(i).keyToValue(enumValue.constData(), ok); + if (*ok) + return v; + } + return -1; } /*! @@ -137,17 +170,6 @@ const QMetaObject *QQmlCustomParser::resolveType(const QString& name) const return compiler->resolveType(name); } -QQmlBinding::Identifier QQmlCustomParser::bindingIdentifier(const QV4::CompiledData::Binding *binding) -{ - return compiler->bindingIdentifier(binding, this); -} - -struct StaticQtMetaObject : public QObject -{ - static const QMetaObject *get() - { return &staticQtMetaObject; } -}; - int QQmlCustomParserCompilerBackend::evaluateEnum(const QString &scope, const QByteArray &enumValue, bool *ok) const { Q_ASSERT_X(ok, "QQmlCompiler::evaluateEnum", "ok must not be a null pointer"); diff --git a/src/qml/qml/qqmlcustomparser_p.h b/src/qml/qml/qqmlcustomparser_p.h index 2ce6375870..9e3f810738 100644 --- a/src/qml/qml/qqmlcustomparser_p.h +++ b/src/qml/qml/qqmlcustomparser_p.h @@ -71,8 +71,6 @@ struct QQmlCustomParserCompilerBackend int evaluateEnum(const QString &scope, const QByteArray& enumValue, bool *ok) const; const QMetaObject *resolveType(const QString& name) const; - - virtual QQmlBinding::Identifier bindingIdentifier(const QV4::CompiledData::Binding *, QQmlCustomParser *) { return QQmlBinding::Invalid; } }; class Q_QML_PRIVATE_EXPORT QQmlCustomParser @@ -92,8 +90,8 @@ public: void clearErrors(); Flags flags() const { return m_flags; } - virtual QByteArray compile(const QV4::CompiledData::QmlUnit *qmlUnit, const QList<const QV4::CompiledData::Binding *> &bindings) = 0; - virtual void setCustomData(QObject *, const QByteArray &, QQmlCompiledData *cdata) = 0; + virtual void verifyBindings(const QV4::CompiledData::QmlUnit *, const QList<const QV4::CompiledData::Binding *> &) = 0; + virtual void applyBindings(QObject *, QQmlCompiledData *, const QList<const QV4::CompiledData::Binding *> &) = 0; QList<QQmlError> errors() const { return exceptions; } @@ -108,13 +106,13 @@ protected: const QMetaObject *resolveType(const QString&) const; - QQmlBinding::Identifier bindingIdentifier(const QV4::CompiledData::Binding *binding); - private: QList<QQmlError> exceptions; QQmlCustomParserCompilerBackend *compiler; Flags m_flags; + QBiPointer<const QQmlImports, QQmlTypeNameCache> imports; friend class QQmlPropertyValidator; + friend class QQmlObjectCreator; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QQmlCustomParser::Flags) diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 9bf983ab85..9ba6e67079 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -585,9 +585,6 @@ QQmlEnginePrivate::~QQmlEnginePrivate() if (incubationController) incubationController->d = 0; incubationController = 0; - delete rootContext; - rootContext = 0; - for(QHash<const QMetaObject *, QQmlPropertyCache *>::Iterator iter = propertyCache.begin(); iter != propertyCache.end(); ++iter) (*iter)->release(); for(QHash<QPair<QQmlType *, int>, QQmlPropertyCache *>::Iterator iter = typePropertyCache.begin(); iter != typePropertyCache.end(); ++iter) @@ -907,6 +904,8 @@ QQmlEngine::~QQmlEngine() if (d->isDebugging) QQmlDebugServer::instance()->removeEngine(this); + d->typeLoader.invalidate(); + // Emit onDestruction signals for the root context before // we destroy the contexts, engine, Singleton Types etc. that // may be required to handle the destruction signal. @@ -919,6 +918,9 @@ QQmlEngine::~QQmlEngine() QList<QQmlType*> singletonTypes = QQmlMetaType::qmlSingletonTypes(); foreach (QQmlType *currType, singletonTypes) currType->singletonInstanceInfo()->destroy(this); + + delete d->rootContext; + d->rootContext = 0; } /*! \fn void QQmlEngine::quit() diff --git a/src/qml/qml/qqmlerror.cpp b/src/qml/qml/qqmlerror.cpp index c583156c43..6d72bfcffa 100644 --- a/src/qml/qml/qqmlerror.cpp +++ b/src/qml/qml/qqmlerror.cpp @@ -249,16 +249,17 @@ QString QQmlError::toString() const QUrl u(url()); int l(line()); - if (u.isEmpty()) { + if (u.isEmpty() || (u.isLocalFile() && u.path().isEmpty())) rv = QLatin1String("<Unknown File>"); - } else if (l != -1) { - rv = u.toString() + QLatin1Char(':') + QString::number(l); + else + rv = u.toString(); + + if (l != -1) { + rv += QLatin1Char(':') + QString::number(l); int c(column()); if (c != -1) rv += QLatin1Char(':') + QString::number(c); - } else { - rv = u.toString(); } rv += QLatin1String(": ") + description(); diff --git a/src/qml/qml/qqmlexpression.cpp b/src/qml/qml/qqmlexpression.cpp index 4dc3704bbb..e993ed98eb 100644 --- a/src/qml/qml/qqmlexpression.cpp +++ b/src/qml/qml/qqmlexpression.cpp @@ -161,7 +161,7 @@ QQmlExpression::QQmlExpression(const QQmlScriptString &script, QQmlContext *ctxt Q_ASSERT(typeData); if (QQmlCompiledData *cdata = typeData->compiledData()) { - d->url = cdata->name; + d->url = cdata->fileName(); d->line = scriptPrivate->lineNumber; d->column = scriptPrivate->columnNumber; diff --git a/src/qml/qml/qqmlfileselector.cpp b/src/qml/qml/qqmlfileselector.cpp index 187c3656c6..8498a4d67d 100644 --- a/src/qml/qml/qqmlfileselector.cpp +++ b/src/qml/qml/qqmlfileselector.cpp @@ -106,8 +106,8 @@ QQmlFileSelector::QQmlFileSelector(QQmlEngine* engine, QObject* parent) { Q_D(QQmlFileSelector); d->engine = engine; - interceptorInstances()->insert(d->myInstance, this); - d->engine->setUrlInterceptor(d->myInstance); + interceptorInstances()->insert(d->myInstance.data(), this); + d->engine->setUrlInterceptor(d->myInstance.data()); } QQmlFileSelector::~QQmlFileSelector() @@ -117,7 +117,7 @@ QQmlFileSelector::~QQmlFileSelector() d->engine->setUrlInterceptor(0); d->engine = 0; } - interceptorInstances()->remove(d->myInstance); + interceptorInstances()->remove(d->myInstance.data()); } QQmlFileSelectorPrivate::QQmlFileSelectorPrivate() @@ -125,7 +125,7 @@ QQmlFileSelectorPrivate::QQmlFileSelectorPrivate() Q_Q(QQmlFileSelector); ownSelector = true; selector = new QFileSelector(q); - myInstance = new QQmlFileSelectorInterceptor(this); + myInstance.reset(new QQmlFileSelectorInterceptor(this)); } /*! diff --git a/src/qml/qml/qqmlfileselector_p.h b/src/qml/qml/qqmlfileselector_p.h index 501f563ade..73a98788ee 100644 --- a/src/qml/qml/qqmlfileselector_p.h +++ b/src/qml/qml/qqmlfileselector_p.h @@ -71,7 +71,7 @@ public: QFileSelector* selector; QPointer<QQmlEngine> engine; bool ownSelector; - QQmlFileSelectorInterceptor* myInstance; + QScopedPointer<QQmlFileSelectorInterceptor> myInstance; }; class Q_QML_PRIVATE_EXPORT QQmlFileSelectorInterceptor : public QQmlAbstractUrlInterceptor diff --git a/src/qml/qml/qqmlincubator.cpp b/src/qml/qml/qqmlincubator.cpp index 4cdeb19719..0665a4ac1a 100644 --- a/src/qml/qml/qqmlincubator.cpp +++ b/src/qml/qml/qqmlincubator.cpp @@ -283,7 +283,7 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) if (!compiledData) return; - QML_MEMORY_SCOPE_URL(compiledData->url); + QML_MEMORY_SCOPE_URL(compiledData->url()); QExplicitlySharedDataPointer<QQmlIncubatorPrivate> protectThis(this); @@ -297,7 +297,7 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) if (!guardOk) { QQmlError error; - error.setUrl(compiledData->url); + error.setUrl(compiledData->url()); error.setDescription(QQmlComponent::tr("Object destroyed during incubation")); errors << error; progress = QQmlIncubatorPrivate::Completed; diff --git a/src/qml/qml/qqmlinfo.cpp b/src/qml/qml/qqmlinfo.cpp index 63ce2d419c..2f013863ca 100644 --- a/src/qml/qml/qqmlinfo.cpp +++ b/src/qml/qml/qqmlinfo.cpp @@ -147,7 +147,7 @@ QQmlInfo::~QQmlInfo() d->buffer.prepend(QLatin1String("QML ") + typeName + QLatin1String(": ")); QQmlData *ddata = QQmlData::get(object, false); - if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) { + if (ddata && ddata->outerContext) { error.setUrl(ddata->outerContext->url); error.setLine(ddata->lineNumber); error.setColumn(ddata->columnNumber); diff --git a/src/qml/qml/qqmljavascriptexpression.cpp b/src/qml/qml/qqmljavascriptexpression.cpp index 560a4c8afd..8fea5e66d3 100644 --- a/src/qml/qml/qqmljavascriptexpression.cpp +++ b/src/qml/qml/qqmljavascriptexpression.cpp @@ -158,7 +158,7 @@ QV4::ReturnedValue QQmlJavaScriptExpression::evaluate(QQmlContextData *context, QV4::ExecutionContext *ctx = v4->currentContext(); callData->thisObject = v4->globalObject; if (scopeObject()) { - QV4::ScopedValue value(scope, QV4::QObjectWrapper::wrap(ctx->engine, scopeObject())); + QV4::ScopedValue value(scope, QV4::QObjectWrapper::wrap(ctx->d()->engine, scopeObject())); if (value->isObject()) callData->thisObject = value; } diff --git a/src/qml/qml/qqmllistwrapper.cpp b/src/qml/qml/qqmllistwrapper.cpp index fd50e2dbbc..b84752501f 100644 --- a/src/qml/qml/qqmllistwrapper.cpp +++ b/src/qml/qml/qqmllistwrapper.cpp @@ -52,18 +52,18 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(QmlListWrapper); -QmlListWrapper::QmlListWrapper(QV8Engine *engine) - : Object(QV8Engine::getV4(engine)), - v8(engine) +QmlListWrapper::Data::Data(QV8Engine *engine) + : Object::Data(QV8Engine::getV4(engine)) + , v8(engine) { setVTable(staticVTable()); + QV4::Scope scope(QV8Engine::getV4(engine)); - QV4::ScopedObject protectThis(scope, this); - Q_UNUSED(protectThis); - setArrayType(ArrayData::Custom); + QV4::ScopedObject o(scope, this); + o->setArrayType(ArrayData::Custom); } -QmlListWrapper::~QmlListWrapper() +QmlListWrapper::Data::~Data() { } @@ -75,10 +75,10 @@ ReturnedValue QmlListWrapper::create(QV8Engine *v8, QObject *object, int propId, ExecutionEngine *v4 = QV8Engine::getV4(v8); Scope scope(v4); - Scoped<QmlListWrapper> r(scope, new (v4->memoryManager) QmlListWrapper(v8)); - r->object = object; - r->propertyType = propType; - void *args[] = { &r->property, 0 }; + Scoped<QmlListWrapper> r(scope, v4->memoryManager->alloc<QmlListWrapper>(v8)); + r->d()->object = object; + r->d()->propertyType = propType; + void *args[] = { &r->d()->property, 0 }; QMetaObject::metacall(object, QMetaObject::ReadProperty, propId, args); return r.asReturnedValue(); } @@ -88,31 +88,31 @@ ReturnedValue QmlListWrapper::create(QV8Engine *v8, const QQmlListProperty<QObje ExecutionEngine *v4 = QV8Engine::getV4(v8); Scope scope(v4); - Scoped<QmlListWrapper> r(scope, new (v4->memoryManager) QmlListWrapper(v8)); - r->object = prop.object; - r->property = prop; - r->propertyType = propType; + Scoped<QmlListWrapper> r(scope, v4->memoryManager->alloc<QmlListWrapper>(v8)); + r->d()->object = prop.object; + r->d()->property = prop; + r->d()->propertyType = propType; return r.asReturnedValue(); } QVariant QmlListWrapper::toVariant() const { - if (!object) + if (!d()->object) return QVariant(); - return QVariant::fromValue(QQmlListReferencePrivate::init(property, propertyType, v8->engine())); + return QVariant::fromValue(QQmlListReferencePrivate::init(d()->property, d()->propertyType, d()->v8->engine())); } -ReturnedValue QmlListWrapper::get(Managed *m, const StringRef name, bool *hasProperty) +ReturnedValue QmlListWrapper::get(Managed *m, String *name, bool *hasProperty) { QV4::ExecutionEngine *v4 = m->engine(); QmlListWrapper *w = m->as<QmlListWrapper>(); if (!w) return v4->currentContext()->throwTypeError(); - if (name->equals(v4->id_length) && !w->object.isNull()) { - quint32 count = w->property.count ? w->property.count(&w->property) : 0; + if (name->equals(v4->id_length) && !w->d()->object.isNull()) { + quint32 count = w->d()->property.count ? w->d()->property.count(&w->d()->property) : 0; return Primitive::fromUInt32(count).asReturnedValue(); } @@ -135,11 +135,11 @@ ReturnedValue QmlListWrapper::getIndexed(Managed *m, uint index, bool *hasProper return e->currentContext()->throwTypeError(); } - quint32 count = w->property.count ? w->property.count(&w->property) : 0; - if (index < count && w->property.at) { + quint32 count = w->d()->property.count ? w->d()->property.count(&w->d()->property) : 0; + if (index < count && w->d()->property.at) { if (hasProperty) *hasProperty = true; - return QV4::QObjectWrapper::wrap(e, w->property.at(&w->property, index)); + return QV4::QObjectWrapper::wrap(e, w->d()->property.at(&w->d()->property, index)); } if (hasProperty) @@ -147,7 +147,7 @@ ReturnedValue QmlListWrapper::getIndexed(Managed *m, uint index, bool *hasProper return Primitive::undefinedValue().asReturnedValue(); } -void QmlListWrapper::put(Managed *m, const StringRef name, const ValueRef value) +void QmlListWrapper::put(Managed *m, String *name, const ValueRef value) { // doesn't do anything. Should we throw? Q_UNUSED(m); @@ -158,20 +158,20 @@ void QmlListWrapper::put(Managed *m, const StringRef name, const ValueRef value) void QmlListWrapper::destroy(Managed *that) { QmlListWrapper *w = that->as<QmlListWrapper>(); - w->~QmlListWrapper(); + w->d()->~Data(); } -void QmlListWrapper::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uint *index, Property *p, PropertyAttributes *attrs) +void QmlListWrapper::advanceIterator(Managed *m, ObjectIterator *it, String *&name, uint *index, Property *p, PropertyAttributes *attrs) { name = (String *)0; *index = UINT_MAX; QmlListWrapper *w = m->as<QmlListWrapper>(); - quint32 count = w->property.count ? w->property.count(&w->property) : 0; + quint32 count = w->d()->property.count ? w->d()->property.count(&w->d()->property) : 0; if (it->arrayIndex < count) { *index = it->arrayIndex; ++it->arrayIndex; *attrs = QV4::Attr_Data; - p->value = QV4::QObjectWrapper::wrap(w->engine(), w->property.at(&w->property, *index)); + p->value = QV4::QObjectWrapper::wrap(w->engine(), w->d()->property.at(&w->d()->property, *index)); return; } return QV4::Object::advanceIterator(m, it, name, index, p, attrs); diff --git a/src/qml/qml/qqmllistwrapper_p.h b/src/qml/qml/qqmllistwrapper_p.h index a7ce8b30bf..f6aee04487 100644 --- a/src/qml/qml/qqmllistwrapper_p.h +++ b/src/qml/qml/qqmllistwrapper_p.h @@ -69,30 +69,26 @@ namespace QV4 { struct Q_QML_EXPORT QmlListWrapper : Object { - V4_OBJECT -protected: - QmlListWrapper(QV8Engine *engine); - ~QmlListWrapper(); - -public: + struct Data : Object::Data { + Data(QV8Engine *engine); + ~Data(); + QV8Engine *v8; + QPointer<QObject> object; + QQmlListProperty<QObject> property; + int propertyType; + }; + V4_OBJECT(Object) static ReturnedValue create(QV8Engine *v8, QObject *object, int propId, int propType); static ReturnedValue create(QV8Engine *v8, const QQmlListProperty<QObject> &prop, int propType); QVariant toVariant() const; - static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty); + static ReturnedValue get(Managed *m, String *name, bool *hasProperty); static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty); - static void put(Managed *m, const StringRef name, const ValueRef value); - static void advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uint *index, Property *p, PropertyAttributes *attributes); + static void put(Managed *m, String *name, const ValueRef value); + static void advanceIterator(Managed *m, ObjectIterator *it, String *&name, uint *index, Property *p, PropertyAttributes *attributes); static void destroy(Managed *that); - -private: - QV8Engine *v8; - QPointer<QObject> object; - QQmlListProperty<QObject> property; - int propertyType; - }; } diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp index 178280b27c..b1ce0da8e0 100644 --- a/src/qml/qml/qqmllocale.cpp +++ b/src/qml/qml/qqmllocale.cpp @@ -82,171 +82,171 @@ void QQmlDateExtension::registerExtension(QV4::ExecutionEngine *engine) QV4::ReturnedValue QQmlDateExtension::method_toLocaleString(QV4::CallContext *ctx) { - if (ctx->callData->argc > 2) + if (ctx->d()->callData->argc > 2) return QV4::DatePrototype::method_toLocaleString(ctx); QV4::Scope scope(ctx); - QV4::DateObject *date = ctx->callData->thisObject.asDateObject(); + QV4::DateObject *date = ctx->d()->callData->thisObject.asDateObject(); if (!date) return QV4::DatePrototype::method_toLocaleString(ctx); QDateTime dt = date->toQDateTime(); - if (ctx->callData->argc == 0) { + if (ctx->d()->callData->argc == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; - return ctx->engine->newString(locale.toString(dt))->asReturnedValue(); + return ctx->d()->engine->newString(locale.toString(dt))->asReturnedValue(); } - if (!isLocaleObject(ctx->callData->args[0])) + if (!isLocaleObject(ctx->d()->callData->args[0])) return QV4::DatePrototype::method_toLocaleString(ctx); // Use the default Date toLocaleString() - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QString formattedDt; - if (ctx->callData->argc == 2) { - if (ctx->callData->args[1].isString()) { - QString format = ctx->callData->args[1].stringValue()->toQString(); - formattedDt = r->locale.toString(dt, format); - } else if (ctx->callData->args[1].isNumber()) { - quint32 intFormat = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc == 2) { + if (ctx->d()->callData->args[1].isString()) { + QString format = ctx->d()->callData->args[1].stringValue()->toQString(); + formattedDt = r->d()->locale.toString(dt, format); + } else if (ctx->d()->callData->args[1].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[1].toNumber(); QLocale::FormatType format = QLocale::FormatType(intFormat); - formattedDt = r->locale.toString(dt, format); + formattedDt = r->d()->locale.toString(dt, format); } else { V4THROW_ERROR("Locale: Date.toLocaleString(): Invalid datetime format"); } } else { - formattedDt = r->locale.toString(dt, enumFormat); + formattedDt = r->d()->locale.toString(dt, enumFormat); } - return ctx->engine->newString(formattedDt)->asReturnedValue(); + return ctx->d()->engine->newString(formattedDt)->asReturnedValue(); } QV4::ReturnedValue QQmlDateExtension::method_toLocaleTimeString(QV4::CallContext *ctx) { - if (ctx->callData->argc > 2) + if (ctx->d()->callData->argc > 2) return QV4::DatePrototype::method_toLocaleTimeString(ctx); QV4::Scope scope(ctx); - QV4::DateObject *date = ctx->callData->thisObject.asDateObject(); + QV4::DateObject *date = ctx->d()->callData->thisObject.asDateObject(); if (!date) return QV4::DatePrototype::method_toLocaleTimeString(ctx); QDateTime dt = date->toQDateTime(); QTime time = dt.time(); - if (ctx->callData->argc == 0) { + if (ctx->d()->callData->argc == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; - return ctx->engine->newString(locale.toString(time))->asReturnedValue(); + return ctx->d()->engine->newString(locale.toString(time))->asReturnedValue(); } - if (!isLocaleObject(ctx->callData->args[0])) + if (!isLocaleObject(ctx->d()->callData->args[0])) return QV4::DatePrototype::method_toLocaleTimeString(ctx); // Use the default Date toLocaleTimeString() - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QString formattedTime; - if (ctx->callData->argc == 2) { - if (ctx->callData->args[1].isString()) { - QString format = ctx->callData->args[1].stringValue()->toQString(); - formattedTime = r->locale.toString(time, format); - } else if (ctx->callData->args[1].isNumber()) { - quint32 intFormat = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc == 2) { + if (ctx->d()->callData->args[1].isString()) { + QString format = ctx->d()->callData->args[1].stringValue()->toQString(); + formattedTime = r->d()->locale.toString(time, format); + } else if (ctx->d()->callData->args[1].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[1].toNumber(); QLocale::FormatType format = QLocale::FormatType(intFormat); - formattedTime = r->locale.toString(time, format); + formattedTime = r->d()->locale.toString(time, format); } else { V4THROW_ERROR("Locale: Date.toLocaleTimeString(): Invalid time format"); } } else { - formattedTime = r->locale.toString(time, enumFormat); + formattedTime = r->d()->locale.toString(time, enumFormat); } - return ctx->engine->newString(formattedTime)->asReturnedValue(); + return ctx->d()->engine->newString(formattedTime)->asReturnedValue(); } QV4::ReturnedValue QQmlDateExtension::method_toLocaleDateString(QV4::CallContext *ctx) { - if (ctx->callData->argc > 2) + if (ctx->d()->callData->argc > 2) return QV4::DatePrototype::method_toLocaleDateString(ctx); QV4::Scope scope(ctx); - QV4::DateObject *dateObj = ctx->callData->thisObject.asDateObject(); + QV4::DateObject *dateObj = ctx->d()->callData->thisObject.asDateObject(); if (!dateObj) return QV4::DatePrototype::method_toLocaleDateString(ctx); QDateTime dt = dateObj->toQDateTime(); QDate date = dt.date(); - if (ctx->callData->argc == 0) { + if (ctx->d()->callData->argc == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; - return ctx->engine->newString(locale.toString(date))->asReturnedValue(); + return ctx->d()->engine->newString(locale.toString(date))->asReturnedValue(); } - if (!isLocaleObject(ctx->callData->args[0])) + if (!isLocaleObject(ctx->d()->callData->args[0])) return QV4::DatePrototype::method_toLocaleDateString(ctx); // Use the default Date toLocaleDateString() - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QString formattedDate; - if (ctx->callData->argc == 2) { - if (ctx->callData->args[1].isString()) { - QString format = ctx->callData->args[1].stringValue()->toQString(); - formattedDate = r->locale.toString(date, format); - } else if (ctx->callData->args[1].isNumber()) { - quint32 intFormat = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc == 2) { + if (ctx->d()->callData->args[1].isString()) { + QString format = ctx->d()->callData->args[1].stringValue()->toQString(); + formattedDate = r->d()->locale.toString(date, format); + } else if (ctx->d()->callData->args[1].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[1].toNumber(); QLocale::FormatType format = QLocale::FormatType(intFormat); - formattedDate = r->locale.toString(date, format); + formattedDate = r->d()->locale.toString(date, format); } else { V4THROW_ERROR("Locale: Date.loLocaleDateString(): Invalid date format"); } } else { - formattedDate = r->locale.toString(date, enumFormat); + formattedDate = r->d()->locale.toString(date, enumFormat); } - return ctx->engine->newString(formattedDate)->asReturnedValue(); + return ctx->d()->engine->newString(formattedDate)->asReturnedValue(); } QV4::ReturnedValue QQmlDateExtension::method_fromLocaleString(QV4::CallContext *ctx) { - QV4::ExecutionEngine * const engine = ctx->engine; - if (ctx->callData->argc == 1 && ctx->callData->args[0].isString()) { + QV4::ExecutionEngine * const engine = ctx->d()->engine; + if (ctx->d()->callData->argc == 1 && ctx->d()->callData->args[0].isString()) { QLocale locale; - QString dateString = ctx->callData->args[0].stringValue()->toQString(); + QString dateString = ctx->d()->callData->args[0].stringValue()->toQString(); QDateTime dt = locale.toDateTime(dateString); return QV4::Encode(engine->newDateObject(dt)); } QV4::Scope scope(ctx); - if (ctx->callData->argc < 1 || ctx->callData->argc > 3 || !isLocaleObject(ctx->callData->args[0])) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 3 || !isLocaleObject(ctx->d()->callData->args[0])) V4THROW_ERROR("Locale: Date.fromLocaleString(): Invalid arguments"); - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QDateTime dt; - QString dateString = ctx->callData->args[1].toQStringNoThrow(); - if (ctx->callData->argc == 3) { - if (ctx->callData->args[2].isString()) { - QString format = ctx->callData->args[2].stringValue()->toQString(); - dt = r->locale.toDateTime(dateString, format); - } else if (ctx->callData->args[2].isNumber()) { - quint32 intFormat = ctx->callData->args[2].toNumber(); + QString dateString = ctx->d()->callData->args[1].toQStringNoThrow(); + if (ctx->d()->callData->argc == 3) { + if (ctx->d()->callData->args[2].isString()) { + QString format = ctx->d()->callData->args[2].stringValue()->toQString(); + dt = r->d()->locale.toDateTime(dateString, format); + } else if (ctx->d()->callData->args[2].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[2].toNumber(); QLocale::FormatType format = QLocale::FormatType(intFormat); - dt = r->locale.toDateTime(dateString, format); + dt = r->d()->locale.toDateTime(dateString, format); } else { V4THROW_ERROR("Locale: Date.fromLocaleString(): Invalid datetime format"); } } else { - dt = r->locale.toDateTime(dateString, enumFormat); + dt = r->d()->locale.toDateTime(dateString, enumFormat); } return QV4::Encode(engine->newDateObject(dt)); @@ -254,40 +254,40 @@ QV4::ReturnedValue QQmlDateExtension::method_fromLocaleString(QV4::CallContext * QV4::ReturnedValue QQmlDateExtension::method_fromLocaleTimeString(QV4::CallContext *ctx) { - QV4::ExecutionEngine * const engine = ctx->engine; + QV4::ExecutionEngine * const engine = ctx->d()->engine; - if (ctx->callData->argc == 1 && ctx->callData->args[0].isString()) { + if (ctx->d()->callData->argc == 1 && ctx->d()->callData->args[0].isString()) { QLocale locale; - QString timeString = ctx->callData->args[0].stringValue()->toQString(); + QString timeString = ctx->d()->callData->args[0].stringValue()->toQString(); QTime time = locale.toTime(timeString); QDateTime dt = QDateTime::currentDateTime(); dt.setTime(time); return QV4::Encode(engine->newDateObject(dt)); } - if (ctx->callData->argc < 1 || ctx->callData->argc > 3 || !isLocaleObject(ctx->callData->args[0])) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 3 || !isLocaleObject(ctx->d()->callData->args[0])) V4THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid arguments"); QV4::Scope scope(ctx); - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QTime tm; - QString dateString = ctx->callData->args[1].toQStringNoThrow(); - if (ctx->callData->argc == 3) { - if (ctx->callData->args[2].isString()) { - QString format = ctx->callData->args[2].stringValue()->toQString(); - tm = r->locale.toTime(dateString, format); - } else if (ctx->callData->args[2].isNumber()) { - quint32 intFormat = ctx->callData->args[2].toNumber(); + QString dateString = ctx->d()->callData->args[1].toQStringNoThrow(); + if (ctx->d()->callData->argc == 3) { + if (ctx->d()->callData->args[2].isString()) { + QString format = ctx->d()->callData->args[2].stringValue()->toQString(); + tm = r->d()->locale.toTime(dateString, format); + } else if (ctx->d()->callData->args[2].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[2].toNumber(); QLocale::FormatType format = QLocale::FormatType(intFormat); - tm = r->locale.toTime(dateString, format); + tm = r->d()->locale.toTime(dateString, format); } else { V4THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid datetime format"); } } else { - tm = r->locale.toTime(dateString, enumFormat); + tm = r->d()->locale.toTime(dateString, enumFormat); } QDateTime dt; @@ -301,38 +301,38 @@ QV4::ReturnedValue QQmlDateExtension::method_fromLocaleTimeString(QV4::CallConte QV4::ReturnedValue QQmlDateExtension::method_fromLocaleDateString(QV4::CallContext *ctx) { - QV4::ExecutionEngine * const engine = ctx->engine; + QV4::ExecutionEngine * const engine = ctx->d()->engine; - if (ctx->callData->argc == 1 && ctx->callData->args[0].isString()) { + if (ctx->d()->callData->argc == 1 && ctx->d()->callData->args[0].isString()) { QLocale locale; - QString dateString = ctx->callData->args[0].stringValue()->toQString(); + QString dateString = ctx->d()->callData->args[0].stringValue()->toQString(); QDate date = locale.toDate(dateString); return QV4::Encode(engine->newDateObject(QDateTime(date))); } - if (ctx->callData->argc < 1 || ctx->callData->argc > 3 || !isLocaleObject(ctx->callData->args[0])) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 3 || !isLocaleObject(ctx->d()->callData->args[0])) V4THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid arguments"); QV4::Scope scope(ctx); - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QLocale::FormatType enumFormat = QLocale::LongFormat; QDate dt; - QString dateString = ctx->callData->args[1].toQStringNoThrow(); - if (ctx->callData->argc == 3) { - if (ctx->callData->args[2].isString()) { - QString format = ctx->callData->args[2].stringValue()->toQString(); - dt = r->locale.toDate(dateString, format); - } else if (ctx->callData->args[2].isNumber()) { - quint32 intFormat = ctx->callData->args[2].toNumber(); + QString dateString = ctx->d()->callData->args[1].toQStringNoThrow(); + if (ctx->d()->callData->argc == 3) { + if (ctx->d()->callData->args[2].isString()) { + QString format = ctx->d()->callData->args[2].stringValue()->toQString(); + dt = r->d()->locale.toDate(dateString, format); + } else if (ctx->d()->callData->args[2].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[2].toNumber(); QLocale::FormatType format = QLocale::FormatType(intFormat); - dt = r->locale.toDate(dateString, format); + dt = r->d()->locale.toDate(dateString, format); } else { V4THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid datetime format"); } } else { - dt = r->locale.toDate(dateString, enumFormat); + dt = r->d()->locale.toDate(dateString, enumFormat); } return QV4::Encode(engine->newDateObject(QDateTime(dt))); @@ -340,7 +340,7 @@ QV4::ReturnedValue QQmlDateExtension::method_fromLocaleDateString(QV4::CallConte QV4::ReturnedValue QQmlDateExtension::method_timeZoneUpdated(QV4::CallContext *ctx) { - if (ctx->callData->argc != 0) + if (ctx->d()->callData->argc != 0) V4THROW_ERROR("Locale: Date.timeZoneUpdated(): Invalid arguments"); QV4::DatePrototype::timezoneUpdated(); @@ -360,75 +360,75 @@ void QQmlNumberExtension::registerExtension(QV4::ExecutionEngine *engine) QV4::ReturnedValue QQmlNumberExtension::method_toLocaleString(QV4::CallContext *ctx) { - if (ctx->callData->argc > 3) + if (ctx->d()->callData->argc > 3) V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); - double number = ctx->callData->thisObject.toNumber(); + double number = ctx->d()->callData->thisObject.toNumber(); - if (ctx->callData->argc == 0) { + if (ctx->d()->callData->argc == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; - return ctx->engine->newString(locale.toString(number))->asReturnedValue(); + return ctx->d()->engine->newString(locale.toString(number))->asReturnedValue(); } - if (!isLocaleObject(ctx->callData->args[0])) + if (!isLocaleObject(ctx->d()->callData->args[0])) return QV4::NumberPrototype::method_toLocaleString(ctx); // Use the default Number toLocaleString() QV4::Scope scope(ctx); - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); quint16 format = 'f'; - if (ctx->callData->argc > 1) { - if (!ctx->callData->args[1].isString()) + if (ctx->d()->callData->argc > 1) { + if (!ctx->d()->callData->args[1].isString()) V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); - QV4::String *fs = ctx->callData->args[1].toString(ctx); - if (fs->length()) + QV4::String *fs = ctx->d()->callData->args[1].toString(ctx); + if (fs->d()->length()) format = fs->toQString().at(0).unicode(); } int prec = 2; - if (ctx->callData->argc > 2) { - if (!ctx->callData->args[2].isNumber()) + if (ctx->d()->callData->argc > 2) { + if (!ctx->d()->callData->args[2].isNumber()) V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); - prec = ctx->callData->args[2].toInt32(); + prec = ctx->d()->callData->args[2].toInt32(); } - return ctx->engine->newString(r->locale.toString(number, (char)format, prec))->asReturnedValue(); + return ctx->d()->engine->newString(r->d()->locale.toString(number, (char)format, prec))->asReturnedValue(); } QV4::ReturnedValue QQmlNumberExtension::method_toLocaleCurrencyString(QV4::CallContext *ctx) { - if (ctx->callData->argc > 2) + if (ctx->d()->callData->argc > 2) V4THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); - double number = ctx->callData->thisObject.toNumber(); + double number = ctx->d()->callData->thisObject.toNumber(); - if (ctx->callData->argc == 0) { + if (ctx->d()->callData->argc == 0) { // Use QLocale for standard toLocaleString() function QLocale locale; - return ctx->engine->newString(locale.toString(number))->asReturnedValue(); + return ctx->d()->engine->newString(locale.toString(number))->asReturnedValue(); } - if (!isLocaleObject(ctx->callData->args[0])) + if (!isLocaleObject(ctx->d()->callData->args[0])) V4THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments"); QV4::Scope scope(ctx); - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); QString symbol; - if (ctx->callData->argc > 1) { - if (!ctx->callData->args[1].isString()) + if (ctx->d()->callData->argc > 1) { + if (!ctx->d()->callData->args[1].isString()) V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments"); - symbol = ctx->callData->args[1].toQStringNoThrow(); + symbol = ctx->d()->callData->args[1].toQStringNoThrow(); } - return ctx->engine->newString(r->locale.toCurrencyString(number, symbol))->asReturnedValue(); + return ctx->d()->engine->newString(r->d()->locale.toCurrencyString(number, symbol))->asReturnedValue(); } QV4::ReturnedValue QQmlNumberExtension::method_fromLocaleString(QV4::CallContext *ctx) { - if (ctx->callData->argc < 1 || ctx->callData->argc > 2) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 2) V4THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); int numberIdx = 0; @@ -436,18 +436,18 @@ QV4::ReturnedValue QQmlNumberExtension::method_fromLocaleString(QV4::CallContext QV4::Scope scope(ctx); - if (ctx->callData->argc == 2) { - if (!isLocaleObject(ctx->callData->args[0])) + if (ctx->d()->callData->argc == 2) { + if (!isLocaleObject(ctx->d()->callData->args[0])) V4THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments"); - GET_LOCALE_DATA_RESOURCE(ctx->callData->args[0]); - locale = r->locale; + GET_LOCALE_DATA_RESOURCE(ctx->d()->callData->args[0]); + locale = r->d()->locale; numberIdx = 1; } - QV4::String *ns = ctx->callData->args[numberIdx].toString(ctx); - if (!ns->length()) + QV4::String *ns = ctx->d()->callData->args[numberIdx].toString(ctx); + if (!ns->d()->length()) return QV4::Encode(Q_QNAN); bool ok = false; @@ -499,7 +499,7 @@ QV4::ReturnedValue QQmlLocaleData::method_get_weekDays(QV4::CallContext *ctx) QList<Qt::DayOfWeek> days = locale->weekdays(); - QV4::Scoped<QV4::ArrayObject> result(scope, ctx->engine->newArrayObject()); + QV4::Scoped<QV4::ArrayObject> result(scope, ctx->d()->engine->newArrayObject()); result->arrayReserve(days.size()); for (int i = 0; i < days.size(); ++i) { int day = days.at(i); @@ -520,11 +520,11 @@ QV4::ReturnedValue QQmlLocaleData::method_get_uiLanguages(QV4::CallContext *ctx) return QV4::Encode::undefined(); QStringList langs = locale->uiLanguages(); - QV4::Scoped<QV4::ArrayObject> result(scope, ctx->engine->newArrayObject()); + QV4::Scoped<QV4::ArrayObject> result(scope, ctx->d()->engine->newArrayObject()); result->arrayReserve(langs.size()); QV4::ScopedValue v(scope); for (int i = 0; i < langs.size(); ++i) - result->arrayPut(i, (v = ctx->engine->newString(langs.at(i)))); + result->arrayPut(i, (v = ctx->d()->engine->newString(langs.at(i)))); result->setArrayLengthUnchecked(langs.size()); @@ -537,16 +537,16 @@ QV4::ReturnedValue QQmlLocaleData::method_currencySymbol(QV4::CallContext *ctx) if (!locale) return QV4::Encode::undefined(); - if (ctx->callData->argc > 1) + if (ctx->d()->callData->argc > 1) V4THROW_ERROR("Locale: currencySymbol(): Invalid arguments"); QLocale::CurrencySymbolFormat format = QLocale::CurrencySymbol; - if (ctx->callData->argc == 1) { - quint32 intFormat = ctx->callData->args[0].toNumber(); + if (ctx->d()->callData->argc == 1) { + quint32 intFormat = ctx->d()->callData->args[0].toNumber(); format = QLocale::CurrencySymbolFormat(intFormat); } - return ctx->engine->newString(locale->currencySymbol(format))->asReturnedValue(); + return ctx->d()->engine->newString(locale->currencySymbol(format))->asReturnedValue(); } #define LOCALE_FORMAT(FUNC) \ @@ -554,14 +554,14 @@ QV4::ReturnedValue QQmlLocaleData::method_ ##FUNC (QV4::CallContext *ctx) { \ QLocale *locale = getThisLocale(ctx); \ if (!locale) \ return QV4::Encode::undefined(); \ - if (ctx->callData->argc > 1) \ + if (ctx->d()->callData->argc > 1) \ V4THROW_ERROR("Locale: " #FUNC "(): Invalid arguments"); \ QLocale::FormatType format = QLocale::LongFormat;\ - if (ctx->callData->argc == 1) { \ - quint32 intFormat = ctx->callData->args[0].toUInt32(); \ + if (ctx->d()->callData->argc == 1) { \ + quint32 intFormat = ctx->d()->callData->args[0].toUInt32(); \ format = QLocale::FormatType(intFormat); \ } \ - return ctx->engine->newString(locale-> FUNC (format))->asReturnedValue(); \ + return ctx->engine()->newString(locale-> FUNC (format))->asReturnedValue(); \ } LOCALE_FORMAT(dateTimeFormat) @@ -574,16 +574,16 @@ QV4::ReturnedValue QQmlLocaleData::method_ ## VARIABLE (QV4::CallContext *ctx) { QLocale *locale = getThisLocale(ctx); \ if (!locale) \ return QV4::Encode::undefined(); \ - if (ctx->callData->argc < 1 || ctx->callData->argc > 2) \ + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 2) \ V4THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ QLocale::FormatType enumFormat = QLocale::LongFormat; \ - int idx = ctx->callData->args[0].toInt32() + 1; \ + int idx = ctx->d()->callData->args[0].toInt32() + 1; \ if (idx < 1 || idx > 12) \ V4THROW_ERROR("Locale: Invalid month"); \ QString name; \ - if (ctx->callData->argc == 2) { \ - if (ctx->callData->args[1].isNumber()) { \ - quint32 intFormat = ctx->callData->args[1].toUInt32(); \ + if (ctx->d()->callData->argc == 2) { \ + if (ctx->d()->callData->args[1].isNumber()) { \ + quint32 intFormat = ctx->d()->callData->args[1].toUInt32(); \ QLocale::FormatType format = QLocale::FormatType(intFormat); \ name = locale-> VARIABLE(idx, format); \ } else { \ @@ -592,7 +592,7 @@ QV4::ReturnedValue QQmlLocaleData::method_ ## VARIABLE (QV4::CallContext *ctx) { } else { \ name = locale-> VARIABLE(idx, enumFormat); \ } \ - return ctx->engine->newString(name)->asReturnedValue(); \ + return ctx->engine()->newString(name)->asReturnedValue(); \ } // 0 -> 7 as Qt::Sunday is 7, but Sunday is 0 in JS Date @@ -601,17 +601,17 @@ QV4::ReturnedValue QQmlLocaleData::method_ ## VARIABLE (QV4::CallContext *ctx) { QLocale *locale = getThisLocale(ctx); \ if (!locale) \ return QV4::Encode::undefined(); \ - if (ctx->callData->argc < 1 || ctx->callData->argc > 2) \ + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 2) \ V4THROW_ERROR("Locale: " #VARIABLE "(): Invalid arguments"); \ QLocale::FormatType enumFormat = QLocale::LongFormat; \ - int idx = ctx->callData->args[0].toInt32(); \ + int idx = ctx->d()->callData->args[0].toInt32(); \ if (idx < 0 || idx > 7) \ V4THROW_ERROR("Locale: Invalid day"); \ if (idx == 0) idx = 7; \ QString name; \ - if (ctx->callData->argc == 2) { \ - if (ctx->callData->args[1].isNumber()) { \ - quint32 intFormat = ctx->callData->args[1].toUInt32(); \ + if (ctx->d()->callData->argc == 2) { \ + if (ctx->d()->callData->args[1].isNumber()) { \ + quint32 intFormat = ctx->d()->callData->args[1].toUInt32(); \ QLocale::FormatType format = QLocale::FormatType(intFormat); \ name = locale-> VARIABLE(idx, format); \ } else { \ @@ -620,7 +620,7 @@ QV4::ReturnedValue QQmlLocaleData::method_ ## VARIABLE (QV4::CallContext *ctx) { } else { \ name = locale-> VARIABLE(idx, enumFormat); \ } \ - return ctx->engine->newString(name)->asReturnedValue(); \ + return ctx->engine()->newString(name)->asReturnedValue(); \ } LOCALE_FORMATTED_MONTHNAME(monthName) @@ -633,7 +633,7 @@ LOCALE_FORMATTED_DAYNAME(standaloneDayName) QLocale *locale = getThisLocale(ctx); \ if (!locale) \ return QV4::Encode::undefined(); \ - return ctx->engine->newString(locale-> VARIABLE())->asReturnedValue();\ + return ctx->engine()->newString(locale-> VARIABLE())->asReturnedValue();\ } LOCALE_STRING_PROPERTY(name) @@ -814,8 +814,8 @@ QV4::ReturnedValue QQmlLocale::wrap(QV8Engine *engine, const QLocale &locale) QV8LocaleDataDeletable *d = localeV8Data(engine); QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); QV4::Scope scope(v4); - QV4::Scoped<QQmlLocaleData> wrapper(scope, new (v4->memoryManager) QQmlLocaleData(v4)); - wrapper->locale = locale; + QV4::Scoped<QQmlLocaleData> wrapper(scope, v4->memoryManager->alloc<QQmlLocaleData>(v4)); + wrapper->d()->locale = locale; QV4::ScopedObject p(scope, d->prototype.value()); wrapper->setPrototype(p.getPointer()); return wrapper.asReturnedValue(); @@ -828,14 +828,14 @@ void QQmlLocale::registerStringLocaleCompare(QV4::ExecutionEngine *engine) QV4::ReturnedValue QQmlLocale::method_localeCompare(QV4::CallContext *ctx) { - if (ctx->callData->argc != 1 || (!ctx->callData->args[0].isString() && !ctx->callData->args[0].asStringObject())) + if (ctx->d()->callData->argc != 1 || (!ctx->d()->callData->args[0].isString() && !ctx->d()->callData->args[0].asStringObject())) return QV4::StringPrototype::method_localeCompare(ctx); - if (!ctx->callData->thisObject.isString() && !ctx->callData->thisObject.asStringObject()) + if (!ctx->d()->callData->thisObject.isString() && !ctx->d()->callData->thisObject.asStringObject()) return QV4::StringPrototype::method_localeCompare(ctx); - QString thisString = ctx->callData->thisObject.toQStringNoThrow(); - QString thatString = ctx->callData->args[0].toQStringNoThrow(); + QString thisString = ctx->d()->callData->thisObject.toQStringNoThrow(); + QString thatString = ctx->d()->callData->args[0].toQStringNoThrow(); return QV4::Encode(QString::localeAwareCompare(thisString, thatString)); } diff --git a/src/qml/qml/qqmllocale_p.h b/src/qml/qml/qqmllocale_p.h index cafe448313..8ec7cbf61f 100644 --- a/src/qml/qml/qqmllocale_p.h +++ b/src/qml/qml/qqmllocale_p.h @@ -129,25 +129,25 @@ private: static QV4::ReturnedValue method_localeCompare(QV4::CallContext *ctx); }; -class QQmlLocaleData : public QV4::Object +struct QQmlLocaleData : public QV4::Object { - V4_OBJECT -public: - QQmlLocaleData(QV4::ExecutionEngine *engine) - : QV4::Object(engine) - { - setVTable(staticVTable()); - } - - QLocale locale; + struct Data : Object::Data { + Data(QV4::ExecutionEngine *engine) + : Object::Data(engine) + { + setVTable(staticVTable()); + } + QLocale locale; + }; + V4_OBJECT(Object) static QLocale *getThisLocale(QV4::CallContext *ctx) { - QQmlLocaleData *thisObject = ctx->callData->thisObject.asObject()->as<QQmlLocaleData>(); + QQmlLocaleData *thisObject = ctx->d()->callData->thisObject.asObject()->as<QQmlLocaleData>(); if (!thisObject) { ctx->throwTypeError(); return 0; } - return &thisObject->locale; + return &thisObject->d()->locale; } static QV4::ReturnedValue method_currencySymbol(QV4::CallContext *ctx); diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 1de467b0fa..72920f1ae2 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -184,8 +184,8 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI context = new QQmlContextData; context->isInternal = true; - context->url = compiledData->url; - context->urlString = compiledData->name; + context->url = compiledData->url(); + context->urlString = compiledData->fileName(); context->imports = compiledData->importCache; context->imports->addref(); context->setParent(parentContext); @@ -273,7 +273,7 @@ bool QQmlObjectCreator::populateDeferredProperties(QObject *instance) sharedState->allJavaScriptObjects = valueScope.alloc(compiledData->totalObjectCount); QV4::ScopedObject qmlScope(valueScope, QV4::QmlContextWrapper::qmlScope(QV8Engine::get(engine), context, _scopeObject)); - QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, new (v4->memoryManager) QV4::QmlBindingWrapper(v4->rootContext, qmlScope)); + QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, v4->memoryManager->alloc<QV4::QmlBindingWrapper>(v4->rootContext, qmlScope)); QV4::ExecutionContext *qmlContext = qmlBindingWrapper->context(); qSwap(_qmlContext, qmlContext); @@ -400,7 +400,7 @@ void QQmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4:: QString string = binding->valueAsString(&qmlUnit->header); // Encoded dir-separators defeat QUrl processing - decode them first string.replace(QLatin1String("%2f"), QLatin1String("/"), Qt::CaseInsensitive); - QUrl value = string.isEmpty() ? QUrl() : compiledData->url.resolved(QUrl(string)); + QUrl value = string.isEmpty() ? QUrl() : compiledData->url().resolved(QUrl(string)); // Apply URL interceptor if (engine->urlInterceptor()) value = engine->urlInterceptor()->intercept(value, QQmlAbstractUrlInterceptor::UrlString); @@ -595,7 +595,7 @@ void QQmlObjectCreator::setPropertyValue(QQmlPropertyData *property, const QV4:: } else if (property->propType == qMetaTypeId<QList<QUrl> >()) { Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_String); QString urlString = binding->valueAsString(&qmlUnit->header); - QUrl u = urlString.isEmpty() ? QUrl() : compiledData->url.resolved(QUrl(urlString)); + QUrl u = urlString.isEmpty() ? QUrl() : compiledData->url().resolved(QUrl(urlString)); QList<QUrl> value; value.append(u); argv[0] = reinterpret_cast<void *>(&value); @@ -1022,7 +1022,7 @@ void QQmlObjectCreator::setupFunctions() void QQmlObjectCreator::recordError(const QV4::CompiledData::Location &location, const QString &description) { QQmlError error; - error.setUrl(compiledData->url); + error.setUrl(compiledData->url()); error.setLine(location.line); error.setColumn(location.column); error.setDescription(description); @@ -1079,7 +1079,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo sharedState->allCreatedObjects.push(instance); } else { Q_ASSERT(typeRef->component); - Q_QML_OC_PROFILE(sharedState->profiler, profiler.update(typeRef->component->name, + Q_QML_OC_PROFILE(sharedState->profiler, profiler.update(typeRef->component->fileName(), context->url, obj->location.line, obj->location.column)); if (typeRef->component->qmlUnit->isSingleton()) { @@ -1139,10 +1139,19 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo QBitArray bindingsToSkip; if (customParser) { - QHash<int, QQmlCompiledData::CustomParserData>::ConstIterator entry = compiledData->customParserData.find(index); - if (entry != compiledData->customParserData.constEnd()) { - customParser->setCustomData(instance, entry->compilationArtifact, compiledData); - bindingsToSkip = entry->bindings; + QHash<int, QBitArray>::ConstIterator customParserBindings = compiledData->customParserBindings.find(index); + if (customParserBindings != compiledData->customParserBindings.constEnd()) { + customParser->imports = compiledData->importCache; + + QList<const QV4::CompiledData::Binding *> bindings; + const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index); + for (int i = 0; i < customParserBindings->count(); ++i) + if (customParserBindings->testBit(i)) + bindings << obj->bindingTable() + i; + customParser->applyBindings(instance, compiledData, bindings); + + customParser->imports = (QQmlTypeNameCache*)0; + bindingsToSkip = *customParserBindings; } } @@ -1169,7 +1178,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo QV4::Scope valueScope(v4); QV4::ScopedObject qmlScope(valueScope, QV4::QmlContextWrapper::qmlScope(QV8Engine::get(engine), context, _scopeObject)); - QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, new (v4->memoryManager) QV4::QmlBindingWrapper(v4->rootContext, qmlScope)); + QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, v4->memoryManager->alloc<QV4::QmlBindingWrapper>(v4->rootContext, qmlScope)); QV4::ExecutionContext *qmlContext = qmlBindingWrapper->context(); qSwap(_qmlContext, qmlContext); diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index 1075b53c5e..96f303dcb5 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -1427,7 +1427,8 @@ bool QQmlPropertyPrivate::write(QObject *object, list << value.toInt(); v = QVariant::fromValue<QList<int> >(list); ok = true; - } else if (variantType == QVariant::Double && propertyType == qMetaTypeId<QList<qreal> >()) { + } else if ((variantType == QVariant::Double || variantType == QVariant::Int) + && (propertyType == qMetaTypeId<QList<qreal> >())) { QList<qreal> list; list << value.toReal(); v = QVariant::fromValue<QList<qreal> >(list); @@ -1533,7 +1534,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, return false; } else if (isVarProperty) { QV4::FunctionObject *f = result->asFunctionObject(); - if (f && f->bindingKeyFlag) { + if (f && f->bindingKeyFlag()) { // we explicitly disallow this case to avoid confusion. Users can still store one // in an array in a var property if they need to, but the common case is user error. expression->delayedError()->setErrorDescription(QLatin1String("Invalid use of Qt.binding() in a binding declaration.")); @@ -1551,7 +1552,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, writeValueProperty(object, core, QVariant(), context, flags); } else if (type == qMetaTypeId<QJSValue>()) { QV4::FunctionObject *f = result->asFunctionObject(); - if (f && f->bindingKeyFlag) { + if (f && f->bindingKeyFlag()) { expression->delayedError()->setErrorDescription(QLatin1String("Invalid use of Qt.binding() in a binding declaration.")); expression->delayedError()->setErrorObject(object); return false; @@ -1569,7 +1570,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, expression->delayedError()->setErrorObject(object); return false; } else if (QV4::FunctionObject *f = result->asFunctionObject()) { - if (f->bindingKeyFlag) + if (f->bindingKeyFlag()) expression->delayedError()->setErrorDescription(QLatin1String("Invalid use of Qt.binding() in a binding declaration.")); else expression->delayedError()->setErrorDescription(QLatin1String("Unable to assign a function to a property of any type other than var.")); diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 7fc08bd114..36dc17a085 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -897,11 +897,20 @@ QQmlDataLoader::QQmlDataLoader(QQmlEngine *engine) /*! \internal */ QQmlDataLoader::~QQmlDataLoader() { + invalidate(); +} + +void QQmlDataLoader::invalidate() +{ for (NetworkReplies::Iterator iter = m_networkReplies.begin(); iter != m_networkReplies.end(); ++iter) (*iter)->release(); + m_networkReplies.clear(); - shutdownThread(); - delete m_thread; + if (m_thread) { + shutdownThread(); + delete m_thread; + m_thread = 0; + } } void QQmlDataLoader::lock() @@ -1228,7 +1237,7 @@ void QQmlDataLoader::setCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::Cached void QQmlDataLoader::shutdownThread() { - if (!m_thread->isShutdown()) + if (m_thread && !m_thread->isShutdown()) m_thread->shutdown(); } @@ -2207,7 +2216,7 @@ void QQmlTypeData::dataReceived(const Data &data) QQmlEngine *qmlEngine = typeLoader()->engine(); m_document.reset(new QmlIR::Document(QV8Engine::getV4(qmlEngine)->debugger != 0)); QmlIR::IRBuilder compiler(QV8Engine::get(qmlEngine)->illegalNames()); - if (!compiler.generateFromQml(code, finalUrlString(), finalUrlString(), m_document.data())) { + if (!compiler.generateFromQml(code, finalUrlString(), m_document.data())) { QList<QQmlError> errors; foreach (const QQmlJS::DiagnosticMessage &msg, compiler.errors) { QQmlError e; @@ -2332,10 +2341,8 @@ void QQmlTypeData::compile() Q_ASSERT(m_compiledData == 0); m_compiledData = new QQmlCompiledData(typeLoader()->engine()); - m_compiledData->url = finalUrl(); - m_compiledData->name = finalUrlString(); - QQmlCompilingProfiler prof(QQmlEnginePrivate::get(typeLoader()->engine())->profiler, m_compiledData->name); + QQmlCompilingProfiler prof(QQmlEnginePrivate::get(typeLoader()->engine())->profiler, finalUrlString()); QQmlTypeCompiler compiler(QQmlEnginePrivate::get(typeLoader()->engine()), m_compiledData, this, m_document.data()); if (!compiler.compile()) { @@ -2547,7 +2554,7 @@ void QQmlScriptData::initialize(QQmlEngine *engine) QV8Engine *v8engine = ep->v8engine(); QV4::ExecutionEngine *v4 = QV8Engine::getV4(v8engine); - m_program = new QV4::Script(v4, QV4::ObjectRef::null(), m_precompiledScript); + m_program = new QV4::Script(v4, 0, m_precompiledScript); addToEngine(engine); diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index b09ac15861..3d0b77e2a5 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -233,6 +233,7 @@ public: QQmlEngine *engine() const; void initializeEngine(QQmlExtensionInterface *, const char *); + void invalidate(); protected: void shutdownThread(); diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp index 573779acab..53afd36437 100644 --- a/src/qml/qml/qqmltypewrapper.cpp +++ b/src/qml/qml/qqmltypewrapper.cpp @@ -56,14 +56,15 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(QmlTypeWrapper); -QmlTypeWrapper::QmlTypeWrapper(QV8Engine *engine) - : Object(QV8Engine::getV4(engine)), - v8(engine), mode(IncludeEnums), type(0), typeNamespace(0), importNamespace(0) +QmlTypeWrapper::Data::Data(QV8Engine *engine) + : Object::Data(QV8Engine::getV4(engine)) + , v8(engine) + , mode(IncludeEnums) { setVTable(staticVTable()); } -QmlTypeWrapper::~QmlTypeWrapper() +QmlTypeWrapper::Data::~Data() { if (typeNamespace) typeNamespace->release(); @@ -71,14 +72,14 @@ QmlTypeWrapper::~QmlTypeWrapper() bool QmlTypeWrapper::isSingleton() const { - return type && type->isSingleton(); + return d()->type && d()->type->isSingleton(); } QVariant QmlTypeWrapper::toVariant() const { - if (type && type->isSingleton()) { - QQmlEngine *e = v8->engine(); - QQmlType::SingletonInstanceInfo *siinfo = type->singletonInstanceInfo(); + if (d()->type && d()->type->isSingleton()) { + QQmlEngine *e = d()->v8->engine(); + QQmlType::SingletonInstanceInfo *siinfo = d()->type->singletonInstanceInfo(); siinfo->init(e); // note: this will also create QJSValue singleton which isn't strictly required. QObject *qobjectSingleton = siinfo->qobjectApi(e); if (qobjectSingleton) { @@ -98,8 +99,8 @@ ReturnedValue QmlTypeWrapper::create(QV8Engine *v8, QObject *o, QQmlType *t, Typ ExecutionEngine *v4 = QV8Engine::getV4(v8); Scope scope(v4); - Scoped<QmlTypeWrapper> w(scope, new (v4->memoryManager) QmlTypeWrapper(v8)); - w->mode = mode; w->object = o; w->type = t; + Scoped<QmlTypeWrapper> w(scope, v4->memoryManager->alloc<QmlTypeWrapper>(v8)); + w->d()->mode = mode; w->d()->object = o; w->d()->type = t; return w.asReturnedValue(); } @@ -112,14 +113,14 @@ ReturnedValue QmlTypeWrapper::create(QV8Engine *v8, QObject *o, QQmlTypeNameCach ExecutionEngine *v4 = QV8Engine::getV4(v8); Scope scope(v4); - Scoped<QmlTypeWrapper> w(scope, new (v4->memoryManager) QmlTypeWrapper(v8)); - w->mode = mode; w->object = o; w->typeNamespace = t; w->importNamespace = importNamespace; + Scoped<QmlTypeWrapper> w(scope, v4->memoryManager->alloc<QmlTypeWrapper>(v8)); + w->d()->mode = mode; w->d()->object = o; w->d()->typeNamespace = t; w->d()->importNamespace = importNamespace; t->addref(); return w.asReturnedValue(); } -ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasProperty) +ReturnedValue QmlTypeWrapper::get(Managed *m, String *name, bool *hasProperty) { QV4::ExecutionEngine *v4 = m->engine(); QV4::Scope scope(v4); @@ -132,13 +133,13 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro if (hasProperty) *hasProperty = true; - QV8Engine *v8engine = w->v8; + QV8Engine *v8engine = w->d()->v8; QQmlContextData *context = v8engine->callingContext(); - QObject *object = w->object; + QObject *object = w->d()->object; - if (w->type) { - QQmlType *type = w->type; + if (w->d()->type) { + QQmlType *type = w->d()->type; // singleton types are handled differently to other types. if (type->isSingleton()) { @@ -150,7 +151,7 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro if (qobjectSingleton) { // check for enum value if (name->startsWithUpper()) { - if (w->mode == IncludeEnums) { + if (w->d()->mode == IncludeEnums) { // ### Optimize QByteArray enumName = name->toQString().toUtf8(); const QMetaObject *metaObject = qobjectSingleton->metaObject(); @@ -165,7 +166,7 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro } // check for property. - return QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, qobjectSingleton, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, hasProperty); + return QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, qobjectSingleton, name, QV4::QObjectWrapper::IgnoreRevision, hasProperty); } else if (!siinfo->scriptApi(e).isUndefined()) { // NOTE: if used in a binding, changes will not trigger re-evaluation since non-NOTIFYable. QV4::ScopedObject o(scope, QJSValuePrivate::get(siinfo->scriptApi(e))->getValue(v4)); @@ -185,10 +186,10 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro // Fall through to base implementation - } else if (w->object) { + } else if (w->d()->object) { QObject *ao = qmlAttachedPropertiesObjectById(type->attachedPropertiesId(), object); if (ao) - return QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, ao, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, hasProperty); + return QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), context, ao, name, QV4::QObjectWrapper::IgnoreRevision, hasProperty); // Fall through to base implementation } @@ -198,19 +199,19 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro // Fall through to base implementation - } else if (w->typeNamespace) { - Q_ASSERT(w->importNamespace); - QQmlTypeNameCache::Result r = w->typeNamespace->query(name, w->importNamespace); + } else if (w->d()->typeNamespace) { + Q_ASSERT(w->d()->importNamespace); + QQmlTypeNameCache::Result r = w->d()->typeNamespace->query(name, w->d()->importNamespace); if (r.isValid()) { QQmlContextData *context = v8engine->callingContext(); if (r.type) { - return create(w->v8, object, r.type, w->mode); + return create(w->d()->v8, object, r.type, w->d()->mode); } else if (r.scriptIndex != -1) { QV4::ScopedObject scripts(scope, context->importedScripts); return scripts->getIndexed(r.scriptIndex); } else if (r.importNamespace) { - return create(w->v8, object, context->imports, r.importNamespace); + return create(w->d()->v8, object, context->imports, r.importNamespace); } return QV4::Encode::undefined(); @@ -229,7 +230,7 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro } -void QmlTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value) +void QmlTypeWrapper::put(Managed *m, String *name, const ValueRef value) { QmlTypeWrapper *w = m->as<QmlTypeWrapper>(); QV4::ExecutionEngine *v4 = m->engine(); @@ -244,12 +245,12 @@ void QmlTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value) QV8Engine *v8engine = v4->v8Engine; QQmlContextData *context = v8engine->callingContext(); - QQmlType *type = w->type; - if (type && !type->isSingleton() && w->object) { - QObject *object = w->object; + QQmlType *type = w->d()->type; + if (type && !type->isSingleton() && w->d()->object) { + QObject *object = w->d()->object; QObject *ao = qmlAttachedPropertiesObjectById(type->attachedPropertiesId(), object); if (ao) - QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, ao, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, value); + QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, ao, name, QV4::QObjectWrapper::IgnoreRevision, value); } else if (type && type->isSingleton()) { QQmlEngine *e = v8engine->engine(); QQmlType::SingletonInstanceInfo *siinfo = type->singletonInstanceInfo(); @@ -257,7 +258,7 @@ void QmlTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value) QObject *qobjectSingleton = siinfo->qobjectApi(e); if (qobjectSingleton) { - QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, qobjectSingleton, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, value); + QV4::QObjectWrapper::setQmlProperty(v4->currentContext(), context, qobjectSingleton, name, QV4::QObjectWrapper::IgnoreRevision, value); } else if (!siinfo->scriptApi(e).isUndefined()) { QV4::ScopedObject apiprivate(scope, QJSValuePrivate::get(siinfo->scriptApi(e))->value); if (!apiprivate) { @@ -271,19 +272,17 @@ void QmlTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value) } } -PropertyAttributes QmlTypeWrapper::query(const Managed *m, StringRef name) +PropertyAttributes QmlTypeWrapper::query(const Managed *m, String *name) { // ### Implement more efficiently. - Scope scope(m->engine()); - ScopedString n(scope, name); bool hasProperty = false; - static_cast<Object *>(const_cast<Managed*>(m))->get(n, &hasProperty); + static_cast<Object *>(const_cast<Managed*>(m))->get(name, &hasProperty); return hasProperty ? Attr_Data : Attr_Invalid; } void QmlTypeWrapper::destroy(Managed *that) { - static_cast<QmlTypeWrapper *>(that)->~QmlTypeWrapper(); + static_cast<QmlTypeWrapper *>(that)->d()->~Data(); } bool QmlTypeWrapper::isEqualTo(Managed *a, Managed *b) diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index 355a6751a9..27ecac991e 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -68,13 +68,23 @@ namespace QV4 { struct Q_QML_EXPORT QmlTypeWrapper : Object { - V4_OBJECT + enum TypeNameMode { IncludeEnums, ExcludeEnums }; + + struct Data : Object::Data { + Data(QV8Engine *engine); + ~Data(); + QV8Engine *v8; + TypeNameMode mode; + QPointer<QObject> object; + + QQmlType *type; + QQmlTypeNameCache *typeNamespace; + const void *importNamespace; + }; + V4_OBJECT(Object) private: - QmlTypeWrapper(QV8Engine *engine); - ~QmlTypeWrapper(); public: - enum TypeNameMode { IncludeEnums, ExcludeEnums }; bool isSingleton() const; @@ -84,22 +94,13 @@ public: static ReturnedValue create(QV8Engine *, QObject *, QQmlTypeNameCache *, const void *, TypeNameMode = IncludeEnums); - static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty); - static void put(Managed *m, const StringRef name, const ValueRef value); - static PropertyAttributes query(const Managed *, StringRef name); + static ReturnedValue get(Managed *m, String *name, bool *hasProperty); + static void put(Managed *m, String *name, const ValueRef value); + static PropertyAttributes query(const Managed *, String *name); static void destroy(Managed *that); -protected: static bool isEqualTo(Managed *that, Managed *o); -private: - QV8Engine *v8; - TypeNameMode mode; - QPointer<QObject> object; - - QQmlType *type; - QQmlTypeNameCache *typeNamespace; - const void *importNamespace; }; } diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 9a87493e54..1de596b4d3 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -59,41 +59,46 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(QmlValueTypeWrapper); -class QmlValueTypeReference : public QmlValueTypeWrapper +struct QmlValueTypeReference : public QmlValueTypeWrapper { -public: - QmlValueTypeReference(QV8Engine *engine); - - QPointer<QObject> object; - int property; + struct Data : QmlValueTypeWrapper::Data + { + Data(QV8Engine *engine); + QPointer<QObject> object; + int property; + }; + V4_OBJECT(QmlValueTypeWrapper) }; -class QmlValueTypeCopy : public QmlValueTypeWrapper -{ -public: - QmlValueTypeCopy(QV8Engine *engine); +DEFINE_OBJECT_VTABLE(QmlValueTypeReference); - QVariant value; +struct QmlValueTypeCopy : public QmlValueTypeWrapper +{ + struct Data : QmlValueTypeWrapper::Data + { + Data(QV8Engine *engine); + QVariant value; + }; + V4_OBJECT(QmlValueTypeWrapper) }; -QmlValueTypeWrapper::QmlValueTypeWrapper(QV8Engine *engine, ObjectType objectType) - : Object(QV8Engine::getV4(engine)), objectType(objectType) -{ - v8 = engine; - setVTable(staticVTable()); -} +DEFINE_OBJECT_VTABLE(QmlValueTypeCopy); -QmlValueTypeWrapper::~QmlValueTypeWrapper() +QmlValueTypeWrapper::Data::Data(QV8Engine *engine, ObjectType objectType) + : Object::Data(QV8Engine::getV4(engine)) + , v8(engine) + , objectType(objectType) { + setVTable(staticVTable()); } -QmlValueTypeReference::QmlValueTypeReference(QV8Engine *engine) -: QmlValueTypeWrapper(engine, Reference) +QmlValueTypeReference::Data::Data(QV8Engine *engine) + : QmlValueTypeWrapper::Data(engine, Reference) { } -QmlValueTypeCopy::QmlValueTypeCopy(QV8Engine *engine) -: QmlValueTypeWrapper(engine, Copy) +QmlValueTypeCopy::Data::Data(QV8Engine *engine) + : QmlValueTypeWrapper::Data(engine, Copy) { } @@ -102,30 +107,30 @@ static bool readReferenceValue(const QmlValueTypeReference *reference) { // A reference resource may be either a "true" reference (eg, to a QVector3D property) // or a "variant" reference (eg, to a QVariant property which happens to contain a value-type). - QMetaProperty writebackProperty = reference->object->metaObject()->property(reference->property); + QMetaProperty writebackProperty = reference->d()->object->metaObject()->property(reference->d()->property); if (writebackProperty.userType() == QMetaType::QVariant) { // variant-containing-value-type reference QVariant variantReferenceValue; - reference->type->readVariantValue(reference->object, reference->property, &variantReferenceValue); + reference->d()->type->readVariantValue(reference->d()->object, reference->d()->property, &variantReferenceValue); int variantReferenceType = variantReferenceValue.userType(); - if (variantReferenceType != reference->type->userType()) { + if (variantReferenceType != reference->d()->type->userType()) { // This is a stale VariantReference. That is, the variant has been // overwritten with a different type in the meantime. // We need to modify this reference to the updated value type, if // possible, or return false if it is not a value type. if (QQmlValueTypeFactory::isValueType(variantReferenceType)) { - reference->type = QQmlValueTypeFactory::valueType(variantReferenceType); - if (!reference->type) { + reference->d()->type = QQmlValueTypeFactory::valueType(variantReferenceType); + if (!reference->d()->type) { return false; } } else { return false; } } - reference->type->setValue(variantReferenceValue); + reference->d()->type->setValue(variantReferenceValue); } else { // value-type reference - reference->type->read(reference->object, reference->property); + reference->d()->type->read(reference->d()->object, reference->d()->property); } return true; } @@ -147,10 +152,10 @@ ReturnedValue QmlValueTypeWrapper::create(QV8Engine *v8, QObject *object, int pr Scope scope(v4); initProto(v4); - Scoped<QmlValueTypeReference> r(scope, new (v4->memoryManager) QmlValueTypeReference(v8)); - r->setPrototype(v4->qmlExtensions()->valueTypeWrapperPrototype); - r->type = type; r->object = object; r->property = property; - return r.asReturnedValue(); + QmlValueTypeReference *r = v4->memoryManager->alloc<QmlValueTypeReference>(v8); + r->d()->internalClass = r->d()->internalClass->changePrototype(v4->qmlExtensions()->valueTypeWrapperPrototype); + r->d()->type = type; r->d()->object = object; r->d()->property = property; + return r->asReturnedValue(); } ReturnedValue QmlValueTypeWrapper::create(QV8Engine *v8, const QVariant &value, QQmlValueType *type) @@ -159,45 +164,44 @@ ReturnedValue QmlValueTypeWrapper::create(QV8Engine *v8, const QVariant &value, Scope scope(v4); initProto(v4); - Scoped<QmlValueTypeCopy> r(scope, new (v4->memoryManager) QmlValueTypeCopy(v8)); - r->setPrototype(v4->qmlExtensions()->valueTypeWrapperPrototype); - r->type = type; r->value = value; - return r.asReturnedValue(); + QmlValueTypeCopy *r = v4->memoryManager->alloc<QmlValueTypeCopy>(v8); + r->d()->internalClass = r->d()->internalClass->changePrototype(v4->qmlExtensions()->valueTypeWrapperPrototype); + r->d()->type = type; r->d()->value = value; + return r->asReturnedValue(); } QVariant QmlValueTypeWrapper::toVariant() const { - if (objectType == QmlValueTypeWrapper::Reference) { + if (d()->objectType == QmlValueTypeWrapper::Reference) { const QmlValueTypeReference *reference = static_cast<const QmlValueTypeReference *>(this); - if (reference->object && readReferenceValue(reference)) { - return reference->type->value(); + if (reference->d()->object && readReferenceValue(reference)) { + return reference->d()->type->value(); } else { return QVariant(); } } else { - Q_ASSERT(objectType == QmlValueTypeWrapper::Copy); - return static_cast<const QmlValueTypeCopy *>(this)->value; + Q_ASSERT(d()->objectType == QmlValueTypeWrapper::Copy); + return static_cast<const QmlValueTypeCopy *>(this)->d()->value; } } void QmlValueTypeWrapper::destroy(Managed *that) { QmlValueTypeWrapper *w = that->as<QmlValueTypeWrapper>(); - assert(w); - if (w->objectType == Reference) - static_cast<QmlValueTypeReference *>(w)->~QmlValueTypeReference(); + if (w->d()->objectType == Reference) + static_cast<QmlValueTypeReference *>(w)->d()->~Data(); else - static_cast<QmlValueTypeCopy *>(w)->~QmlValueTypeCopy(); + static_cast<QmlValueTypeCopy *>(w)->d()->~Data(); } bool QmlValueTypeWrapper::isEqualTo(Managed *m, Managed *other) { QV4::QmlValueTypeWrapper *lv = m->as<QmlValueTypeWrapper>(); - assert(lv); + Q_ASSERT(lv); if (QV4::VariantObject *rv = other->as<VariantObject>()) - return lv->isEqual(rv->data); + return lv->isEqual(rv->d()->data); if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>()) return lv->isEqual(v->toVariant()); @@ -205,7 +209,7 @@ bool QmlValueTypeWrapper::isEqualTo(Managed *m, Managed *other) return false; } -PropertyAttributes QmlValueTypeWrapper::query(const Managed *m, StringRef name) +PropertyAttributes QmlValueTypeWrapper::query(const Managed *m, String *name) { const QmlValueTypeWrapper *r = m->as<const QmlValueTypeWrapper>(); QV4::ExecutionEngine *v4 = m->engine(); @@ -217,59 +221,59 @@ PropertyAttributes QmlValueTypeWrapper::query(const Managed *m, StringRef name) QQmlPropertyData local; QQmlPropertyData *result = 0; { - QQmlData *ddata = QQmlData::get(r->type, false); + QQmlData *ddata = QQmlData::get(r->d()->type, false); if (ddata && ddata->propertyCache) - result = ddata->propertyCache->property(name.getPointer(), 0, 0); + result = ddata->propertyCache->property(name, 0, 0); else - result = QQmlPropertyCache::property(r->v8->engine(), r->type, name.getPointer(), 0, local); + result = QQmlPropertyCache::property(r->d()->v8->engine(), r->d()->type, name, 0, local); } return result ? Attr_Data : Attr_Invalid; } bool QmlValueTypeWrapper::isEqual(const QVariant& value) { - if (objectType == QmlValueTypeWrapper::Reference) { + if (d()->objectType == QmlValueTypeWrapper::Reference) { QmlValueTypeReference *reference = static_cast<QmlValueTypeReference *>(this); - if (reference->object && readReferenceValue(reference)) { - return reference->type->isEqual(value); + if (reference->d()->object && readReferenceValue(reference)) { + return reference->d()->type->isEqual(value); } else { return false; } } else { - Q_ASSERT(objectType == QmlValueTypeWrapper::Copy); + Q_ASSERT(d()->objectType == QmlValueTypeWrapper::Copy); QmlValueTypeCopy *copy = static_cast<QmlValueTypeCopy *>(this); - type->setValue(copy->value); - if (type->isEqual(value)) + d()->type->setValue(copy->d()->value); + if (d()->type->isEqual(value)) return true; - return (value == copy->value); + return (value == copy->d()->value); } } ReturnedValue QmlValueTypeWrapper::method_toString(CallContext *ctx) { - Object *o = ctx->callData->thisObject.asObject(); + Object *o = ctx->d()->callData->thisObject.asObject(); if (!o) return ctx->throwTypeError(); QmlValueTypeWrapper *w = o->as<QmlValueTypeWrapper>(); if (!w) return ctx->throwTypeError(); - if (w->objectType == QmlValueTypeWrapper::Reference) { + if (w->d()->objectType == QmlValueTypeWrapper::Reference) { QmlValueTypeReference *reference = static_cast<QmlValueTypeReference *>(w); - if (reference->object && readReferenceValue(reference)) { - return w->v8->toString(w->type->toString()); + if (reference->d()->object && readReferenceValue(reference)) { + return w->d()->v8->toString(w->d()->type->toString()); } else { return QV4::Encode::undefined(); } } else { - Q_ASSERT(w->objectType == QmlValueTypeWrapper::Copy); + Q_ASSERT(w->d()->objectType == QmlValueTypeWrapper::Copy); QmlValueTypeCopy *copy = static_cast<QmlValueTypeCopy *>(w); - w->type->setValue(copy->value); - return w->v8->toString(w->type->toString()); + w->d()->type->setValue(copy->d()->value); + return w->d()->v8->toString(w->d()->type->toString()); } } -ReturnedValue QmlValueTypeWrapper::get(Managed *m, const StringRef name, bool *hasProperty) +ReturnedValue QmlValueTypeWrapper::get(Managed *m, String *name, bool *hasProperty) { QmlValueTypeWrapper *r = m->as<QmlValueTypeWrapper>(); QV4::ExecutionEngine *v4 = m->engine(); @@ -277,28 +281,28 @@ ReturnedValue QmlValueTypeWrapper::get(Managed *m, const StringRef name, bool *h return v4->currentContext()->throwTypeError(); // Note: readReferenceValue() can change the reference->type. - if (r->objectType == QmlValueTypeWrapper::Reference) { + if (r->d()->objectType == QmlValueTypeWrapper::Reference) { QmlValueTypeReference *reference = static_cast<QmlValueTypeReference *>(r); - if (!reference->object || !readReferenceValue(reference)) + if (!reference->d()->object || !readReferenceValue(reference)) return Primitive::undefinedValue().asReturnedValue(); } else { - Q_ASSERT(r->objectType == QmlValueTypeWrapper::Copy); + Q_ASSERT(r->d()->objectType == QmlValueTypeWrapper::Copy); QmlValueTypeCopy *copy = static_cast<QmlValueTypeCopy *>(r); - r->type->setValue(copy->value); + r->d()->type->setValue(copy->d()->value); } QQmlPropertyData local; QQmlPropertyData *result = 0; { - QQmlData *ddata = QQmlData::get(r->type, false); + QQmlData *ddata = QQmlData::get(r->d()->type, false); if (ddata && ddata->propertyCache) - result = ddata->propertyCache->property(name.getPointer(), 0, 0); + result = ddata->propertyCache->property(name, 0, 0); else - result = QQmlPropertyCache::property(r->v8->engine(), r->type, name, 0, local); + result = QQmlPropertyCache::property(r->d()->v8->engine(), r->d()->type, name, 0, local); } if (!result) @@ -307,31 +311,31 @@ ReturnedValue QmlValueTypeWrapper::get(Managed *m, const StringRef name, bool *h if (result->isFunction()) { // calling a Q_INVOKABLE function of a value type QQmlContextData *qmlContext = QV4::QmlContextWrapper::callingContext(v4); - return QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), qmlContext, r->type, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision); + return QV4::QObjectWrapper::getQmlProperty(v4->currentContext(), qmlContext, r->d()->type, name, QV4::QObjectWrapper::IgnoreRevision); } #define VALUE_TYPE_LOAD(metatype, cpptype, constructor) \ if (result->propType == metatype) { \ cpptype v; \ void *args[] = { &v, 0 }; \ - r->type->qt_metacall(QMetaObject::ReadProperty, result->coreIndex, args); \ + r->d()->type->qt_metacall(QMetaObject::ReadProperty, result->coreIndex, args); \ return constructor(v); \ } // These four types are the most common used by the value type wrappers VALUE_TYPE_LOAD(QMetaType::QReal, qreal, QV4::Encode); VALUE_TYPE_LOAD(QMetaType::Int, int, QV4::Encode); - VALUE_TYPE_LOAD(QMetaType::QString, QString, r->v8->toString); + VALUE_TYPE_LOAD(QMetaType::QString, QString, r->d()->v8->toString); VALUE_TYPE_LOAD(QMetaType::Bool, bool, QV4::Encode); QVariant v(result->propType, (void *)0); void *args[] = { v.data(), 0 }; - r->type->qt_metacall(QMetaObject::ReadProperty, result->coreIndex, args); - return r->v8->fromVariant(v); + r->d()->type->qt_metacall(QMetaObject::ReadProperty, result->coreIndex, args); + return r->d()->v8->fromVariant(v); #undef VALUE_TYPE_ACCESSOR } -void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value) +void QmlValueTypeWrapper::put(Managed *m, String *name, const ValueRef value) { ExecutionEngine *v4 = m->engine(); Scope scope(v4); @@ -345,38 +349,38 @@ void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef v } QByteArray propName = name->toQString().toUtf8(); - if (r->objectType == QmlValueTypeWrapper::Reference) { + if (r->d()->objectType == QmlValueTypeWrapper::Reference) { QmlValueTypeReference *reference = static_cast<QmlValueTypeReference *>(r.getPointer()); - QMetaProperty writebackProperty = reference->object->metaObject()->property(reference->property); + QMetaProperty writebackProperty = reference->d()->object->metaObject()->property(reference->d()->property); - if (!reference->object || !writebackProperty.isWritable() || !readReferenceValue(reference)) + if (!reference->d()->object || !writebackProperty.isWritable() || !readReferenceValue(reference)) return; // we lookup the index after readReferenceValue() since it can change the reference->type. - int index = r->type->metaObject()->indexOfProperty(propName.constData()); + int index = r->d()->type->metaObject()->indexOfProperty(propName.constData()); if (index == -1) return; - QMetaProperty p = r->type->metaObject()->property(index); + QMetaProperty p = r->d()->type->metaObject()->property(index); QQmlBinding *newBinding = 0; QV4::ScopedFunctionObject f(scope, value); if (f) { - if (!f->bindingKeyFlag) { + if (!f->bindingKeyFlag()) { // assigning a JS function to a non-var-property is not allowed. QString error = QLatin1String("Cannot assign JavaScript function to value-type property"); - Scoped<String> e(scope, r->v8->toString(error)); + Scoped<String> e(scope, r->d()->v8->toString(error)); v4->currentContext()->throwError(e); return; } - QQmlContextData *context = r->v8->callingContext(); + QQmlContextData *context = r->d()->v8->callingContext(); QQmlPropertyData cacheData; cacheData.setFlags(QQmlPropertyData::IsWritable | QQmlPropertyData::IsValueTypeVirtual); - cacheData.propType = reference->object->metaObject()->property(reference->property).userType(); - cacheData.coreIndex = reference->property; + cacheData.propType = reference->d()->object->metaObject()->property(reference->d()->property).userType(); + cacheData.coreIndex = reference->d()->property; cacheData.valueTypeFlags = 0; cacheData.valueTypeCoreIndex = index; cacheData.valueTypePropType = p.userType(); @@ -384,46 +388,46 @@ void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef v QV4::Scoped<QQmlBindingFunction> bindingFunction(scope, f); bindingFunction->initBindingLocation(); - newBinding = new QQmlBinding(value, reference->object, context); - newBinding->setTarget(reference->object, cacheData, context); + newBinding = new QQmlBinding(value, reference->d()->object, context); + newBinding->setTarget(reference->d()->object, cacheData, context); } QQmlAbstractBinding *oldBinding = - QQmlPropertyPrivate::setBinding(reference->object, reference->property, index, newBinding); + QQmlPropertyPrivate::setBinding(reference->d()->object, reference->d()->property, index, newBinding); if (oldBinding) oldBinding->destroy(); if (!f) { - QVariant v = r->v8->toVariant(value, -1); + QVariant v = r->d()->v8->toVariant(value, -1); if (p.isEnumType() && (QMetaType::Type)v.type() == QMetaType::Double) v = v.toInt(); - p.write(reference->type, v); + p.write(reference->d()->type, v); if (writebackProperty.userType() == QMetaType::QVariant) { - QVariant variantReferenceValue = r->type->value(); - reference->type->writeVariantValue(reference->object, reference->property, 0, &variantReferenceValue); + QVariant variantReferenceValue = r->d()->type->value(); + reference->d()->type->writeVariantValue(reference->d()->object, reference->d()->property, 0, &variantReferenceValue); } else { - reference->type->write(reference->object, reference->property, 0); + reference->d()->type->write(reference->d()->object, reference->d()->property, 0); } } } else { - Q_ASSERT(r->objectType == QmlValueTypeWrapper::Copy); + Q_ASSERT(r->d()->objectType == QmlValueTypeWrapper::Copy); QmlValueTypeCopy *copy = static_cast<QmlValueTypeCopy *>(r.getPointer()); - int index = r->type->metaObject()->indexOfProperty(propName.constData()); + int index = r->d()->type->metaObject()->indexOfProperty(propName.constData()); if (index == -1) return; - QVariant v = r->v8->toVariant(value, -1); + QVariant v = r->d()->v8->toVariant(value, -1); - r->type->setValue(copy->value); - QMetaProperty p = r->type->metaObject()->property(index); - p.write(r->type, v); - copy->value = r->type->value(); + r->d()->type->setValue(copy->d()->value); + QMetaProperty p = r->d()->type->metaObject()->property(index); + p.write(r->d()->type, v); + copy->d()->value = r->d()->type->value(); } } diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index d66dbbba0c..53d5ae95af 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -68,11 +68,14 @@ namespace QV4 { struct Q_QML_EXPORT QmlValueTypeWrapper : Object { - V4_OBJECT -protected: enum ObjectType { Reference, Copy }; - QmlValueTypeWrapper(QV8Engine *engine, ObjectType type); - ~QmlValueTypeWrapper(); + struct Data : Object::Data { + Data(QV8Engine *engine, ObjectType type); + QV8Engine *v8; + ObjectType objectType; + mutable QQmlValueType *type; + }; + V4_OBJECT(Object) public: @@ -82,19 +85,14 @@ public: QVariant toVariant() const; bool isEqual(const QVariant& value); - - static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty); - static void put(Managed *m, const StringRef name, const ValueRef value); + static ReturnedValue get(Managed *m, String *name, bool *hasProperty); + static void put(Managed *m, String *name, const ValueRef value); static void destroy(Managed *that); static bool isEqualTo(Managed *m, Managed *other); - static PropertyAttributes query(const Managed *, StringRef name); + static PropertyAttributes query(const Managed *, String *name); static QV4::ReturnedValue method_toString(CallContext *ctx); - QV8Engine *v8; - ObjectType objectType; - mutable QQmlValueType *type; - static void initProto(ExecutionEngine *v4); }; diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 1ff95a245d..2f04984264 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -1087,7 +1087,7 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) // And, if the new value is a scarce resource, we need to ensure that it does not get // automatically released by the engine until no other references to it exist. QV4::ScopedValue newv(scope, QQmlEnginePrivate::get(ctxt->engine)->v8engine()->fromVariant(value)); - QV4::VariantObjectRef v = newv; + QV4::Scoped<QV4::VariantObject> v(scope, newv); if (!!v) v->addVmePropertyReference(); diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index d89dc92b68..e7bea80a18 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -72,7 +72,7 @@ using namespace QV4; #ifndef QT_NO_XMLSTREAMREADER #define V4THROW_REFERENCE(string) { \ - Scoped<Object> error(scope, ctx->engine->newReferenceErrorObject(QStringLiteral(string))); \ + Scoped<Object> error(scope, ctx->engine()->newReferenceErrorObject(QStringLiteral(string))); \ return ctx->throwError(error); \ } @@ -105,9 +105,9 @@ static ReturnedValue constructMeObject(const ValueRef thisObj, QV8Engine *e) ExecutionEngine *v4 = QV8Engine::getV4(e); Scope scope(v4); Scoped<Object> meObj(scope, v4->newObject()); - meObj->put(ScopedString(scope, v4->newString(QStringLiteral("ThisObject"))), thisObj); + meObj->put(ScopedString(scope, v4->newString(QStringLiteral("ThisObject"))).getPointer(), thisObj); ScopedValue v(scope, QmlContextWrapper::qmlScope(e, e->callingContext(), 0)); - meObj->put(ScopedString(scope, v4->newString(QStringLiteral("ActivationObject"))), v); + meObj->put(ScopedString(scope, v4->newString(QStringLiteral("ActivationObject"))).getPointer(), v); return meObj.asReturnedValue(); } @@ -185,96 +185,101 @@ public: class NamedNodeMap : public Object { - V4_OBJECT public: - NamedNodeMap(ExecutionEngine *engine, NodeImpl *data, const QList<NodeImpl *> &list) - : Object(engine) - , list(list) - , d(data) - { - setVTable(staticVTable()); + struct Data : Object::Data { + Data(ExecutionEngine *engine, NodeImpl *data, const QList<NodeImpl *> &list) + : Object::Data(engine) + , list(list) + , d(data) + { + setVTable(staticVTable()); - if (d) - d->addref(); - } - ~NamedNodeMap() { - if (d) - d->release(); - } + if (d) + d->addref(); + } + ~Data() { + if (d) + d->release(); + } + QList<NodeImpl *> list; // Only used in NamedNodeMap + NodeImpl *d; + }; + V4_OBJECT(Object) // C++ API static ReturnedValue create(QV8Engine *, NodeImpl *, const QList<NodeImpl *> &); // JS API static void destroy(Managed *that) { - that->as<NamedNodeMap>()->~NamedNodeMap(); + that->as<NamedNodeMap>()->d()->~Data(); } - static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty); + static ReturnedValue get(Managed *m, String *name, bool *hasProperty); static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty); - - QList<NodeImpl *> list; // Only used in NamedNodeMap - NodeImpl *d; }; DEFINE_OBJECT_VTABLE(NamedNodeMap); class NodeList : public Object { - V4_OBJECT public: - NodeList(ExecutionEngine *engine, NodeImpl *data) - : Object(engine) - , d(data) - { - setVTable(staticVTable()); + struct Data : Object::Data { + Data(ExecutionEngine *engine, NodeImpl *data) + : Object::Data(engine) + , d(data) + { + setVTable(staticVTable()); - if (d) - d->addref(); - } - ~NodeList() { - if (d) - d->release(); - } + if (d) + d->addref(); + } + ~Data() { + if (d) + d->release(); + } + NodeImpl *d; + }; + V4_OBJECT(Object) // JS API static void destroy(Managed *that) { - that->as<NodeList>()->~NodeList(); + that->as<NodeList>()->d()->~Data(); } - static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty); + static ReturnedValue get(Managed *m, String *name, bool *hasProperty); static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty); // C++ API static ReturnedValue create(QV8Engine *, NodeImpl *); - NodeImpl *d; }; DEFINE_OBJECT_VTABLE(NodeList); class NodePrototype : public Object { - V4_OBJECT public: - NodePrototype(ExecutionEngine *engine) - : Object(engine) - { - setVTable(staticVTable()); - - Scope scope(engine); - ScopedObject protectThis(scope, this); - - defineAccessorProperty(QStringLiteral("nodeName"), method_get_nodeName, 0); - defineAccessorProperty(QStringLiteral("nodeValue"), method_get_nodeValue, 0); - defineAccessorProperty(QStringLiteral("nodeType"), method_get_nodeType, 0); - - defineAccessorProperty(QStringLiteral("parentNode"), method_get_parentNode, 0); - defineAccessorProperty(QStringLiteral("childNodes"), method_get_childNodes, 0); - defineAccessorProperty(QStringLiteral("firstChild"), method_get_firstChild, 0); - defineAccessorProperty(QStringLiteral("lastChild"), method_get_lastChild, 0); - defineAccessorProperty(QStringLiteral("previousSibling"), method_get_previousSibling, 0); - defineAccessorProperty(QStringLiteral("nextSibling"), method_get_nextSibling, 0); - defineAccessorProperty(QStringLiteral("attributes"), method_get_attributes, 0); - } + struct Data : Object::Data { + Data(ExecutionEngine *engine) + : Object::Data(engine) + { + setVTable(staticVTable()); + + Scope scope(engine); + ScopedObject o(scope, this); + + o->defineAccessorProperty(QStringLiteral("nodeName"), method_get_nodeName, 0); + o->defineAccessorProperty(QStringLiteral("nodeValue"), method_get_nodeValue, 0); + o->defineAccessorProperty(QStringLiteral("nodeType"), method_get_nodeType, 0); + + o->defineAccessorProperty(QStringLiteral("parentNode"), method_get_parentNode, 0); + o->defineAccessorProperty(QStringLiteral("childNodes"), method_get_childNodes, 0); + o->defineAccessorProperty(QStringLiteral("firstChild"), method_get_firstChild, 0); + o->defineAccessorProperty(QStringLiteral("lastChild"), method_get_lastChild, 0); + o->defineAccessorProperty(QStringLiteral("previousSibling"), method_get_previousSibling, 0); + o->defineAccessorProperty(QStringLiteral("nextSibling"), method_get_nextSibling, 0); + o->defineAccessorProperty(QStringLiteral("attributes"), method_get_attributes, 0); + } + }; + V4_OBJECT(Object) static void initClass(ExecutionEngine *engine); @@ -304,39 +309,40 @@ public: DEFINE_OBJECT_VTABLE(NodePrototype); -class Node : public Object +struct Node : public Object { - V4_OBJECT + struct Data : Object::Data { + Data(ExecutionEngine *engine, NodeImpl *data) + : Object::Data(engine) + , d(data) + { + setVTable(staticVTable()); - Node(ExecutionEngine *engine, NodeImpl *data) - : Object(engine) - , d(data) - { - setVTable(staticVTable()); + if (d) + d->addref(); + } + ~Data() { + if (d) + d->release(); + } + NodeImpl *d; + }; + V4_OBJECT(Object) - if (d) - d->addref(); - } - ~Node() { - if (d) - d->release(); - } // JS API static void destroy(Managed *that) { - that->as<Node>()->~Node(); + that->as<Node>()->d()->~Data(); } // C++ API static ReturnedValue create(QV8Engine *, NodeImpl *); - Node(const Node &o); bool isNull() const; - NodeImpl *d; - private: Node &operator=(const Node &); + Node(const Node &o); }; DEFINE_OBJECT_VTABLE(Node); @@ -420,12 +426,12 @@ void NodeImpl::release() ReturnedValue NodePrototype::method_get_nodeName(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); QString name; - switch (r->d->type) { + switch (r->d()->d->type) { case NodeImpl::Document: name = QStringLiteral("#document"); break; @@ -436,52 +442,52 @@ ReturnedValue NodePrototype::method_get_nodeName(CallContext *ctx) name = QStringLiteral("#text"); break; default: - name = r->d->name; + name = r->d()->d->name; break; } - return Encode(ctx->engine->newString(name)); + return Encode(ctx->d()->engine->newString(name)); } ReturnedValue NodePrototype::method_get_nodeValue(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - if (r->d->type == NodeImpl::Document || - r->d->type == NodeImpl::DocumentFragment || - r->d->type == NodeImpl::DocumentType || - r->d->type == NodeImpl::Element || - r->d->type == NodeImpl::Entity || - r->d->type == NodeImpl::EntityReference || - r->d->type == NodeImpl::Notation) + if (r->d()->d->type == NodeImpl::Document || + r->d()->d->type == NodeImpl::DocumentFragment || + r->d()->d->type == NodeImpl::DocumentType || + r->d()->d->type == NodeImpl::Element || + r->d()->d->type == NodeImpl::Entity || + r->d()->d->type == NodeImpl::EntityReference || + r->d()->d->type == NodeImpl::Notation) return Encode::null(); - return Encode(ctx->engine->newString(r->d->data)); + return Encode(ctx->d()->engine->newString(r->d()->d->data)); } ReturnedValue NodePrototype::method_get_nodeType(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - return Encode(r->d->type); + return Encode(r->d()->d->type); } ReturnedValue NodePrototype::method_get_parentNode(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (r->d->parent) - return Node::create(engine, r->d->parent); + if (r->d()->d->parent) + return Node::create(engine, r->d()->d->parent); else return Encode::null(); } @@ -489,63 +495,63 @@ ReturnedValue NodePrototype::method_get_parentNode(CallContext *ctx) ReturnedValue NodePrototype::method_get_childNodes(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return NodeList::create(engine, r->d); + return NodeList::create(engine, r->d()->d); } ReturnedValue NodePrototype::method_get_firstChild(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (r->d->children.isEmpty()) + if (r->d()->d->children.isEmpty()) return Encode::null(); else - return Node::create(engine, r->d->children.first()); + return Node::create(engine, r->d()->d->children.first()); } ReturnedValue NodePrototype::method_get_lastChild(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (r->d->children.isEmpty()) + if (r->d()->d->children.isEmpty()) return Encode::null(); else - return Node::create(engine, r->d->children.last()); + return Node::create(engine, r->d()->d->children.last()); } ReturnedValue NodePrototype::method_get_previousSibling(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (!r->d->parent) + if (!r->d()->d->parent) return Encode::null(); - for (int ii = 0; ii < r->d->parent->children.count(); ++ii) { - if (r->d->parent->children.at(ii) == r->d) { + for (int ii = 0; ii < r->d()->d->parent->children.count(); ++ii) { + if (r->d()->d->parent->children.at(ii) == r->d()->d) { if (ii == 0) return Encode::null(); else - return Node::create(engine, r->d->parent->children.at(ii - 1)); + return Node::create(engine, r->d()->d->parent->children.at(ii - 1)); } } @@ -555,21 +561,21 @@ ReturnedValue NodePrototype::method_get_previousSibling(CallContext *ctx) ReturnedValue NodePrototype::method_get_nextSibling(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (!r->d->parent) + if (!r->d()->d->parent) return Encode::null(); - for (int ii = 0; ii < r->d->parent->children.count(); ++ii) { - if (r->d->parent->children.at(ii) == r->d) { - if ((ii + 1) == r->d->parent->children.count()) + for (int ii = 0; ii < r->d()->d->parent->children.count(); ++ii) { + if (r->d()->d->parent->children.at(ii) == r->d()->d) { + if ((ii + 1) == r->d()->d->parent->children.count()) return Encode::null(); else - return Node::create(engine, r->d->parent->children.at(ii + 1)); + return Node::create(engine, r->d()->d->parent->children.at(ii + 1)); } } @@ -579,16 +585,16 @@ ReturnedValue NodePrototype::method_get_nextSibling(CallContext *ctx) ReturnedValue NodePrototype::method_get_attributes(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return ctx->throwTypeError(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (r->d->type != NodeImpl::Element) + if (r->d()->d->type != NodeImpl::Element) return Encode::null(); else - return NamedNodeMap::create(engine, r->d, r->d->attributes); + return NamedNodeMap::create(engine, r->d()->d, r->d()->d->attributes); } ReturnedValue NodePrototype::getProto(ExecutionEngine *v4) @@ -596,7 +602,7 @@ ReturnedValue NodePrototype::getProto(ExecutionEngine *v4) Scope scope(v4); QQmlXMLHttpRequestData *d = xhrdata(v4->v8Engine); if (d->nodePrototype.isUndefined()) { - ScopedObject p(scope, new (v4->memoryManager) NodePrototype(v4)); + ScopedObject p(scope, v4->memoryManager->alloc<NodePrototype>(v4)); d->nodePrototype = p; v4->v8Engine->freezeObject(p); } @@ -608,7 +614,7 @@ ReturnedValue Node::create(QV8Engine *engine, NodeImpl *data) ExecutionEngine *v4 = QV8Engine::getV4(engine); Scope scope(v4); - Scoped<Node> instance(scope, new (v4->memoryManager) Node(v4, data)); + Scoped<Node> instance(scope, v4->memoryManager->alloc<Node>(v4, data)); ScopedObject p(scope); switch (data->type) { @@ -673,45 +679,45 @@ ReturnedValue Attr::prototype(ExecutionEngine *engine) ReturnedValue Attr::method_name(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return engine->toString(r->d->name); + return engine->toString(r->d()->d->name); } ReturnedValue Attr::method_value(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return engine->toString(r->d->data); + return engine->toString(r->d()->d->data); } ReturnedValue Attr::method_ownerElement(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return Node::create(engine, r->d->parent); + return Node::create(engine, r->d()->d->parent); } ReturnedValue CharacterData::method_length(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; Q_UNUSED(engine) - return Encode(r->d->data.length()); + return Encode(r->d()->d->data.length()); } ReturnedValue CharacterData::prototype(ExecutionEngine *v4) @@ -733,21 +739,21 @@ ReturnedValue CharacterData::prototype(ExecutionEngine *v4) ReturnedValue Text::method_isElementContentWhitespace(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return Encode::undefined(); - return Encode(r->d->data.trimmed().isEmpty()); + return Encode(r->d()->d->data.trimmed().isEmpty()); } ReturnedValue Text::method_wholeText(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); if (!r) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return engine->toString(r->d->data); + return engine->toString(r->d()->d->data); } ReturnedValue Text::prototype(ExecutionEngine *v4) @@ -883,22 +889,15 @@ ReturnedValue Document::load(QV8Engine *engine, const QByteArray &data) return Encode::null(); } - ScopedObject instance(scope, new (v4->memoryManager) Node(v4, document)); + ScopedObject instance(scope, v4->memoryManager->alloc<Node>(v4, document)); ScopedObject p(scope); instance->setPrototype((p = Document::prototype(v4)).getPointer()); return instance.asReturnedValue(); } -Node::Node(const Node &o) - : Object(o.engine()), d(o.d) -{ - if (d) - d->addref(); -} - bool Node::isNull() const { - return d == 0; + return d()->d == 0; } ReturnedValue NamedNodeMap::getIndexed(Managed *m, uint index, bool *hasProperty) @@ -913,17 +912,17 @@ ReturnedValue NamedNodeMap::getIndexed(Managed *m, uint index, bool *hasProperty QV8Engine *engine = v4->v8Engine; - if ((int)index < r->list.count()) { + if ((int)index < r->d()->list.count()) { if (hasProperty) *hasProperty = true; - return Node::create(engine, r->list.at(index)); + return Node::create(engine, r->d()->list.at(index)); } if (hasProperty) *hasProperty = false; return Encode::undefined(); } -ReturnedValue NamedNodeMap::get(Managed *m, const StringRef name, bool *hasProperty) +ReturnedValue NamedNodeMap::get(Managed *m, String *name, bool *hasProperty) { NamedNodeMap *r = m->as<NamedNodeMap>(); QV4::ExecutionEngine *v4 = m->engine(); @@ -932,16 +931,16 @@ ReturnedValue NamedNodeMap::get(Managed *m, const StringRef name, bool *hasPrope name->makeIdentifier(); if (name->equals(v4->id_length)) - return Primitive::fromInt32(r->list.count()).asReturnedValue(); + return Primitive::fromInt32(r->d()->list.count()).asReturnedValue(); QV8Engine *engine = v4->v8Engine; QString str = name->toQString(); - for (int ii = 0; ii < r->list.count(); ++ii) { - if (r->list.at(ii)->name == str) { + for (int ii = 0; ii < r->d()->list.count(); ++ii) { + if (r->d()->list.at(ii)->name == str) { if (hasProperty) *hasProperty = true; - return Node::create(engine, r->list.at(ii)); + return Node::create(engine, r->d()->list.at(ii)); } } @@ -953,10 +952,7 @@ ReturnedValue NamedNodeMap::get(Managed *m, const StringRef name, bool *hasPrope ReturnedValue NamedNodeMap::create(QV8Engine *engine, NodeImpl *data, const QList<NodeImpl *> &list) { ExecutionEngine *v4 = QV8Engine::getV4(engine); - Scope scope(v4); - - Scoped<NamedNodeMap> instance(scope, new (v4->memoryManager) NamedNodeMap(v4, data, list)); - return instance.asReturnedValue(); + return (v4->memoryManager->alloc<NamedNodeMap>(v4, data, list))->asReturnedValue(); } ReturnedValue NodeList::getIndexed(Managed *m, uint index, bool *hasProperty) @@ -971,17 +967,17 @@ ReturnedValue NodeList::getIndexed(Managed *m, uint index, bool *hasProperty) QV8Engine *engine = v4->v8Engine; - if ((int)index < r->d->children.count()) { + if ((int)index < r->d()->d->children.count()) { if (hasProperty) *hasProperty = true; - return Node::create(engine, r->d->children.at(index)); + return Node::create(engine, r->d()->d->children.at(index)); } if (hasProperty) *hasProperty = false; return Encode::undefined(); } -ReturnedValue NodeList::get(Managed *m, const StringRef name, bool *hasProperty) +ReturnedValue NodeList::get(Managed *m, String *name, bool *hasProperty) { QV4::ExecutionEngine *v4 = m->engine(); NodeList *r = m->as<NodeList>(); @@ -991,60 +987,58 @@ ReturnedValue NodeList::get(Managed *m, const StringRef name, bool *hasProperty) name->makeIdentifier(); if (name->equals(v4->id_length)) - return Primitive::fromInt32(r->d->children.count()).asReturnedValue(); + return Primitive::fromInt32(r->d()->d->children.count()).asReturnedValue(); return Object::get(m, name, hasProperty); } ReturnedValue NodeList::create(QV8Engine *engine, NodeImpl *data) { ExecutionEngine *v4 = QV8Engine::getV4(engine); - Scope scope(v4); - Scoped<NodeList> instance(scope, new (v4->memoryManager) NodeList(v4, data)); - return instance.asReturnedValue(); + return (v4->memoryManager->alloc<NodeList>(v4, data))->asReturnedValue(); } ReturnedValue Document::method_documentElement(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); - if (!r || r->d->type != NodeImpl::Document) + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); + if (!r || r->d()->d->type != NodeImpl::Document) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return Node::create(engine, static_cast<DocumentImpl *>(r->d)->root); + return Node::create(engine, static_cast<DocumentImpl *>(r->d()->d)->root); } ReturnedValue Document::method_xmlStandalone(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); - if (!r || r->d->type != NodeImpl::Document) + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); + if (!r || r->d()->d->type != NodeImpl::Document) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; Q_UNUSED(engine) - return Encode(static_cast<DocumentImpl *>(r->d)->isStandalone); + return Encode(static_cast<DocumentImpl *>(r->d()->d)->isStandalone); } ReturnedValue Document::method_xmlVersion(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); - if (!r || r->d->type != NodeImpl::Document) + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); + if (!r || r->d()->d->type != NodeImpl::Document) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return engine->toString(static_cast<DocumentImpl *>(r->d)->version); + return engine->toString(static_cast<DocumentImpl *>(r->d()->d)->version); } ReturnedValue Document::method_xmlEncoding(CallContext *ctx) { Scope scope(ctx); - Scoped<Node> r(scope, ctx->callData->thisObject.as<Node>()); - if (!r || r->d->type != NodeImpl::Document) + Scoped<Node> r(scope, ctx->d()->callData->thisObject.as<Node>()); + if (!r || r->d()->d->type != NodeImpl::Document) return Encode::undefined(); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - return engine->toString(static_cast<DocumentImpl *>(r->d)->encoding); + return engine->toString(static_cast<DocumentImpl *>(r->d()->d)->encoding); } class QQmlXMLHttpRequest : public QObject @@ -1551,21 +1545,21 @@ void QQmlXMLHttpRequest::dispatchCallbackImpl(const ValueRef me) } ScopedString s(scope, v4->newString(QStringLiteral("ThisObject"))); - Scoped<Object> thisObj(scope, o->get(s)); + Scoped<Object> thisObj(scope, o->get(s.getPointer())); if (!thisObj) { ctx->throwError(QStringLiteral("QQmlXMLHttpRequest: internal error: empty ThisObject")); return; } s = v4->newString(QStringLiteral("onreadystatechange")); - Scoped<FunctionObject> callback(scope, thisObj->get(s)); + Scoped<FunctionObject> callback(scope, thisObj->get(s.getPointer())); if (!callback) { // not an error, but no onreadystatechange function to call. return; } s = v4->newString(QStringLiteral("ActivationObject")); - Scoped<Object> activationObject(scope, o->get(s)); + Scoped<Object> activationObject(scope, o->get(s.getPointer())); if (!activationObject) { v4->currentContext()->throwError(QStringLiteral("QQmlXMLHttpRequest: internal error: empty ActivationObject")); return; @@ -1607,56 +1601,54 @@ void QQmlXMLHttpRequest::destroyNetwork() struct QQmlXMLHttpRequestWrapper : public Object { - V4_OBJECT - QQmlXMLHttpRequestWrapper(ExecutionEngine *engine, QQmlXMLHttpRequest *request) - : Object(engine) - , request(request) - { - setVTable(staticVTable()); - } - ~QQmlXMLHttpRequestWrapper() { - delete request; - } + struct Data : Object::Data { + Data(ExecutionEngine *engine, QQmlXMLHttpRequest *request) + : Object::Data(engine) + , request(request) + { + setVTable(staticVTable()); + } + ~Data() { + delete request; + } + QQmlXMLHttpRequest *request; + }; + V4_OBJECT(Object) static void destroy(Managed *that) { - that->as<QQmlXMLHttpRequestWrapper>()->~QQmlXMLHttpRequestWrapper(); + that->as<QQmlXMLHttpRequestWrapper>()->d()->~Data(); } - - QQmlXMLHttpRequest *request; }; DEFINE_OBJECT_VTABLE(QQmlXMLHttpRequestWrapper); struct QQmlXMLHttpRequestCtor : public FunctionObject { - V4_OBJECT - QQmlXMLHttpRequestCtor(ExecutionEngine *engine) - : FunctionObject(engine->rootContext, QStringLiteral("XMLHttpRequest")) - { - setVTable(staticVTable()); - Scope scope(engine); - ScopedValue protectThis(scope, this); - - defineReadonlyProperty(QStringLiteral("UNSENT"), Primitive::fromInt32(0)); - defineReadonlyProperty(QStringLiteral("OPENED"), Primitive::fromInt32(1)); - defineReadonlyProperty(QStringLiteral("HEADERS_RECEIVED"), Primitive::fromInt32(2)); - defineReadonlyProperty(QStringLiteral("LOADING"), Primitive::fromInt32(3)); - defineReadonlyProperty(QStringLiteral("DONE"), Primitive::fromInt32(4)); - if (!proto) - setupProto(); - ScopedString s(scope, engine->id_prototype); - defineDefaultProperty(s, ScopedObject(scope, proto)); - } - ~QQmlXMLHttpRequestCtor() - {} - - static void destroy(Managed *that) { - that->as<QQmlXMLHttpRequestCtor>()->~QQmlXMLHttpRequestCtor(); - } + struct Data : FunctionObject::Data { + Data(ExecutionEngine *engine) + : FunctionObject::Data(engine->rootContext, QStringLiteral("XMLHttpRequest")) + { + setVTable(staticVTable()); + Scope scope(engine); + Scoped<QQmlXMLHttpRequestCtor> ctor(scope, this); + + ctor->defineReadonlyProperty(QStringLiteral("UNSENT"), Primitive::fromInt32(0)); + ctor->defineReadonlyProperty(QStringLiteral("OPENED"), Primitive::fromInt32(1)); + ctor->defineReadonlyProperty(QStringLiteral("HEADERS_RECEIVED"), Primitive::fromInt32(2)); + ctor->defineReadonlyProperty(QStringLiteral("LOADING"), Primitive::fromInt32(3)); + ctor->defineReadonlyProperty(QStringLiteral("DONE"), Primitive::fromInt32(4)); + if (!ctor->d()->proto) + ctor->setupProto(); + ScopedString s(scope, engine->id_prototype); + ctor->defineDefaultProperty(s.getPointer(), ScopedObject(scope, ctor->d()->proto)); + } + Object *proto; + }; + V4_OBJECT(FunctionObject) static void markObjects(Managed *that, ExecutionEngine *e) { QQmlXMLHttpRequestCtor *c = that->as<QQmlXMLHttpRequestCtor>(); - if (c->proto) - c->proto->mark(e); + if (c->d()->proto) + c->d()->proto->mark(e); FunctionObject::markObjects(that, e); } static ReturnedValue construct(Managed *that, QV4::CallData *) @@ -1668,8 +1660,8 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject QV8Engine *engine = that->engine()->v8Engine; QQmlXMLHttpRequest *r = new QQmlXMLHttpRequest(engine, engine->networkAccessManager()); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, new (that->engine()->memoryManager) QQmlXMLHttpRequestWrapper(that->engine(), r)); - w->setPrototype(ctor->proto); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, that->engine()->memoryManager->alloc<QQmlXMLHttpRequestWrapper>(that->engine(), r)); + w->setPrototype(ctor->d()->proto); return w.asReturnedValue(); } @@ -1691,9 +1683,6 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject static ReturnedValue method_get_statusText(CallContext *ctx); static ReturnedValue method_get_responseText(CallContext *ctx); static ReturnedValue method_get_responseXML(CallContext *ctx); - - - Object *proto; }; DEFINE_OBJECT_VTABLE(QQmlXMLHttpRequestCtor); @@ -1703,29 +1692,29 @@ void QQmlXMLHttpRequestCtor::setupProto() ExecutionEngine *v4 = engine(); Scope scope(v4); Scoped<Object> p(scope, v4->newObject()); - proto = p.getPointer(); + d()->proto = p.getPointer(); // Methods - proto->defineDefaultProperty(QStringLiteral("open"), method_open); - proto->defineDefaultProperty(QStringLiteral("setRequestHeader"), method_setRequestHeader); - proto->defineDefaultProperty(QStringLiteral("send"), method_send); - proto->defineDefaultProperty(QStringLiteral("abort"), method_abort); - proto->defineDefaultProperty(QStringLiteral("getResponseHeader"), method_getResponseHeader); - proto->defineDefaultProperty(QStringLiteral("getAllResponseHeaders"), method_getAllResponseHeaders); + d()->proto->defineDefaultProperty(QStringLiteral("open"), method_open); + d()->proto->defineDefaultProperty(QStringLiteral("setRequestHeader"), method_setRequestHeader); + d()->proto->defineDefaultProperty(QStringLiteral("send"), method_send); + d()->proto->defineDefaultProperty(QStringLiteral("abort"), method_abort); + d()->proto->defineDefaultProperty(QStringLiteral("getResponseHeader"), method_getResponseHeader); + d()->proto->defineDefaultProperty(QStringLiteral("getAllResponseHeaders"), method_getAllResponseHeaders); // Read-only properties - proto->defineAccessorProperty(QStringLiteral("readyState"), method_get_readyState, 0); - proto->defineAccessorProperty(QStringLiteral("status"),method_get_status, 0); - proto->defineAccessorProperty(QStringLiteral("statusText"),method_get_statusText, 0); - proto->defineAccessorProperty(QStringLiteral("responseText"),method_get_responseText, 0); - proto->defineAccessorProperty(QStringLiteral("responseXML"),method_get_responseXML, 0); + d()->proto->defineAccessorProperty(QStringLiteral("readyState"), method_get_readyState, 0); + d()->proto->defineAccessorProperty(QStringLiteral("status"),method_get_status, 0); + d()->proto->defineAccessorProperty(QStringLiteral("statusText"),method_get_statusText, 0); + d()->proto->defineAccessorProperty(QStringLiteral("responseText"),method_get_responseText, 0); + d()->proto->defineAccessorProperty(QStringLiteral("responseXML"),method_get_responseXML, 0); // State values - proto->defineReadonlyProperty(QStringLiteral("UNSENT"), Primitive::fromInt32(0)); - proto->defineReadonlyProperty(QStringLiteral("OPENED"), Primitive::fromInt32(1)); - proto->defineReadonlyProperty(QStringLiteral("HEADERS_RECEIVED"), Primitive::fromInt32(2)); - proto->defineReadonlyProperty(QStringLiteral("LOADING"), Primitive::fromInt32(3)); - proto->defineReadonlyProperty(QStringLiteral("DONE"), Primitive::fromInt32(4)); + d()->proto->defineReadonlyProperty(QStringLiteral("UNSENT"), Primitive::fromInt32(0)); + d()->proto->defineReadonlyProperty(QStringLiteral("OPENED"), Primitive::fromInt32(1)); + d()->proto->defineReadonlyProperty(QStringLiteral("HEADERS_RECEIVED"), Primitive::fromInt32(2)); + d()->proto->defineReadonlyProperty(QStringLiteral("LOADING"), Primitive::fromInt32(3)); + d()->proto->defineReadonlyProperty(QStringLiteral("DONE"), Primitive::fromInt32(4)); } @@ -1733,18 +1722,18 @@ void QQmlXMLHttpRequestCtor::setupProto() ReturnedValue QQmlXMLHttpRequestCtor::method_open(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - if (ctx->callData->argc < 2 || ctx->callData->argc > 5) + if (ctx->d()->callData->argc < 2 || ctx->d()->callData->argc > 5) V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; // Argument 0 - Method - QString method = ctx->callData->args[0].toQStringNoThrow().toUpper(); + QString method = ctx->d()->callData->args[0].toQStringNoThrow().toUpper(); if (method != QLatin1String("GET") && method != QLatin1String("PUT") && method != QLatin1String("HEAD") && @@ -1753,21 +1742,21 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_open(CallContext *ctx) V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Unsupported HTTP method type"); // Argument 1 - URL - QUrl url = QUrl(ctx->callData->args[1].toQStringNoThrow()); + QUrl url = QUrl(ctx->d()->callData->args[1].toQStringNoThrow()); if (url.isRelative()) url = engine->callingContext()->resolvedUrl(url); // Argument 2 - async (optional) - if (ctx->callData->argc > 2 && !ctx->callData->args[2].booleanValue()) + if (ctx->d()->callData->argc > 2 && !ctx->d()->callData->args[2].booleanValue()) V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "Synchronous XMLHttpRequest calls are not supported"); // Argument 3/4 - user/pass (optional) QString username, password; - if (ctx->callData->argc > 3) - username = ctx->callData->args[3].toQStringNoThrow(); - if (ctx->callData->argc > 4) - password = ctx->callData->args[4].toQStringNoThrow(); + if (ctx->d()->callData->argc > 3) + username = ctx->d()->callData->args[3].toQStringNoThrow(); + if (ctx->d()->callData->argc > 4) + password = ctx->d()->callData->args[4].toQStringNoThrow(); // Clear the fragment (if any) url.setFragment(QString()); @@ -1776,26 +1765,26 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_open(CallContext *ctx) if (!username.isNull()) url.setUserName(username); if (!password.isNull()) url.setPassword(password); - ScopedValue meObject(scope, constructMeObject(ctx->callData->thisObject, engine)); + ScopedValue meObject(scope, constructMeObject(ctx->d()->callData->thisObject, engine)); return r->open(meObject, method, url); } ReturnedValue QQmlXMLHttpRequestCtor::method_setRequestHeader(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - if (ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 2) V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Opened || r->sendFlag()) V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); - QString name = ctx->callData->args[0].toQStringNoThrow(); - QString value = ctx->callData->args[1].toQStringNoThrow(); + QString name = ctx->d()->callData->args[0].toQStringNoThrow(); + QString value = ctx->d()->callData->args[1].toQStringNoThrow(); // ### Check that name and value are well formed @@ -1830,48 +1819,48 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_setRequestHeader(CallContext *ctx) ReturnedValue QQmlXMLHttpRequestCtor::method_send(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; if (r->readyState() != QQmlXMLHttpRequest::Opened || r->sendFlag()) V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); QByteArray data; - if (ctx->callData->argc > 0) - data = ctx->callData->args[0].toQStringNoThrow().toUtf8(); + if (ctx->d()->callData->argc > 0) + data = ctx->d()->callData->args[0].toQStringNoThrow().toUtf8(); - ScopedValue meObject(scope, constructMeObject(ctx->callData->thisObject, engine)); + ScopedValue meObject(scope, constructMeObject(ctx->d()->callData->thisObject, engine)); return r->send(meObject, data); } ReturnedValue QQmlXMLHttpRequestCtor::method_abort(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - ScopedValue meObject(scope, constructMeObject(ctx->callData->thisObject, ctx->engine->v8Engine)); + ScopedValue meObject(scope, constructMeObject(ctx->d()->callData->thisObject, ctx->d()->engine->v8Engine)); return r->abort(meObject); } ReturnedValue QQmlXMLHttpRequestCtor::method_getResponseHeader(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Loading && @@ -1879,20 +1868,20 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_getResponseHeader(CallContext *ctx) r->readyState() != QQmlXMLHttpRequest::HeadersReceived) V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); - return engine->toString(r->header(ctx->callData->args[0].toQStringNoThrow())); + return engine->toString(r->header(ctx->d()->callData->args[0].toQStringNoThrow())); } ReturnedValue QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; - if (ctx->callData->argc != 0) + if (ctx->d()->callData->argc != 0) V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "Incorrect argument count"); if (r->readyState() != QQmlXMLHttpRequest::Loading && @@ -1907,10 +1896,10 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(CallContext * ReturnedValue QQmlXMLHttpRequestCtor::method_get_readyState(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; return Encode(r->readyState()); } @@ -1918,10 +1907,10 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_get_readyState(CallContext *ctx) ReturnedValue QQmlXMLHttpRequestCtor::method_get_status(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; if (r->readyState() == QQmlXMLHttpRequest::Unsent || r->readyState() == QQmlXMLHttpRequest::Opened) @@ -1936,12 +1925,12 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_get_status(CallContext *ctx) ReturnedValue QQmlXMLHttpRequestCtor::method_get_statusText(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; if (r->readyState() == QQmlXMLHttpRequest::Unsent || r->readyState() == QQmlXMLHttpRequest::Opened) @@ -1956,12 +1945,12 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_get_statusText(CallContext *ctx) ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseText(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = ctx->d()->engine->v8Engine; if (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done) @@ -1973,17 +1962,17 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseText(CallContext *ctx) ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseXML(CallContext *ctx) { Scope scope(ctx); - Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); + Scoped<QQmlXMLHttpRequestWrapper> w(scope, ctx->d()->callData->thisObject.as<QQmlXMLHttpRequestWrapper>()); if (!w) V4THROW_REFERENCE("Not an XMLHttpRequest object"); - QQmlXMLHttpRequest *r = w->request; + QQmlXMLHttpRequest *r = w->d()->request; if (!r->receivedXml() || (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done)) { return Encode::null(); } else { - return Document::load(ctx->engine->v8Engine, r->rawResponseBody()); + return Document::load(ctx->d()->engine->v8Engine, r->rawResponseBody()); } } @@ -1998,9 +1987,9 @@ void *qt_add_qmlxmlhttprequest(QV8Engine *engine) ExecutionEngine *v4 = QV8Engine::getV4(engine); Scope scope(v4); - Scoped<QQmlXMLHttpRequestCtor> ctor(scope, new (v4->memoryManager) QQmlXMLHttpRequestCtor(v4)); + Scoped<QQmlXMLHttpRequestCtor> ctor(scope, v4->memoryManager->alloc<QQmlXMLHttpRequestCtor>(v4)); ScopedString s(scope, v4->newString(QStringLiteral("XMLHttpRequest"))); - v4->globalObject->defineReadonlyProperty(s, ctor); + v4->globalObject->defineReadonlyProperty(s.getPointer(), ctor); QQmlXMLHttpRequestData *data = new QQmlXMLHttpRequestData; return data; diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index a7db7d214e..e07d97e67c 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -47,6 +47,7 @@ #include <private/qqmlstringconverters_p.h> #include <private/qqmllocale_p.h> #include <private/qv8engine_p.h> +#include <QFileInfo> #include <private/qqmlprofilerservice_p.h> #include <private/qqmlglobal_p.h> @@ -85,15 +86,13 @@ struct StaticQtMetaObject : public QObject { return &staticQtMetaObject; } }; -QV4::QtObject::QtObject(ExecutionEngine *v4, QQmlEngine *qmlEngine) - : Object(v4) - , m_platform(0) - , m_application(0) +QV4::QtObject::Data::Data(ExecutionEngine *v4, QQmlEngine *qmlEngine) + : Object::Data(v4) { setVTable(staticVTable()); Scope scope(v4); - ScopedObject protectThis(scope, this); + ScopedObject o(scope, this); // Set all the enums from the "Qt" namespace const QMetaObject *qtMetaObject = StaticQtMetaObject::get(); @@ -102,54 +101,54 @@ QV4::QtObject::QtObject(ExecutionEngine *v4, QQmlEngine *qmlEngine) for (int ii = 0; ii < qtMetaObject->enumeratorCount(); ++ii) { QMetaEnum enumerator = qtMetaObject->enumerator(ii); for (int jj = 0; jj < enumerator.keyCount(); ++jj) { - put((str = v4->newString(QString::fromUtf8(enumerator.key(jj)))), (v = QV4::Primitive::fromInt32(enumerator.value(jj)))); + o->put((str = v4->newString(QString::fromUtf8(enumerator.key(jj)))).getPointer(), (v = QV4::Primitive::fromInt32(enumerator.value(jj)))); } } - put((str = v4->newString(QStringLiteral("Asynchronous"))), (v = QV4::Primitive::fromInt32(0))); - put((str = v4->newString(QStringLiteral("Synchronous"))), (v = QV4::Primitive::fromInt32(1))); - - defineDefaultProperty(QStringLiteral("include"), QV4Include::method_include); - defineDefaultProperty(QStringLiteral("isQtObject"), method_isQtObject); - defineDefaultProperty(QStringLiteral("rgba"), method_rgba); - defineDefaultProperty(QStringLiteral("hsla"), method_hsla); - defineDefaultProperty(QStringLiteral("colorEqual"), method_colorEqual); - defineDefaultProperty(QStringLiteral("rect"), method_rect); - defineDefaultProperty(QStringLiteral("point"), method_point); - defineDefaultProperty(QStringLiteral("size"), method_size); - defineDefaultProperty(QStringLiteral("font"), method_font); - - defineDefaultProperty(QStringLiteral("vector2d"), method_vector2d); - defineDefaultProperty(QStringLiteral("vector3d"), method_vector3d); - defineDefaultProperty(QStringLiteral("vector4d"), method_vector4d); - defineDefaultProperty(QStringLiteral("quaternion"), method_quaternion); - defineDefaultProperty(QStringLiteral("matrix4x4"), method_matrix4x4); - - defineDefaultProperty(QStringLiteral("formatDate"), method_formatDate); - defineDefaultProperty(QStringLiteral("formatTime"), method_formatTime); - defineDefaultProperty(QStringLiteral("formatDateTime"), method_formatDateTime); - - defineDefaultProperty(QStringLiteral("openUrlExternally"), method_openUrlExternally); - defineDefaultProperty(QStringLiteral("fontFamilies"), method_fontFamilies); - defineDefaultProperty(QStringLiteral("md5"), method_md5); - defineDefaultProperty(QStringLiteral("btoa"), method_btoa); - defineDefaultProperty(QStringLiteral("atob"), method_atob); - defineDefaultProperty(QStringLiteral("resolvedUrl"), method_resolvedUrl); - defineDefaultProperty(QStringLiteral("locale"), method_locale); - defineDefaultProperty(QStringLiteral("binding"), method_binding); + o->put((str = v4->newString(QStringLiteral("Asynchronous"))).getPointer(), (v = QV4::Primitive::fromInt32(0))); + o->put((str = v4->newString(QStringLiteral("Synchronous"))).getPointer(), (v = QV4::Primitive::fromInt32(1))); + + o->defineDefaultProperty(QStringLiteral("include"), QV4Include::method_include); + o->defineDefaultProperty(QStringLiteral("isQtObject"), method_isQtObject); + o->defineDefaultProperty(QStringLiteral("rgba"), method_rgba); + o->defineDefaultProperty(QStringLiteral("hsla"), method_hsla); + o->defineDefaultProperty(QStringLiteral("colorEqual"), method_colorEqual); + o->defineDefaultProperty(QStringLiteral("rect"), method_rect); + o->defineDefaultProperty(QStringLiteral("point"), method_point); + o->defineDefaultProperty(QStringLiteral("size"), method_size); + o->defineDefaultProperty(QStringLiteral("font"), method_font); + + o->defineDefaultProperty(QStringLiteral("vector2d"), method_vector2d); + o->defineDefaultProperty(QStringLiteral("vector3d"), method_vector3d); + o->defineDefaultProperty(QStringLiteral("vector4d"), method_vector4d); + o->defineDefaultProperty(QStringLiteral("quaternion"), method_quaternion); + o->defineDefaultProperty(QStringLiteral("matrix4x4"), method_matrix4x4); + + o->defineDefaultProperty(QStringLiteral("formatDate"), method_formatDate); + o->defineDefaultProperty(QStringLiteral("formatTime"), method_formatTime); + o->defineDefaultProperty(QStringLiteral("formatDateTime"), method_formatDateTime); + + o->defineDefaultProperty(QStringLiteral("openUrlExternally"), method_openUrlExternally); + o->defineDefaultProperty(QStringLiteral("fontFamilies"), method_fontFamilies); + o->defineDefaultProperty(QStringLiteral("md5"), method_md5); + o->defineDefaultProperty(QStringLiteral("btoa"), method_btoa); + o->defineDefaultProperty(QStringLiteral("atob"), method_atob); + o->defineDefaultProperty(QStringLiteral("resolvedUrl"), method_resolvedUrl); + o->defineDefaultProperty(QStringLiteral("locale"), method_locale); + o->defineDefaultProperty(QStringLiteral("binding"), method_binding); if (qmlEngine) { - defineDefaultProperty(QStringLiteral("lighter"), method_lighter); - defineDefaultProperty(QStringLiteral("darker"), method_darker); - defineDefaultProperty(QStringLiteral("tint"), method_tint); - defineDefaultProperty(QStringLiteral("quit"), method_quit); - defineDefaultProperty(QStringLiteral("createQmlObject"), method_createQmlObject); - defineDefaultProperty(QStringLiteral("createComponent"), method_createComponent); + o->defineDefaultProperty(QStringLiteral("lighter"), method_lighter); + o->defineDefaultProperty(QStringLiteral("darker"), method_darker); + o->defineDefaultProperty(QStringLiteral("tint"), method_tint); + o->defineDefaultProperty(QStringLiteral("quit"), method_quit); + o->defineDefaultProperty(QStringLiteral("createQmlObject"), method_createQmlObject); + o->defineDefaultProperty(QStringLiteral("createComponent"), method_createComponent); } - defineAccessorProperty(QStringLiteral("platform"), method_get_platform, 0); - defineAccessorProperty(QStringLiteral("application"), method_get_application, 0); + o->defineAccessorProperty(QStringLiteral("platform"), method_get_platform, 0); + o->defineAccessorProperty(QStringLiteral("application"), method_get_application, 0); #ifndef QT_NO_IM - defineAccessorProperty(QStringLiteral("inputMethod"), method_get_inputMethod, 0); + o->defineAccessorProperty(QStringLiteral("inputMethod"), method_get_inputMethod, 0); #endif } @@ -160,10 +159,10 @@ Returns true if \c object is a valid reference to a Qt or QML object, otherwise */ ReturnedValue QtObject::method_isQtObject(QV4::CallContext *ctx) { - if (ctx->callData->argc == 0) + if (ctx->d()->callData->argc == 0) return QV4::Encode(false); - return QV4::Encode(ctx->callData->args[0].as<QV4::QObjectWrapper>() != 0); + return QV4::Encode(ctx->d()->callData->args[0].as<QV4::QObjectWrapper>() != 0); } /*! @@ -174,14 +173,14 @@ All components should be in the range 0-1 inclusive. */ ReturnedValue QtObject::method_rgba(QV4::CallContext *ctx) { - int argCount = ctx->callData->argc; + int argCount = ctx->d()->callData->argc; if (argCount < 3 || argCount > 4) V4THROW_ERROR("Qt.rgba(): Invalid arguments"); - double r = ctx->callData->args[0].toNumber(); - double g = ctx->callData->args[1].toNumber(); - double b = ctx->callData->args[2].toNumber(); - double a = (argCount == 4) ? ctx->callData->args[3].toNumber() : 1; + double r = ctx->d()->callData->args[0].toNumber(); + double g = ctx->d()->callData->args[1].toNumber(); + double b = ctx->d()->callData->args[2].toNumber(); + double a = (argCount == 4) ? ctx->d()->callData->args[3].toNumber() : 1; if (r < 0.0) r=0.0; if (r > 1.0) r=1.0; @@ -192,7 +191,7 @@ ReturnedValue QtObject::method_rgba(QV4::CallContext *ctx) if (a < 0.0) a=0.0; if (a > 1.0) a=1.0; - return ctx->engine->v8Engine->fromVariant(QQml_colorProvider()->fromRgbF(r, g, b, a)); + return ctx->d()->engine->v8Engine->fromVariant(QQml_colorProvider()->fromRgbF(r, g, b, a)); } /*! @@ -203,14 +202,14 @@ All components should be in the range 0-1 inclusive. */ ReturnedValue QtObject::method_hsla(QV4::CallContext *ctx) { - int argCount = ctx->callData->argc; + int argCount = ctx->d()->callData->argc; if (argCount < 3 || argCount > 4) V4THROW_ERROR("Qt.hsla(): Invalid arguments"); - double h = ctx->callData->args[0].toNumber(); - double s = ctx->callData->args[1].toNumber(); - double l = ctx->callData->args[2].toNumber(); - double a = (argCount == 4) ? ctx->callData->args[3].toNumber() : 1; + double h = ctx->d()->callData->args[0].toNumber(); + double s = ctx->d()->callData->args[1].toNumber(); + double l = ctx->d()->callData->args[2].toNumber(); + double a = (argCount == 4) ? ctx->d()->callData->args[3].toNumber() : 1; if (h < 0.0) h=0.0; if (h > 1.0) h=1.0; @@ -221,7 +220,7 @@ ReturnedValue QtObject::method_hsla(QV4::CallContext *ctx) if (a < 0.0) a=0.0; if (a > 1.0) a=1.0; - return ctx->engine->v8Engine->fromVariant(QQml_colorProvider()->fromHslF(h, s, l, a)); + return ctx->d()->engine->v8Engine->fromVariant(QQml_colorProvider()->fromHslF(h, s, l, a)); } /*! @@ -234,14 +233,14 @@ basic type. */ ReturnedValue QtObject::method_colorEqual(QV4::CallContext *ctx) { - if (ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.colorEqual(): Invalid arguments"); bool ok = false; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QVariant lhs = v8engine->toVariant(ctx->callData->args[0], -1); + QVariant lhs = v8engine->toVariant(ctx->d()->callData->args[0], -1); if (lhs.userType() == QVariant::String) { lhs = QQmlStringConverters::colorFromString(lhs.toString(), &ok); if (!ok) { @@ -251,7 +250,7 @@ ReturnedValue QtObject::method_colorEqual(QV4::CallContext *ctx) V4THROW_ERROR("Qt.colorEqual(): Invalid arguments"); } - QVariant rhs = v8engine->toVariant(ctx->callData->args[1], -1); + QVariant rhs = v8engine->toVariant(ctx->d()->callData->args[1], -1); if (rhs.userType() == QVariant::String) { rhs = QQmlStringConverters::colorFromString(rhs.toString(), &ok); if (!ok) { @@ -274,15 +273,15 @@ The returned object has \c x, \c y, \c width and \c height attributes with the g */ ReturnedValue QtObject::method_rect(QV4::CallContext *ctx) { - if (ctx->callData->argc != 4) + if (ctx->d()->callData->argc != 4) V4THROW_ERROR("Qt.rect(): Invalid arguments"); - double x = ctx->callData->args[0].toNumber(); - double y = ctx->callData->args[1].toNumber(); - double w = ctx->callData->args[2].toNumber(); - double h = ctx->callData->args[3].toNumber(); + double x = ctx->d()->callData->args[0].toNumber(); + double y = ctx->d()->callData->args[1].toNumber(); + double w = ctx->d()->callData->args[2].toNumber(); + double h = ctx->d()->callData->args[3].toNumber(); - return ctx->engine->v8Engine->fromVariant(QVariant::fromValue(QRectF(x, y, w, h))); + return ctx->d()->engine->v8Engine->fromVariant(QVariant::fromValue(QRectF(x, y, w, h))); } /*! @@ -291,13 +290,13 @@ Returns a Point with the specified \c x and \c y coordinates. */ ReturnedValue QtObject::method_point(QV4::CallContext *ctx) { - if (ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.point(): Invalid arguments"); - double x = ctx->callData->args[0].toNumber(); - double y = ctx->callData->args[1].toNumber(); + double x = ctx->d()->callData->args[0].toNumber(); + double y = ctx->d()->callData->args[1].toNumber(); - return ctx->engine->v8Engine->fromVariant(QVariant::fromValue(QPointF(x, y))); + return ctx->d()->engine->v8Engine->fromVariant(QVariant::fromValue(QPointF(x, y))); } /*! @@ -306,13 +305,13 @@ Returns a Size with the specified \c width and \c height. */ ReturnedValue QtObject::method_size(QV4::CallContext *ctx) { - if (ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.size(): Invalid arguments"); - double w = ctx->callData->args[0].toNumber(); - double h = ctx->callData->args[1].toNumber(); + double w = ctx->d()->callData->args[0].toNumber(); + double h = ctx->d()->callData->args[1].toNumber(); - return ctx->engine->v8Engine->fromVariant(QVariant::fromValue(QSizeF(w, h))); + return ctx->d()->engine->v8Engine->fromVariant(QVariant::fromValue(QSizeF(w, h))); } /*! @@ -325,12 +324,12 @@ Invalid keys will be ignored. */ ReturnedValue QtObject::method_font(QV4::CallContext *ctx) { - if (ctx->callData->argc != 1 || !ctx->callData->args[0].isObject()) + if (ctx->d()->callData->argc != 1 || !ctx->d()->callData->args[0].isObject()) V4THROW_ERROR("Qt.font(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; bool ok = false; - QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QFont, QQmlV4Handle(ctx->callData->args[0]), v8engine, &ok); + QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QFont, QQmlV4Handle(ctx->d()->callData->args[0]), v8engine, &ok); if (!ok) V4THROW_ERROR("Qt.font(): Invalid argument: no valid font subproperties specified"); return v8engine->fromVariant(v); @@ -344,15 +343,15 @@ Returns a Vector2D with the specified \c x and \c y. */ ReturnedValue QtObject::method_vector2d(QV4::CallContext *ctx) { - if (ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.vector2d(): Invalid arguments"); float xy[3]; // qvector2d uses float internally - xy[0] = ctx->callData->args[0].toNumber(); - xy[1] = ctx->callData->args[1].toNumber(); + xy[0] = ctx->d()->callData->args[0].toNumber(); + xy[1] = ctx->d()->callData->args[1].toNumber(); const void *params[] = { xy }; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector2D, 1, params)); } @@ -362,16 +361,16 @@ Returns a Vector3D with the specified \c x, \c y and \c z. */ ReturnedValue QtObject::method_vector3d(QV4::CallContext *ctx) { - if (ctx->callData->argc != 3) + if (ctx->d()->callData->argc != 3) V4THROW_ERROR("Qt.vector3d(): Invalid arguments"); float xyz[3]; // qvector3d uses float internally - xyz[0] = ctx->callData->args[0].toNumber(); - xyz[1] = ctx->callData->args[1].toNumber(); - xyz[2] = ctx->callData->args[2].toNumber(); + xyz[0] = ctx->d()->callData->args[0].toNumber(); + xyz[1] = ctx->d()->callData->args[1].toNumber(); + xyz[2] = ctx->d()->callData->args[2].toNumber(); const void *params[] = { xyz }; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector3D, 1, params)); } @@ -381,17 +380,17 @@ Returns a Vector4D with the specified \c x, \c y, \c z and \c w. */ ReturnedValue QtObject::method_vector4d(QV4::CallContext *ctx) { - if (ctx->callData->argc != 4) + if (ctx->d()->callData->argc != 4) V4THROW_ERROR("Qt.vector4d(): Invalid arguments"); float xyzw[4]; // qvector4d uses float internally - xyzw[0] = ctx->callData->args[0].toNumber(); - xyzw[1] = ctx->callData->args[1].toNumber(); - xyzw[2] = ctx->callData->args[2].toNumber(); - xyzw[3] = ctx->callData->args[3].toNumber(); + xyzw[0] = ctx->d()->callData->args[0].toNumber(); + xyzw[1] = ctx->d()->callData->args[1].toNumber(); + xyzw[2] = ctx->d()->callData->args[2].toNumber(); + xyzw[3] = ctx->d()->callData->args[3].toNumber(); const void *params[] = { xyzw }; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector4D, 1, params)); } @@ -401,17 +400,17 @@ Returns a Quaternion with the specified \c scalar, \c x, \c y, and \c z. */ ReturnedValue QtObject::method_quaternion(QV4::CallContext *ctx) { - if (ctx->callData->argc != 4) + if (ctx->d()->callData->argc != 4) V4THROW_ERROR("Qt.quaternion(): Invalid arguments"); qreal sxyz[4]; // qquaternion uses qreal internally - sxyz[0] = ctx->callData->args[0].toNumber(); - sxyz[1] = ctx->callData->args[1].toNumber(); - sxyz[2] = ctx->callData->args[2].toNumber(); - sxyz[3] = ctx->callData->args[3].toNumber(); + sxyz[0] = ctx->d()->callData->args[0].toNumber(); + sxyz[1] = ctx->d()->callData->args[1].toNumber(); + sxyz[2] = ctx->d()->callData->args[2].toNumber(); + sxyz[3] = ctx->d()->callData->args[3].toNumber(); const void *params[] = { sxyz }; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QQuaternion, 1, params)); } @@ -424,36 +423,36 @@ matrix values. */ ReturnedValue QtObject::method_matrix4x4(QV4::CallContext *ctx) { - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; - if (ctx->callData->argc == 1 && ctx->callData->args[0].isObject()) { + if (ctx->d()->callData->argc == 1 && ctx->d()->callData->args[0].isObject()) { bool ok = false; - QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QMatrix4x4, QQmlV4Handle(ctx->callData->args[0]), v8engine, &ok); + QVariant v = QQml_valueTypeProvider()->createVariantFromJsObject(QMetaType::QMatrix4x4, QQmlV4Handle(ctx->d()->callData->args[0]), v8engine, &ok); if (!ok) V4THROW_ERROR("Qt.matrix4x4(): Invalid argument: not a valid matrix4x4 values array"); return v8engine->fromVariant(v); } - if (ctx->callData->argc != 16) + if (ctx->d()->callData->argc != 16) V4THROW_ERROR("Qt.matrix4x4(): Invalid arguments"); qreal vals[16]; // qmatrix4x4 uses qreal internally - vals[0] = ctx->callData->args[0].toNumber(); - vals[1] = ctx->callData->args[1].toNumber(); - vals[2] = ctx->callData->args[2].toNumber(); - vals[3] = ctx->callData->args[3].toNumber(); - vals[4] = ctx->callData->args[4].toNumber(); - vals[5] = ctx->callData->args[5].toNumber(); - vals[6] = ctx->callData->args[6].toNumber(); - vals[7] = ctx->callData->args[7].toNumber(); - vals[8] = ctx->callData->args[8].toNumber(); - vals[9] = ctx->callData->args[9].toNumber(); - vals[10] = ctx->callData->args[10].toNumber(); - vals[11] = ctx->callData->args[11].toNumber(); - vals[12] = ctx->callData->args[12].toNumber(); - vals[13] = ctx->callData->args[13].toNumber(); - vals[14] = ctx->callData->args[14].toNumber(); - vals[15] = ctx->callData->args[15].toNumber(); + vals[0] = ctx->d()->callData->args[0].toNumber(); + vals[1] = ctx->d()->callData->args[1].toNumber(); + vals[2] = ctx->d()->callData->args[2].toNumber(); + vals[3] = ctx->d()->callData->args[3].toNumber(); + vals[4] = ctx->d()->callData->args[4].toNumber(); + vals[5] = ctx->d()->callData->args[5].toNumber(); + vals[6] = ctx->d()->callData->args[6].toNumber(); + vals[7] = ctx->d()->callData->args[7].toNumber(); + vals[8] = ctx->d()->callData->args[8].toNumber(); + vals[9] = ctx->d()->callData->args[9].toNumber(); + vals[10] = ctx->d()->callData->args[10].toNumber(); + vals[11] = ctx->d()->callData->args[11].toNumber(); + vals[12] = ctx->d()->callData->args[12].toNumber(); + vals[13] = ctx->d()->callData->args[13].toNumber(); + vals[14] = ctx->d()->callData->args[14].toNumber(); + vals[15] = ctx->d()->callData->args[15].toNumber(); const void *params[] = { vals }; return v8engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 1, params)); @@ -475,11 +474,11 @@ If \c factor is not supplied, returns a color 50% lighter than \c baseColor (fac */ ReturnedValue QtObject::method_lighter(QV4::CallContext *ctx) { - if (ctx->callData->argc != 1 && ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 1 && ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.lighter(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; - QVariant v = v8engine->toVariant(ctx->callData->args[0], -1); + QV8Engine *v8engine = ctx->d()->engine->v8Engine; + QVariant v = v8engine->toVariant(ctx->d()->callData->args[0], -1); if (v.userType() == QVariant::String) { bool ok = false; v = QQmlStringConverters::colorFromString(v.toString(), &ok); @@ -491,8 +490,8 @@ ReturnedValue QtObject::method_lighter(QV4::CallContext *ctx) } qreal factor = 1.5; - if (ctx->callData->argc == 2) - factor = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc == 2) + factor = ctx->d()->callData->args[1].toNumber(); return v8engine->fromVariant(QQml_colorProvider()->lighter(v, factor)); } @@ -514,11 +513,11 @@ If \c factor is not supplied, returns a color 50% darker than \c baseColor (fact */ ReturnedValue QtObject::method_darker(QV4::CallContext *ctx) { - if (ctx->callData->argc != 1 && ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 1 && ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.darker(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; - QVariant v = v8engine->toVariant(ctx->callData->args[0], -1); + QV8Engine *v8engine = ctx->d()->engine->v8Engine; + QVariant v = v8engine->toVariant(ctx->d()->callData->args[0], -1); if (v.userType() == QVariant::String) { bool ok = false; v = QQmlStringConverters::colorFromString(v.toString(), &ok); @@ -530,8 +529,8 @@ ReturnedValue QtObject::method_darker(QV4::CallContext *ctx) } qreal factor = 2.0; - if (ctx->callData->argc == 2) - factor = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc == 2) + factor = ctx->d()->callData->args[1].toNumber(); return v8engine->fromVariant(QQml_colorProvider()->darker(v, factor)); } @@ -562,13 +561,13 @@ ReturnedValue QtObject::method_darker(QV4::CallContext *ctx) */ ReturnedValue QtObject::method_tint(QV4::CallContext *ctx) { - if (ctx->callData->argc != 2) + if (ctx->d()->callData->argc != 2) V4THROW_ERROR("Qt.tint(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; // base color - QVariant v1 = v8engine->toVariant(ctx->callData->args[0], -1); + QVariant v1 = v8engine->toVariant(ctx->d()->callData->args[0], -1); if (v1.userType() == QVariant::String) { bool ok = false; v1 = QQmlStringConverters::colorFromString(v1.toString(), &ok); @@ -580,7 +579,7 @@ ReturnedValue QtObject::method_tint(QV4::CallContext *ctx) } // tint color - QVariant v2 = v8engine->toVariant(ctx->callData->args[1], -1); + QVariant v2 = v8engine->toVariant(ctx->d()->callData->args[1], -1); if (v2.userType() == QVariant::String) { bool ok = false; v2 = QQmlStringConverters::colorFromString(v2.toString(), &ok); @@ -612,22 +611,22 @@ If \a format is not specified, \a date is formatted using */ ReturnedValue QtObject::method_formatDate(QV4::CallContext *ctx) { - if (ctx->callData->argc < 1 || ctx->callData->argc > 2) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 2) V4THROW_ERROR("Qt.formatDate(): Invalid arguments"); QV4::Scope scope(ctx); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; - QDate date = v8engine->toVariant(ctx->callData->args[0], -1).toDateTime().date(); + QDate date = v8engine->toVariant(ctx->d()->callData->args[0], -1).toDateTime().date(); QString formattedDate; - if (ctx->callData->argc == 2) { - QV4::ScopedString s(scope, ctx->callData->args[1]); + if (ctx->d()->callData->argc == 2) { + QV4::ScopedString s(scope, ctx->d()->callData->args[1]); if (s) { QString format = s->toQString(); formattedDate = date.toString(format); - } else if (ctx->callData->args[1].isNumber()) { - quint32 intFormat = ctx->callData->args[1].asDouble(); + } else if (ctx->d()->callData->args[1].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[1].asDouble(); Qt::DateFormat format = Qt::DateFormat(intFormat); formattedDate = date.toString(format); } else { @@ -637,7 +636,7 @@ ReturnedValue QtObject::method_formatDate(QV4::CallContext *ctx) formattedDate = date.toString(enumFormat); } - return ctx->engine->newString(formattedDate)->asReturnedValue(); + return ctx->d()->engine->newString(formattedDate)->asReturnedValue(); } /*! @@ -657,28 +656,28 @@ If \a format is not specified, \a time is formatted using */ ReturnedValue QtObject::method_formatTime(QV4::CallContext *ctx) { - if (ctx->callData->argc < 1 || ctx->callData->argc > 2) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 2) V4THROW_ERROR("Qt.formatTime(): Invalid arguments"); QV4::Scope scope(ctx); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QVariant argVariant = v8engine->toVariant(ctx->callData->args[0], -1); + QVariant argVariant = v8engine->toVariant(ctx->d()->callData->args[0], -1); QTime time; - if (ctx->callData->args[0].asDateObject() || (argVariant.type() == QVariant::String)) + if (ctx->d()->callData->args[0].asDateObject() || (argVariant.type() == QVariant::String)) time = argVariant.toDateTime().time(); else // if (argVariant.type() == QVariant::Time), or invalid. time = argVariant.toTime(); Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; QString formattedTime; - if (ctx->callData->argc == 2) { - QV4::ScopedString s(scope, ctx->callData->args[1]); + if (ctx->d()->callData->argc == 2) { + QV4::ScopedString s(scope, ctx->d()->callData->args[1]); if (s) { QString format = s->toQString(); formattedTime = time.toString(format); - } else if (ctx->callData->args[1].isNumber()) { - quint32 intFormat = ctx->callData->args[1].asDouble(); + } else if (ctx->d()->callData->args[1].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[1].asDouble(); Qt::DateFormat format = Qt::DateFormat(intFormat); formattedTime = time.toString(format); } else { @@ -688,7 +687,7 @@ ReturnedValue QtObject::method_formatTime(QV4::CallContext *ctx) formattedTime = time.toString(enumFormat); } - return ctx->engine->newString(formattedTime)->asReturnedValue(); + return ctx->d()->engine->newString(formattedTime)->asReturnedValue(); } /*! @@ -783,22 +782,22 @@ with the \a format values below to produce the following results: */ ReturnedValue QtObject::method_formatDateTime(QV4::CallContext *ctx) { - if (ctx->callData->argc < 1 || ctx->callData->argc > 2) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 2) V4THROW_ERROR("Qt.formatDateTime(): Invalid arguments"); QV4::Scope scope(ctx); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; Qt::DateFormat enumFormat = Qt::DefaultLocaleShortDate; - QDateTime dt = v8engine->toVariant(ctx->callData->args[0], -1).toDateTime(); + QDateTime dt = v8engine->toVariant(ctx->d()->callData->args[0], -1).toDateTime(); QString formattedDt; - if (ctx->callData->argc == 2) { - QV4::ScopedString s(scope, ctx->callData->args[1]); + if (ctx->d()->callData->argc == 2) { + QV4::ScopedString s(scope, ctx->d()->callData->args[1]); if (s) { QString format = s->toQString(); formattedDt = dt.toString(format); - } else if (ctx->callData->args[1].isNumber()) { - quint32 intFormat = ctx->callData->args[1].asDouble(); + } else if (ctx->d()->callData->args[1].isNumber()) { + quint32 intFormat = ctx->d()->callData->args[1].asDouble(); Qt::DateFormat format = Qt::DateFormat(intFormat); formattedDt = dt.toString(format); } else { @@ -808,7 +807,7 @@ ReturnedValue QtObject::method_formatDateTime(QV4::CallContext *ctx) formattedDt = dt.toString(enumFormat); } - return ctx->engine->newString(formattedDt)->asReturnedValue(); + return ctx->d()->engine->newString(formattedDt)->asReturnedValue(); } /*! @@ -817,10 +816,10 @@ Attempts to open the specified \c target url in an external application, based o */ ReturnedValue QtObject::method_openUrlExternally(QV4::CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) return QV4::Encode(false); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; QUrl url(Value::fromReturnedValue(method_resolvedUrl(ctx)).toQStringNoThrow()); return v8engine->fromVariant(QQml_guiProvider()->openUrlExternally(url)); @@ -832,21 +831,21 @@ ReturnedValue QtObject::method_openUrlExternally(QV4::CallContext *ctx) */ ReturnedValue QtObject::method_resolvedUrl(QV4::CallContext *ctx) { - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QUrl url = v8engine->toVariant(ctx->callData->args[0], -1).toUrl(); + QUrl url = v8engine->toVariant(ctx->d()->callData->args[0], -1).toUrl(); QQmlEngine *e = v8engine->engine(); QQmlEnginePrivate *p = 0; if (e) p = QQmlEnginePrivate::get(e); if (p) { QQmlContextData *ctxt = v8engine->callingContext(); if (ctxt) - return ctx->engine->newString(ctxt->resolvedUrl(url).toString())->asReturnedValue(); + return ctx->d()->engine->newString(ctxt->resolvedUrl(url).toString())->asReturnedValue(); else - return ctx->engine->newString(url.toString())->asReturnedValue(); + return ctx->d()->engine->newString(url.toString())->asReturnedValue(); } - return ctx->engine->newString(e->baseUrl().resolved(url).toString())->asReturnedValue(); + return ctx->d()->engine->newString(e->baseUrl().resolved(url).toString())->asReturnedValue(); } /*! @@ -855,10 +854,10 @@ Returns a list of the font families available to the application. */ ReturnedValue QtObject::method_fontFamilies(CallContext *ctx) { - if (ctx->callData->argc != 0) + if (ctx->d()->callData->argc != 0) V4THROW_ERROR("Qt.fontFamilies(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; return v8engine->fromVariant(QVariant(QQml_guiProvider()->fontFamilies())); } @@ -868,12 +867,12 @@ Returns a hex string of the md5 hash of \c data. */ ReturnedValue QtObject::method_md5(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("Qt.md5(): Invalid arguments"); - QByteArray data = ctx->callData->args[0].toQStringNoThrow().toUtf8(); + QByteArray data = ctx->d()->callData->args[0].toQStringNoThrow().toUtf8(); QByteArray result = QCryptographicHash::hash(data, QCryptographicHash::Md5); - return ctx->engine->newString(QLatin1String(result.toHex()))->asReturnedValue(); + return ctx->d()->engine->newString(QLatin1String(result.toHex()))->asReturnedValue(); } /*! @@ -882,12 +881,12 @@ Binary to ASCII - this function returns a base64 encoding of \c data. */ ReturnedValue QtObject::method_btoa(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("Qt.btoa(): Invalid arguments"); - QByteArray data = ctx->callData->args[0].toQStringNoThrow().toUtf8(); + QByteArray data = ctx->d()->callData->args[0].toQStringNoThrow().toUtf8(); - return ctx->engine->newString(QLatin1String(data.toBase64()))->asReturnedValue(); + return ctx->d()->engine->newString(QLatin1String(data.toBase64()))->asReturnedValue(); } /*! @@ -896,12 +895,12 @@ ASCII to binary - this function returns a base64 decoding of \c data. */ ReturnedValue QtObject::method_atob(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("Qt.atob(): Invalid arguments"); - QByteArray data = ctx->callData->args[0].toQStringNoThrow().toLatin1(); + QByteArray data = ctx->d()->callData->args[0].toQStringNoThrow().toLatin1(); - return ctx->engine->newString(QString::fromUtf8(QByteArray::fromBase64(data)))->asReturnedValue(); + return ctx->d()->engine->newString(QString::fromUtf8(QByteArray::fromBase64(data)))->asReturnedValue(); } /*! @@ -913,7 +912,7 @@ QQmlEngine::quit() signal to the QCoreApplication::quit() slot. */ ReturnedValue QtObject::method_quit(CallContext *ctx) { - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; QQmlEnginePrivate::get(v8engine->engine())->sendQuit(); return QV4::Encode::undefined(); @@ -946,7 +945,7 @@ See \l {Dynamic QML Object Creation from JavaScript} for more information on usi ReturnedValue QtObject::method_createQmlObject(CallContext *ctx) { Scope scope(ctx); - if (ctx->callData->argc < 2 || ctx->callData->argc > 3) + if (ctx->d()->callData->argc < 2 || ctx->d()->callData->argc > 3) V4THROW_ERROR("Qt.createQmlObject(): Invalid arguments"); struct Error { @@ -962,21 +961,21 @@ ReturnedValue QtObject::method_createQmlObject(CallContext *ctx) const QQmlError &error = errors.at(ii); errorstr += QLatin1String("\n ") + error.toString(); qmlerror = v4->newObject(); - qmlerror->put((s = v4->newString(QStringLiteral("lineNumber"))), (v = QV4::Primitive::fromInt32(error.line()))); - qmlerror->put((s = v4->newString(QStringLiteral("columnNumber"))), (v = QV4::Primitive::fromInt32(error.column()))); - qmlerror->put((s = v4->newString(QStringLiteral("fileName"))), (v = v4->newString(error.url().toString()))); - qmlerror->put((s = v4->newString(QStringLiteral("message"))), (v = v4->newString(error.description()))); + qmlerror->put((s = v4->newString(QStringLiteral("lineNumber"))).getPointer(), (v = QV4::Primitive::fromInt32(error.line()))); + qmlerror->put((s = v4->newString(QStringLiteral("columnNumber"))).getPointer(), (v = QV4::Primitive::fromInt32(error.column()))); + qmlerror->put((s = v4->newString(QStringLiteral("fileName"))).getPointer(), (v = v4->newString(error.url().toString()))); + qmlerror->put((s = v4->newString(QStringLiteral("message"))).getPointer(), (v = v4->newString(error.description()))); qmlerrors->putIndexed(ii, qmlerror); } v = v4->newString(errorstr); Scoped<Object> errorObject(scope, v4->newErrorObject(v)); - errorObject->put((s = v4->newString(QStringLiteral("qmlErrors"))), qmlerrors); + errorObject->put((s = v4->newString(QStringLiteral("qmlErrors"))).getPointer(), qmlerrors); return errorObject.asReturnedValue(); } }; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; QQmlEngine *engine = v8engine->engine(); QQmlContextData *context = v8engine->callingContext(); @@ -988,13 +987,13 @@ ReturnedValue QtObject::method_createQmlObject(CallContext *ctx) effectiveContext = context->asQQmlContext(); Q_ASSERT(effectiveContext); - QString qml = ctx->callData->args[0].toQStringNoThrow(); + QString qml = ctx->d()->callData->args[0].toQStringNoThrow(); if (qml.isEmpty()) return QV4::Encode::null(); QUrl url; - if (ctx->callData->argc > 2) - url = QUrl(ctx->callData->args[2].toQStringNoThrow()); + if (ctx->d()->callData->argc > 2) + url = QUrl(ctx->d()->callData->args[2].toQStringNoThrow()); else url = QUrl(QLatin1String("inline")); @@ -1002,7 +1001,7 @@ ReturnedValue QtObject::method_createQmlObject(CallContext *ctx) url = context->resolvedUrl(url); QObject *parentArg = 0; - QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, ctx->callData->args[1]); + QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, ctx->d()->callData->args[1]); if (!!qobjectWrapper) parentArg = qobjectWrapper->object(); if (!parentArg) @@ -1012,7 +1011,7 @@ ReturnedValue QtObject::method_createQmlObject(CallContext *ctx) component.setData(qml.toUtf8(), url); if (component.isError()) { - ScopedValue v(scope, Error::create(ctx->engine, component.errors())); + ScopedValue v(scope, Error::create(ctx->d()->engine, component.errors())); return ctx->throwError(v); } @@ -1036,13 +1035,13 @@ ReturnedValue QtObject::method_createQmlObject(CallContext *ctx) component.completeCreate(); if (component.isError()) { - ScopedValue v(scope, Error::create(ctx->engine, component.errors())); + ScopedValue v(scope, Error::create(ctx->d()->engine, component.errors())); return ctx->throwError(v); } Q_ASSERT(obj); - return QV4::QObjectWrapper::wrap(ctx->engine, obj); + return QV4::QObjectWrapper::wrap(ctx->d()->engine, obj); } /*! @@ -1078,12 +1077,12 @@ use \l{QtQml::Qt::createQmlObject()}{Qt.createQmlObject()}. */ ReturnedValue QtObject::method_createComponent(CallContext *ctx) { - if (ctx->callData->argc < 1 || ctx->callData->argc > 3) + if (ctx->d()->callData->argc < 1 || ctx->d()->callData->argc > 3) return ctx->throwError(QStringLiteral("Qt.createComponent(): Invalid arguments")); Scope scope(ctx); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; QQmlEngine *engine = v8engine->engine(); QQmlContextData *context = v8engine->callingContext(); @@ -1092,7 +1091,7 @@ ReturnedValue QtObject::method_createComponent(CallContext *ctx) if (context->isPragmaLibraryContext) effectiveContext = 0; - QString arg = ctx->callData->args[0].toQStringNoThrow(); + QString arg = ctx->d()->callData->args[0].toQStringNoThrow(); if (arg.isEmpty()) return QV4::Encode::null(); @@ -1100,23 +1099,23 @@ ReturnedValue QtObject::method_createComponent(CallContext *ctx) QObject *parentArg = 0; int consumedCount = 1; - if (ctx->callData->argc > 1) { - ScopedValue lastArg(scope, ctx->callData->args[ctx->callData->argc-1]); + if (ctx->d()->callData->argc > 1) { + ScopedValue lastArg(scope, ctx->d()->callData->args[ctx->d()->callData->argc-1]); // The second argument could be the mode enum - if (ctx->callData->args[1].isInteger()) { - int mode = ctx->callData->args[1].integerValue(); + if (ctx->d()->callData->args[1].isInteger()) { + int mode = ctx->d()->callData->args[1].integerValue(); if (mode != int(QQmlComponent::PreferSynchronous) && mode != int(QQmlComponent::Asynchronous)) return ctx->throwError(QStringLiteral("Qt.createComponent(): Invalid arguments")); compileMode = QQmlComponent::CompilationMode(mode); consumedCount += 1; } else { // The second argument could be the parent only if there are exactly two args - if ((ctx->callData->argc != 2) || !(lastArg->isObject() || lastArg->isNull())) + if ((ctx->d()->callData->argc != 2) || !(lastArg->isObject() || lastArg->isNull())) return ctx->throwError(QStringLiteral("Qt.createComponent(): Invalid arguments")); } - if (consumedCount < ctx->callData->argc) { + if (consumedCount < ctx->d()->callData->argc) { if (lastArg->isObject()) { Scoped<QObjectWrapper> qobjectWrapper(scope, lastArg); if (qobjectWrapper) @@ -1137,7 +1136,7 @@ ReturnedValue QtObject::method_createComponent(CallContext *ctx) QQmlData::get(c, true)->explicitIndestructibleSet = false; QQmlData::get(c)->indestructible = false; - return QV4::QObjectWrapper::wrap(ctx->engine, c); + return QV4::QObjectWrapper::wrap(ctx->d()->engine, c); } /*! @@ -1163,20 +1162,20 @@ ReturnedValue QtObject::method_createComponent(CallContext *ctx) ReturnedValue QtObject::method_locale(CallContext *ctx) { QString code; - if (ctx->callData->argc > 1) + if (ctx->d()->callData->argc > 1) V4THROW_ERROR("locale() requires 0 or 1 argument"); - if (ctx->callData->argc == 1 && !ctx->callData->args[0].isString()) + if (ctx->d()->callData->argc == 1 && !ctx->d()->callData->args[0].isString()) V4THROW_TYPE("locale(): argument (locale code) must be a string"); - QV8Engine *v8engine = ctx->engine->v8Engine; - if (ctx->callData->argc == 1) - code = ctx->callData->args[0].toQStringNoThrow(); + QV8Engine *v8engine = ctx->d()->engine->v8Engine; + if (ctx->d()->callData->argc == 1) + code = ctx->d()->callData->args[0].toQStringNoThrow(); return QQmlLocale::locale(v8engine, code); } -QQmlBindingFunction::QQmlBindingFunction(FunctionObject *originalFunction) - : QV4::FunctionObject(originalFunction->scope, originalFunction->name()) +QQmlBindingFunction::Data::Data(FunctionObject *originalFunction) + : QV4::FunctionObject::Data(originalFunction->scope(), originalFunction->name()) , originalFunction(originalFunction) { setVTable(staticVTable()); @@ -1186,20 +1185,20 @@ QQmlBindingFunction::QQmlBindingFunction(FunctionObject *originalFunction) void QQmlBindingFunction::initBindingLocation() { QV4::StackFrame frame = engine()->currentStackFrame(); - bindingLocation.sourceFile = frame.source; - bindingLocation.line = frame.line; + d()->bindingLocation.sourceFile = frame.source; + d()->bindingLocation.line = frame.line; } ReturnedValue QQmlBindingFunction::call(Managed *that, CallData *callData) { QQmlBindingFunction *This = static_cast<QQmlBindingFunction*>(that); - return This->originalFunction->call(callData); + return This->d()->originalFunction->call(callData); } void QQmlBindingFunction::markObjects(Managed *that, ExecutionEngine *e) { QQmlBindingFunction *This = static_cast<QQmlBindingFunction*>(that); - This->originalFunction->mark(e); + This->d()->originalFunction->mark(e); QV4::FunctionObject::markObjects(that, e); } @@ -1251,48 +1250,48 @@ DEFINE_OBJECT_VTABLE(QQmlBindingFunction); */ ReturnedValue QtObject::method_binding(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("binding() requires 1 argument"); - QV4::FunctionObject *f = ctx->callData->args[0].asFunctionObject(); + QV4::FunctionObject *f = ctx->d()->callData->args[0].asFunctionObject(); if (!f) V4THROW_TYPE("binding(): argument (binding expression) must be a function"); - return (new (ctx->engine->memoryManager) QQmlBindingFunction(f))->asReturnedValue(); + return (ctx->d()->engine->memoryManager->alloc<QQmlBindingFunction>(f))->asReturnedValue(); } ReturnedValue QtObject::method_get_platform(CallContext *ctx) { // ### inefficient. Should be just a value based getter - Object *o = ctx->callData->thisObject.asObject(); + Object *o = ctx->d()->callData->thisObject.asObject(); if (!o) return ctx->throwTypeError(); QtObject *qt = o->as<QtObject>(); if (!qt) return ctx->throwTypeError(); - if (!qt->m_platform) + if (!qt->d()->platform) // Only allocate a platform object once - qt->m_platform = new QQmlPlatform(ctx->engine->v8Engine->publicEngine()); + qt->d()->platform = new QQmlPlatform(ctx->d()->engine->v8Engine->publicEngine()); - return QV4::QObjectWrapper::wrap(ctx->engine, qt->m_platform); + return QV4::QObjectWrapper::wrap(ctx->d()->engine, qt->d()->platform); } ReturnedValue QtObject::method_get_application(CallContext *ctx) { // ### inefficient. Should be just a value based getter - Object *o = ctx->callData->thisObject.asObject(); + Object *o = ctx->d()->callData->thisObject.asObject(); if (!o) return ctx->throwTypeError(); QtObject *qt = o->as<QtObject>(); if (!qt) return ctx->throwTypeError(); - if (!qt->m_application) + if (!qt->d()->application) // Only allocate an application object once - qt->m_application = QQml_guiProvider()->application(ctx->engine->v8Engine->publicEngine()); + qt->d()->application = QQml_guiProvider()->application(ctx->d()->engine->v8Engine->publicEngine()); - return QV4::QObjectWrapper::wrap(ctx->engine, qt->m_application); + return QV4::QObjectWrapper::wrap(ctx->d()->engine, qt->d()->application); } #ifndef QT_NO_IM @@ -1300,31 +1299,31 @@ ReturnedValue QtObject::method_get_inputMethod(CallContext *ctx) { QObject *o = QQml_guiProvider()->inputMethod(); QQmlEngine::setObjectOwnership(o, QQmlEngine::CppOwnership); - return QV4::QObjectWrapper::wrap(ctx->engine, o); + return QV4::QObjectWrapper::wrap(ctx->d()->engine, o); } #endif -QV4::ConsoleObject::ConsoleObject(ExecutionEngine *v4) - : Object(v4) +QV4::ConsoleObject::Data::Data(ExecutionEngine *v4) + : Object::Data(v4) { QV4::Scope scope(v4); - QV4::ScopedObject protectThis(scope, this); - - defineDefaultProperty(QStringLiteral("debug"), method_log); - defineDefaultProperty(QStringLiteral("log"), method_log); - defineDefaultProperty(QStringLiteral("info"), method_log); - defineDefaultProperty(QStringLiteral("warn"), method_warn); - defineDefaultProperty(QStringLiteral("error"), method_error); - defineDefaultProperty(QStringLiteral("assert"), method_assert); - - defineDefaultProperty(QStringLiteral("count"), method_count); - defineDefaultProperty(QStringLiteral("profile"), method_profile); - defineDefaultProperty(QStringLiteral("profileEnd"), method_profileEnd); - defineDefaultProperty(QStringLiteral("time"), method_time); - defineDefaultProperty(QStringLiteral("timeEnd"), method_timeEnd); - defineDefaultProperty(QStringLiteral("trace"), method_trace); - defineDefaultProperty(QStringLiteral("exception"), method_exception); + QV4::ScopedObject o(scope, this); + + o->defineDefaultProperty(QStringLiteral("debug"), method_log); + o->defineDefaultProperty(QStringLiteral("log"), method_log); + o->defineDefaultProperty(QStringLiteral("info"), method_log); + o->defineDefaultProperty(QStringLiteral("warn"), method_warn); + o->defineDefaultProperty(QStringLiteral("error"), method_error); + o->defineDefaultProperty(QStringLiteral("assert"), method_assert); + + o->defineDefaultProperty(QStringLiteral("count"), method_count); + o->defineDefaultProperty(QStringLiteral("profile"), method_profile); + o->defineDefaultProperty(QStringLiteral("profileEnd"), method_profileEnd); + o->defineDefaultProperty(QStringLiteral("time"), method_time); + o->defineDefaultProperty(QStringLiteral("timeEnd"), method_timeEnd); + o->defineDefaultProperty(QStringLiteral("trace"), method_trace); + o->defineDefaultProperty(QStringLiteral("exception"), method_exception); } @@ -1364,16 +1363,16 @@ static QV4::ReturnedValue writeToConsole(ConsoleLogTypes logType, CallContext *c bool printStack = false) { QString result; - QV4::ExecutionEngine *v4 = ctx->engine; + QV4::ExecutionEngine *v4 = ctx->d()->engine; - for (int i = 0; i < ctx->callData->argc; ++i) { + for (int i = 0; i < ctx->d()->callData->argc; ++i) { if (i != 0) result.append(QLatin1Char(' ')); - if (ctx->callData->args[i].asArrayObject()) - result.append(QStringLiteral("[") + ctx->callData->args[i].toQStringNoThrow() + QStringLiteral("]")); + if (ctx->d()->callData->args[i].asArrayObject()) + result.append(QStringLiteral("[") + ctx->d()->callData->args[i].toQStringNoThrow() + QStringLiteral("]")); else - result.append(ctx->callData->args[i].toQStringNoThrow()); + result.append(ctx->d()->callData->args[i].toQStringNoThrow()); } if (printStack) { @@ -1423,7 +1422,7 @@ QV4::ReturnedValue ConsoleObject::method_log(CallContext *ctx) QV4::ReturnedValue ConsoleObject::method_profile(CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; + QV4::ExecutionEngine *v4 = ctx->d()->engine; QV4::StackFrame frame = v4->currentStackFrame(); const QByteArray baSource = frame.source.toUtf8(); @@ -1441,7 +1440,7 @@ QV4::ReturnedValue ConsoleObject::method_profile(CallContext *ctx) QV4::ReturnedValue ConsoleObject::method_profileEnd(CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; + QV4::ExecutionEngine *v4 = ctx->d()->engine; QV4::StackFrame frame = v4->currentStackFrame(); const QByteArray baSource = frame.source.toUtf8(); @@ -1460,24 +1459,24 @@ QV4::ReturnedValue ConsoleObject::method_profileEnd(CallContext *ctx) QV4::ReturnedValue ConsoleObject::method_time(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("console.time(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QString name = ctx->callData->args[0].toQStringNoThrow(); + QString name = ctx->d()->callData->args[0].toQStringNoThrow(); v8engine->startTimer(name); return QV4::Encode::undefined(); } QV4::ReturnedValue ConsoleObject::method_timeEnd(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("console.time(): Invalid arguments"); - QV8Engine *v8engine = ctx->engine->v8Engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; - QString name = ctx->callData->args[0].toQStringNoThrow(); + QString name = ctx->d()->callData->args[0].toQStringNoThrow(); bool wasRunning; qint64 elapsed = v8engine->stopTimer(name, &wasRunning); if (wasRunning) { @@ -1490,11 +1489,11 @@ QV4::ReturnedValue ConsoleObject::method_count(CallContext *ctx) { // first argument: name to print. Ignore any additional arguments QString name; - if (ctx->callData->argc > 0) - name = ctx->callData->args[0].toQStringNoThrow(); + if (ctx->d()->callData->argc > 0) + name = ctx->d()->callData->args[0].toQStringNoThrow(); - QV4::ExecutionEngine *v4 = ctx->engine; - QV8Engine *v8engine = ctx->engine->v8Engine; + QV4::ExecutionEngine *v4 = ctx->d()->engine; + QV8Engine *v8engine = ctx->d()->engine->v8Engine; QV4::StackFrame frame = v4->currentStackFrame(); @@ -1512,10 +1511,10 @@ QV4::ReturnedValue ConsoleObject::method_count(CallContext *ctx) QV4::ReturnedValue ConsoleObject::method_trace(CallContext *ctx) { - if (ctx->callData->argc != 0) + if (ctx->d()->callData->argc != 0) V4THROW_ERROR("console.trace(): Invalid arguments"); - QV4::ExecutionEngine *v4 = ctx->engine; + QV4::ExecutionEngine *v4 = ctx->d()->engine; QString stack = jsStack(v4); @@ -1534,18 +1533,18 @@ QV4::ReturnedValue ConsoleObject::method_warn(CallContext *ctx) QV4::ReturnedValue ConsoleObject::method_assert(CallContext *ctx) { - if (ctx->callData->argc == 0) + if (ctx->d()->callData->argc == 0) V4THROW_ERROR("console.assert(): Missing argument"); - QV4::ExecutionEngine *v4 = ctx->engine; + QV4::ExecutionEngine *v4 = ctx->d()->engine; - if (!ctx->callData->args[0].toBoolean()) { + if (!ctx->d()->callData->args[0].toBoolean()) { QString message; - for (int i = 1; i < ctx->callData->argc; ++i) { + for (int i = 1; i < ctx->d()->callData->argc; ++i) { if (i != 1) message.append(QLatin1Char(' ')); - message.append(ctx->callData->args[i].toQStringNoThrow()); + message.append(ctx->d()->callData->args[i].toQStringNoThrow()); } QString stack = jsStack(v4); @@ -1561,7 +1560,7 @@ QV4::ReturnedValue ConsoleObject::method_assert(CallContext *ctx) QV4::ReturnedValue ConsoleObject::method_exception(CallContext *ctx) { - if (ctx->callData->argc == 0) + if (ctx->d()->callData->argc == 0) V4THROW_ERROR("console.exception(): Missing argument"); writeToConsole(Error, ctx, true); @@ -1588,10 +1587,10 @@ void QV4::GlobalExtensions::init(QQmlEngine *qmlEngine, Object *globalObject) globalObject->defineDefaultProperty(QStringLiteral("print"), ConsoleObject::method_log); globalObject->defineDefaultProperty(QStringLiteral("gc"), method_gc); - ScopedValue console(scope, new (v4->memoryManager) QV4::ConsoleObject(v4)); + ScopedObject console(scope, v4->memoryManager->alloc<QV4::ConsoleObject>(v4)); globalObject->defineDefaultProperty(QStringLiteral("console"), console); - ScopedValue qt(scope, new (v4->memoryManager) QV4::QtObject(v4, qmlEngine)); + ScopedObject qt(scope, v4->memoryManager->alloc<QV4::QtObject>(v4, qmlEngine)); globalObject->defineDefaultProperty(QStringLiteral("Qt"), qt); // string prototype extension @@ -1619,36 +1618,36 @@ void QV4::GlobalExtensions::init(QQmlEngine *qmlEngine, Object *globalObject) */ ReturnedValue GlobalExtensions::method_qsTranslate(CallContext *ctx) { - if (ctx->callData->argc < 2) + if (ctx->d()->callData->argc < 2) V4THROW_ERROR("qsTranslate() requires at least two arguments"); - if (!ctx->callData->args[0].isString()) + if (!ctx->d()->callData->args[0].isString()) V4THROW_ERROR("qsTranslate(): first argument (context) must be a string"); - if (!ctx->callData->args[1].isString()) + if (!ctx->d()->callData->args[1].isString()) V4THROW_ERROR("qsTranslate(): second argument (sourceText) must be a string"); - if ((ctx->callData->argc > 2) && !ctx->callData->args[2].isString()) + if ((ctx->d()->callData->argc > 2) && !ctx->d()->callData->args[2].isString()) V4THROW_ERROR("qsTranslate(): third argument (disambiguation) must be a string"); - QString context = ctx->callData->args[0].toQStringNoThrow(); - QString text = ctx->callData->args[1].toQStringNoThrow(); + QString context = ctx->d()->callData->args[0].toQStringNoThrow(); + QString text = ctx->d()->callData->args[1].toQStringNoThrow(); QString comment; - if (ctx->callData->argc > 2) comment = ctx->callData->args[2].toQStringNoThrow(); + if (ctx->d()->callData->argc > 2) comment = ctx->d()->callData->args[2].toQStringNoThrow(); int i = 3; - if (ctx->callData->argc > i && ctx->callData->args[i].isString()) { + if (ctx->d()->callData->argc > i && ctx->d()->callData->args[i].isString()) { qWarning("qsTranslate(): specifying the encoding as fourth argument is deprecated"); ++i; } int n = -1; - if (ctx->callData->argc > i) - n = ctx->callData->args[i].toInt32(); + if (ctx->d()->callData->argc > i) + n = ctx->d()->callData->args[i].toInt32(); QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(), comment.toUtf8().constData(), n); - return ctx->engine->newString(result)->asReturnedValue(); + return ctx->d()->engine->newString(result)->asReturnedValue(); } /*! @@ -1675,9 +1674,9 @@ ReturnedValue GlobalExtensions::method_qsTranslate(CallContext *ctx) */ ReturnedValue GlobalExtensions::method_qsTranslateNoOp(CallContext *ctx) { - if (ctx->callData->argc < 2) + if (ctx->d()->callData->argc < 2) return QV4::Encode::undefined(); - return ctx->callData->args[1].asReturnedValue(); + return ctx->d()->callData->args[1].asReturnedValue(); } /*! @@ -1699,36 +1698,54 @@ ReturnedValue GlobalExtensions::method_qsTranslateNoOp(CallContext *ctx) */ ReturnedValue GlobalExtensions::method_qsTr(CallContext *ctx) { - if (ctx->callData->argc < 1) + if (ctx->d()->callData->argc < 1) V4THROW_ERROR("qsTr() requires at least one argument"); - if (!ctx->callData->args[0].isString()) + if (!ctx->d()->callData->args[0].isString()) V4THROW_ERROR("qsTr(): first argument (sourceText) must be a string"); - if ((ctx->callData->argc > 1) && !ctx->callData->args[1].isString()) + if ((ctx->d()->callData->argc > 1) && !ctx->d()->callData->args[1].isString()) V4THROW_ERROR("qsTr(): second argument (disambiguation) must be a string"); - if ((ctx->callData->argc > 2) && !ctx->callData->args[2].isNumber()) + if ((ctx->d()->callData->argc > 2) && !ctx->d()->callData->args[2].isNumber()) V4THROW_ERROR("qsTr(): third argument (n) must be a number"); - QV8Engine *v8engine = ctx->engine->v8Engine; - QQmlContextData *ctxt = v8engine->callingContext(); - - QString path = ctxt->url.toString(); - int lastSlash = path.lastIndexOf(QLatin1Char('/')); - int lastDot = path.lastIndexOf(QLatin1Char('.')); - int length = lastDot - (lastSlash + 1); - QString context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString(); + QV8Engine *v8engine = ctx->d()->engine->v8Engine; + QString context; + if (QQmlContextData *ctxt = v8engine->callingContext()) { + QString path = ctxt->url.toString(); + int lastSlash = path.lastIndexOf(QLatin1Char('/')); + int lastDot = path.lastIndexOf(QLatin1Char('.')); + int length = lastDot - (lastSlash + 1); + context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString(); + } else if (QV4::ExecutionContext *parentCtx = ctx->d()->parent) { + // The first non-empty source URL in the call stack determines the translation context. + while (parentCtx && context.isEmpty()) { + if (QV4::CompiledData::CompilationUnit *unit = parentCtx->d()->compilationUnit) { + QString fileName = unit->fileName(); + QUrl url(unit->fileName()); + if (url.isValid() && url.isRelative()) { + context = url.fileName(); + } else { + context = QQmlFile::urlToLocalFileOrQrc(fileName); + if (context.isEmpty() && fileName.startsWith(QLatin1String(":/"))) + context = fileName; + } + context = QFileInfo(context).baseName(); + } + parentCtx = parentCtx->d()->parent; + } + } - QString text = ctx->callData->args[0].toQStringNoThrow(); + QString text = ctx->d()->callData->args[0].toQStringNoThrow(); QString comment; - if (ctx->callData->argc > 1) - comment = ctx->callData->args[1].toQStringNoThrow(); + if (ctx->d()->callData->argc > 1) + comment = ctx->d()->callData->args[1].toQStringNoThrow(); int n = -1; - if (ctx->callData->argc > 2) - n = ctx->callData->args[2].toInt32(); + if (ctx->d()->callData->argc > 2) + n = ctx->d()->callData->args[2].toInt32(); QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(), comment.toUtf8().constData(), n); - return ctx->engine->newString(result)->asReturnedValue(); + return ctx->d()->engine->newString(result)->asReturnedValue(); } /*! @@ -1755,9 +1772,9 @@ ReturnedValue GlobalExtensions::method_qsTr(CallContext *ctx) */ ReturnedValue GlobalExtensions::method_qsTrNoOp(CallContext *ctx) { - if (ctx->callData->argc < 1) + if (ctx->d()->callData->argc < 1) return QV4::Encode::undefined(); - return ctx->callData->args[0].asReturnedValue(); + return ctx->d()->callData->args[0].asReturnedValue(); } /*! @@ -1792,18 +1809,18 @@ ReturnedValue GlobalExtensions::method_qsTrNoOp(CallContext *ctx) */ ReturnedValue GlobalExtensions::method_qsTrId(CallContext *ctx) { - if (ctx->callData->argc < 1) + if (ctx->d()->callData->argc < 1) V4THROW_ERROR("qsTrId() requires at least one argument"); - if (!ctx->callData->args[0].isString()) + if (!ctx->d()->callData->args[0].isString()) V4THROW_TYPE("qsTrId(): first argument (id) must be a string"); - if (ctx->callData->argc > 1 && !ctx->callData->args[1].isNumber()) + if (ctx->d()->callData->argc > 1 && !ctx->d()->callData->args[1].isNumber()) V4THROW_TYPE("qsTrId(): second argument (n) must be a number"); int n = -1; - if (ctx->callData->argc > 1) - n = ctx->callData->args[1].toInt32(); + if (ctx->d()->callData->argc > 1) + n = ctx->d()->callData->args[1].toInt32(); - return ctx->engine->newString(qtTrId(ctx->callData->args[0].toQStringNoThrow().toUtf8().constData(), n))->asReturnedValue(); + return ctx->d()->engine->newString(qtTrId(ctx->d()->callData->args[0].toQStringNoThrow().toUtf8().constData(), n))->asReturnedValue(); } /*! @@ -1824,16 +1841,16 @@ ReturnedValue GlobalExtensions::method_qsTrId(CallContext *ctx) */ ReturnedValue GlobalExtensions::method_qsTrIdNoOp(CallContext *ctx) { - if (ctx->callData->argc < 1) + if (ctx->d()->callData->argc < 1) return QV4::Encode::undefined(); - return ctx->callData->args[0].asReturnedValue(); + return ctx->d()->callData->args[0].asReturnedValue(); } #endif // QT_NO_TRANSLATION QV4::ReturnedValue GlobalExtensions::method_gc(CallContext *ctx) { - ctx->engine->memoryManager->runGC(); + ctx->d()->engine->memoryManager->runGC(); return QV4::Encode::undefined(); } @@ -1842,21 +1859,21 @@ QV4::ReturnedValue GlobalExtensions::method_gc(CallContext *ctx) ReturnedValue GlobalExtensions::method_string_arg(CallContext *ctx) { - if (ctx->callData->argc != 1) + if (ctx->d()->callData->argc != 1) V4THROW_ERROR("String.arg(): Invalid arguments"); - QString value = ctx->callData->thisObject.toQString(); + QString value = ctx->d()->callData->thisObject.toQString(); QV4::Scope scope(ctx); - QV4::ScopedValue arg(scope, ctx->callData->args[0]); + QV4::ScopedValue arg(scope, ctx->d()->callData->args[0]); if (arg->isInteger()) - return ctx->engine->newString(value.arg(arg->integerValue()))->asReturnedValue(); + return ctx->d()->engine->newString(value.arg(arg->integerValue()))->asReturnedValue(); else if (arg->isDouble()) - return ctx->engine->newString(value.arg(arg->doubleValue()))->asReturnedValue(); + return ctx->d()->engine->newString(value.arg(arg->doubleValue()))->asReturnedValue(); else if (arg->isBoolean()) - return ctx->engine->newString(value.arg(arg->booleanValue()))->asReturnedValue(); + return ctx->d()->engine->newString(value.arg(arg->booleanValue()))->asReturnedValue(); - return ctx->engine->newString(value.arg(arg->toQString()))->asReturnedValue(); + return ctx->d()->engine->newString(value.arg(arg->toQString()))->asReturnedValue(); } diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h index adc0c6ce4f..9732a468df 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h +++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h @@ -65,8 +65,13 @@ namespace QV4 { struct QtObject : Object { - V4_OBJECT - QtObject(ExecutionEngine *v4, QQmlEngine *qmlEngine); + struct Data : Object::Data { + Data(ExecutionEngine *v4, QQmlEngine *qmlEngine); + QObject *platform; + QObject *application; + }; + V4_OBJECT(Object) + static ReturnedValue method_isQtObject(CallContext *ctx); static ReturnedValue method_rgba(CallContext *ctx); @@ -104,14 +109,13 @@ struct QtObject : Object #ifndef QT_NO_IM static ReturnedValue method_get_inputMethod(CallContext *ctx); #endif - - QObject *m_platform; - QObject *m_application; }; struct ConsoleObject : Object { - ConsoleObject(ExecutionEngine *v4); + struct Data : Object::Data { + Data(ExecutionEngine *engine); + }; static ReturnedValue method_error(CallContext *ctx); static ReturnedValue method_log(CallContext *ctx); @@ -147,18 +151,23 @@ struct GlobalExtensions { struct QQmlBindingFunction : public QV4::FunctionObject { - V4_OBJECT - QQmlBindingFunction(FunctionObject *originalFunction); + struct Data : FunctionObject::Data { + Data(FunctionObject *originalFunction); + QV4::FunctionObject *originalFunction; + // Set when the binding is created later + QQmlSourceLocation bindingLocation; + }; + V4_OBJECT(QV4::FunctionObject) void initBindingLocation(); // from caller stack trace static ReturnedValue call(Managed *that, CallData *callData); static void markObjects(Managed *that, ExecutionEngine *e); + static void destroy(Managed *that) { + static_cast<QQmlBindingFunction *>(that)->d()->~Data(); + } - QV4::FunctionObject *originalFunction; - // Set when the binding is created later - QQmlSourceLocation bindingLocation; }; } diff --git a/src/qml/qml/v8/qv4domerrors_p.h b/src/qml/qml/v8/qv4domerrors_p.h index faf52ce1ad..30cbd61467 100644 --- a/src/qml/qml/v8/qv4domerrors_p.h +++ b/src/qml/qml/v8/qv4domerrors_p.h @@ -77,9 +77,9 @@ QT_BEGIN_NAMESPACE #define DOMEXCEPTION_TYPE_MISMATCH_ERR 17 #define V4THROW_DOM(error, string) { \ - QV4::ScopedValue v(scope, ctx->engine->newString(QStringLiteral(string))); \ - QV4::Scoped<Object> ex(scope, ctx->engine->newErrorObject(v)); \ - ex->put(QV4::ScopedString(scope, ctx->engine->newIdentifier(QStringLiteral("code"))), QV4::ScopedValue(scope, QV4::Primitive::fromInt32(error))); \ + QV4::ScopedValue v(scope, scope.engine->newString(QStringLiteral(string))); \ + QV4::Scoped<Object> ex(scope, scope.engine->newErrorObject(v)); \ + ex->put(QV4::ScopedString(scope, scope.engine->newIdentifier(QStringLiteral("code"))).getPointer(), QV4::ScopedValue(scope, QV4::Primitive::fromInt32(error))); \ return ctx->throwError(ex); \ } diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 8305649177..68f312353a 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -130,7 +130,7 @@ QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint) QV4::Scope scope(m_v4Engine); if (QV4::VariantObject *v = value->as<QV4::VariantObject>()) - return v->data; + return v->d()->data; if (typeHint == QVariant::Bool) return QVariant(value->toBoolean()); @@ -229,9 +229,9 @@ static QV4::ReturnedValue objectFromVariantMap(QV8Engine *engine, const QVariant for (QVariantMap::ConstIterator iter = map.begin(); iter != map.end(); ++iter) { s = e->newString(iter.key()); uint idx = s->asArrayIndex(); - if (idx > 16 && (!o->arrayData || idx > o->arrayData->length() * 2)) + if (idx > 16 && (!o->arrayData() || idx > o->arrayData()->length() * 2)) o->initSparseArray(); - o->put(s, (v = engine->fromVariant(iter.value()))); + o->put(s.getPointer(), (v = engine->fromVariant(iter.value()))); } return o.asReturnedValue(); } @@ -261,7 +261,7 @@ QV4::ReturnedValue QV8Engine::fromVariant(const QVariant &variant) case QMetaType::Double: return QV4::Encode(*reinterpret_cast<const double*>(ptr)); case QMetaType::QString: - return m_v4Engine->currentContext()->engine->newString(*reinterpret_cast<const QString*>(ptr))->asReturnedValue(); + return m_v4Engine->currentContext()->d()->engine->newString(*reinterpret_cast<const QString*>(ptr))->asReturnedValue(); case QMetaType::Float: return QV4::Encode(*reinterpret_cast<const float*>(ptr)); case QMetaType::Short: @@ -398,7 +398,7 @@ QVariant QV8Engine::toBasicVariant(const QV4::ValueRef value) if (value->isString()) return value->stringValue()->toQString(); if (QQmlLocaleData *ld = value->as<QQmlLocaleData>()) - return ld->locale; + return ld->d()->locale; if (QV4::DateObject *d = value->asDateObject()) return d->toQDateTime(); // NOTE: since we convert QTime to JS Date, round trip will change the variant type (to QDateTime)! @@ -444,9 +444,9 @@ void QV8Engine::initializeGlobal() qt_add_sqlexceptions(m_v4Engine); { - for (uint i = 0; i < m_v4Engine->globalObject->internalClass->size; ++i) { - if (m_v4Engine->globalObject->internalClass->nameMap.at(i)) - m_illegalNames.insert(m_v4Engine->globalObject->internalClass->nameMap.at(i)->toQString()); + for (uint i = 0; i < m_v4Engine->globalObject->internalClass()->size; ++i) { + if (m_v4Engine->globalObject->internalClass()->nameMap.at(i)) + m_illegalNames.insert(m_v4Engine->globalObject->internalClass()->nameMap.at(i)->toQString()); } } @@ -469,7 +469,7 @@ void QV8Engine::initializeGlobal() " }"\ "})" - QV4::Scoped<QV4::FunctionObject> result(scope, QV4::Script::evaluate(m_v4Engine, QString::fromUtf8(FREEZE_SOURCE), QV4::ObjectRef::null())); + QV4::Scoped<QV4::FunctionObject> result(scope, QV4::Script::evaluate(m_v4Engine, QString::fromUtf8(FREEZE_SOURCE), 0)); Q_ASSERT(!!result); m_freezeObject = result; #undef FREEZE_SOURCE @@ -486,11 +486,6 @@ void QV8Engine::freezeObject(const QV4::ValueRef value) f->call(callData); } -void QV8Engine::gc() -{ - m_v4Engine->memoryManager->runGC(); -} - struct QV8EngineRegistrationData { QV8EngineRegistrationData() : extensionCount(0) {} @@ -560,8 +555,7 @@ QV4::ReturnedValue QV8Engine::variantListToJS(const QVariantList &lst) // The result is a QVariantList with length equal to the length // of the JS Array, and elements being the JS Array's elements // converted to QVariants, recursively. -QVariantList QV8Engine::variantListFromJS(QV4::ArrayObjectRef a, - V8ObjectSet &visitedObjects) +QVariantList QV8Engine::variantListFromJS(QV4::ArrayObject *a, V8ObjectSet &visitedObjects) { QVariantList result; if (!a) @@ -605,7 +599,7 @@ QV4::ReturnedValue QV8Engine::variantMapToJS(const QVariantMap &vmap) if (idx < UINT_MAX) o->arraySet(idx, v); else - o->insertMember(s, v); + o->insertMember(s.getPointer(), v); } return o.asReturnedValue(); } @@ -614,8 +608,7 @@ QV4::ReturnedValue QV8Engine::variantMapToJS(const QVariantMap &vmap) // The result is a QVariantMap with keys being the property names // of the object, and values being the values of the JS object's // properties converted to QVariants, recursively. -QVariantMap QV8Engine::variantMapFromJS(QV4::ObjectRef o, - V8ObjectSet &visitedObjects) +QVariantMap QV8Engine::variantMapFromJS(QV4::Object *o, V8ObjectSet &visitedObjects) { QVariantMap result; @@ -679,7 +672,7 @@ QV4::ReturnedValue QV8Engine::metaTypeToJS(int type, const void *data) case QMetaType::Double: return QV4::Encode(*reinterpret_cast<const double*>(data)); case QMetaType::QString: - return m_v4Engine->currentContext()->engine->newString(*reinterpret_cast<const QString*>(data))->asReturnedValue(); + return m_v4Engine->currentContext()->d()->engine->newString(*reinterpret_cast<const QString*>(data))->asReturnedValue(); case QMetaType::Float: return QV4::Encode(*reinterpret_cast<const float*>(data)); case QMetaType::Short: @@ -882,7 +875,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) return true; if (value->as<QV4::VariantObject>() && name.endsWith('*')) { int valueType = QMetaType::type(name.left(name.size()-1)); - QVariant &var = value->as<QV4::VariantObject>()->data; + QVariant &var = value->as<QV4::VariantObject>()->d()->data; if (valueType == var.userType()) { // We have T t, T* is requested, so return &t. *reinterpret_cast<void* *>(data) = var.data(); @@ -893,12 +886,12 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) while (proto) { bool canCast = false; if (QV4::VariantObject *vo = proto->as<QV4::VariantObject>()) { - const QVariant &v = vo->data; + const QVariant &v = vo->d()->data; canCast = (type == v.userType()) || (valueType && (valueType == v.userType())); } else if (proto->as<QV4::QObjectWrapper>()) { QByteArray className = name.left(name.size()-1); - QV4::ScopedObject p(scope, proto); + QV4::ScopedObject p(scope, proto.getPointer()); if (QObject *qobject = qtObjectFromJS(p)) canCast = qobject->qt_metacast(className) != 0; } @@ -969,7 +962,7 @@ QVariant QV8Engine::variantFromJS(const QV4::ValueRef value, if (QV4::RegExpObject *re = value->as<QV4::RegExpObject>()) return re->toQRegExp(); if (QV4::VariantObject *v = value->as<QV4::VariantObject>()) - return v->data; + return v->d()->data; if (value->as<QV4::QObjectWrapper>()) return qVariantFromValue(qtObjectFromJS(value)); if (QV4::QmlValueTypeWrapper *v = value->as<QV4::QmlValueTypeWrapper>()) @@ -1003,7 +996,7 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::ValueRef value) QV4::Scoped<QV4::VariantObject> v(scope, value); if (v) { - QVariant variant = v->data; + QVariant variant = v->d()->data; int type = variant.userType(); if (type == QMetaType::QObjectStar) return *reinterpret_cast<QObject* const *>(variant.constData()); diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index 1295e671f0..a5b94e8bdf 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -219,8 +219,6 @@ public: // Return the list of illegal id names (the names of the properties on the global object) const QSet<QString> &illegalNames() const; - void gc(); - static QMutex *registrationMutex(); static int registerExtension(); @@ -228,11 +226,11 @@ public: void setExtensionData(int, Deletable *); QV4::ReturnedValue variantListToJS(const QVariantList &lst); - inline QVariantList variantListFromJS(QV4::ArrayObjectRef array) + inline QVariantList variantListFromJS(QV4::ArrayObject *array) { V8ObjectSet visitedObjects; return variantListFromJS(array, visitedObjects); } QV4::ReturnedValue variantMapToJS(const QVariantMap &vmap); - inline QVariantMap variantMapFromJS(QV4::ObjectRef object) + inline QVariantMap variantMapFromJS(QV4::Object *object) { V8ObjectSet visitedObjects; return variantMapFromJS(object, visitedObjects); } QV4::ReturnedValue variantToJS(const QVariant &value); @@ -280,8 +278,8 @@ protected: void initializeGlobal(); private: - QVariantList variantListFromJS(QV4::ArrayObjectRef array, V8ObjectSet &visitedObjects); - QVariantMap variantMapFromJS(QV4::ObjectRef object, V8ObjectSet &visitedObjects); + QVariantList variantListFromJS(QV4::ArrayObject *array, V8ObjectSet &visitedObjects); + QVariantMap variantMapFromJS(QV4::Object *object, V8ObjectSet &visitedObjects); QVariant variantFromJS(const QV4::ValueRef value, V8ObjectSet &visitedObjects); Q_DISABLE_COPY(QV8Engine) |