aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/ftw/qhashedstring_p.h2
-rw-r--r--src/qml/qml/qqml.h77
-rw-r--r--src/qml/qml/qqmlbinding.cpp38
-rw-r--r--src/qml/qml/qqmlbinding_p.h2
-rw-r--r--src/qml/qml/qqmlboundsignal.cpp2
-rw-r--r--src/qml/qml/qqmlcompiler_p.h16
-rw-r--r--src/qml/qml/qqmlcomponent.cpp116
-rw-r--r--src/qml/qml/qqmlcontextwrapper.cpp77
-rw-r--r--src/qml/qml/qqmlcontextwrapper_p.h43
-rw-r--r--src/qml/qml/qqmlcustomparser.cpp46
-rw-r--r--src/qml/qml/qqmlcustomparser_p.h10
-rw-r--r--src/qml/qml/qqmlengine.cpp8
-rw-r--r--src/qml/qml/qqmlerror.cpp11
-rw-r--r--src/qml/qml/qqmlexpression.cpp2
-rw-r--r--src/qml/qml/qqmlfileselector.cpp8
-rw-r--r--src/qml/qml/qqmlfileselector_p.h2
-rw-r--r--src/qml/qml/qqmlincubator.cpp4
-rw-r--r--src/qml/qml/qqmlinfo.cpp2
-rw-r--r--src/qml/qml/qqmljavascriptexpression.cpp2
-rw-r--r--src/qml/qml/qqmllistwrapper.cpp56
-rw-r--r--src/qml/qml/qqmllistwrapper_p.h28
-rw-r--r--src/qml/qml/qqmllocale.cpp298
-rw-r--r--src/qml/qml/qqmllocale_p.h24
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp33
-rw-r--r--src/qml/qml/qqmlproperty.cpp9
-rw-r--r--src/qml/qml/qqmltypeloader.cpp23
-rw-r--r--src/qml/qml/qqmltypeloader_p.h1
-rw-r--r--src/qml/qml/qqmltypewrapper.cpp73
-rw-r--r--src/qml/qml/qqmltypewrapper_p.h33
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp214
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper_p.h22
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp2
-rw-r--r--src/qml/qml/qqmlxmlhttprequest.cpp589
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp659
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions_p.h31
-rw-r--r--src/qml/qml/v8/qv4domerrors_p.h6
-rw-r--r--src/qml/qml/v8/qv8engine.cpp43
-rw-r--r--src/qml/qml/v8/qv8engine_p.h10
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)