aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-09-18 16:36:02 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-22 01:06:20 +0200
commitdf5edd28bc4258b89d9d5ffdddf837f339a17aad (patch)
tree2a5939d5e3c49928aadf43337832d3ef5a58df08 /src/qml/qml
parent700ba1bcb39e082049c96fafdfaccfe5d83cd77e (diff)
convert Managed::put() API to be GC safe
Change-Id: I09198ce372fa545372db389fac26828d21ad5731 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlcontextwrapper.cpp13
-rw-r--r--src/qml/qml/qqmlcontextwrapper_p.h2
-rw-r--r--src/qml/qml/qqmllistwrapper.cpp2
-rw-r--r--src/qml/qml/qqmllistwrapper_p.h2
-rw-r--r--src/qml/qml/qqmltypewrapper.cpp6
-rw-r--r--src/qml/qml/qqmltypewrapper_p.h2
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp10
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper_p.h2
-rw-r--r--src/qml/qml/qqmlxmlhttprequest.cpp4
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp23
-rw-r--r--src/qml/qml/v8/qv4domerrors_p.h2
-rw-r--r--src/qml/qml/v8/qv8engine.cpp6
12 files changed, 40 insertions, 34 deletions
diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp
index 40b90037d8..e1c75f2f26 100644
--- a/src/qml/qml/qqmlcontextwrapper.cpp
+++ b/src/qml/qml/qqmlcontextwrapper.cpp
@@ -272,7 +272,7 @@ ReturnedValue QmlContextWrapper::get(Managed *m, const StringRef name, bool *has
return Value::undefinedValue().asReturnedValue();
}
-void QmlContextWrapper::put(Managed *m, String *name, const Value &value)
+void QmlContextWrapper::put(Managed *m, const StringRef name, const ValueRef value)
{
ExecutionEngine *v4 = m->engine();
QV4::Scope scope(v4);
@@ -293,10 +293,9 @@ void QmlContextWrapper::put(Managed *m, String *name, const Value &value)
}
PropertyAttributes attrs;
- ScopedString n(scope, name);
- Property *pd = wrapper->__getOwnProperty__(n, &attrs);
+ Property *pd = wrapper->__getOwnProperty__(name, &attrs);
if (pd) {
- wrapper->putValue(pd, attrs, value);
+ wrapper->putValue(pd, attrs, *value);
return;
}
@@ -314,18 +313,18 @@ void QmlContextWrapper::put(Managed *m, String *name, const Value &value)
while (context) {
// Search context properties
- if (context->propertyNames.count() && -1 != context->propertyNames.value(name))
+ if (context->propertyNames.count() && -1 != context->propertyNames.value(name.getPointer()))
return;
// Search scope object
if (scopeObject &&
- QV4::QObjectWrapper::setQmlProperty(v4->current, context, scopeObject, name, QV4::QObjectWrapper::CheckRevision, value))
+ QV4::QObjectWrapper::setQmlProperty(v4->current, context, scopeObject, name.getPointer(), QV4::QObjectWrapper::CheckRevision, *value))
return;
scopeObject = 0;
// Search context object
if (context->contextObject &&
- QV4::QObjectWrapper::setQmlProperty(v4->current, context, context->contextObject, name, QV4::QObjectWrapper::CheckRevision, value))
+ QV4::QObjectWrapper::setQmlProperty(v4->current, context, context->contextObject, name.getPointer(), QV4::QObjectWrapper::CheckRevision, *value))
return;
context = context->parent;
diff --git a/src/qml/qml/qqmlcontextwrapper_p.h b/src/qml/qml/qqmlcontextwrapper_p.h
index f0169cc739..6660e1ab29 100644
--- a/src/qml/qml/qqmlcontextwrapper_p.h
+++ b/src/qml/qml/qqmlcontextwrapper_p.h
@@ -83,7 +83,7 @@ struct Q_QML_EXPORT QmlContextWrapper : Object
void setReadOnly(bool b) { readOnly = b; }
static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty);
- static void put(Managed *m, String *name, const Value &value);
+ static void put(Managed *m, const StringRef name, const ValueRef value);
static void destroy(Managed *that);
diff --git a/src/qml/qml/qqmllistwrapper.cpp b/src/qml/qml/qqmllistwrapper.cpp
index 517c6c46db..395a832c6e 100644
--- a/src/qml/qml/qqmllistwrapper.cpp
+++ b/src/qml/qml/qqmllistwrapper.cpp
@@ -131,7 +131,7 @@ ReturnedValue QmlListWrapper::getIndexed(Managed *m, uint index, bool *hasProper
return Value::undefinedValue().asReturnedValue();
}
-void QmlListWrapper::put(Managed *m, String *name, const Value &value)
+void QmlListWrapper::put(Managed *m, const StringRef name, const ValueRef value)
{
// doesn't do anything. Should we throw?
Q_UNUSED(m);
diff --git a/src/qml/qml/qqmllistwrapper_p.h b/src/qml/qml/qqmllistwrapper_p.h
index 4bc1e95753..ea35ad091d 100644
--- a/src/qml/qml/qqmllistwrapper_p.h
+++ b/src/qml/qml/qqmllistwrapper_p.h
@@ -83,7 +83,7 @@ public:
static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty);
static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty);
- static void put(Managed *m, String *name, const Value &value);
+ static void put(Managed *m, const StringRef name, const ValueRef value);
static Property *advanceIterator(Managed *m, ObjectIterator *it, String **name, uint *index, PropertyAttributes *attributes);
static void destroy(Managed *that);
diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp
index f7e831cb80..2b27f48d6e 100644
--- a/src/qml/qml/qqmltypewrapper.cpp
+++ b/src/qml/qml/qqmltypewrapper.cpp
@@ -224,7 +224,7 @@ ReturnedValue QmlTypeWrapper::get(Managed *m, const StringRef name, bool *hasPro
}
-void QmlTypeWrapper::put(Managed *m, String *name, const Value &value)
+void QmlTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value)
{
QmlTypeWrapper *w = m->as<QmlTypeWrapper>();
QV4::ExecutionEngine *v4 = m->engine();
@@ -239,7 +239,7 @@ void QmlTypeWrapper::put(Managed *m, String *name, const Value &value)
QObject *object = w->object;
QObject *ao = qmlAttachedPropertiesObjectById(type->attachedPropertiesId(), object);
if (ao)
- QV4::QObjectWrapper::setQmlProperty(v4->current, context, ao, name, QV4::QObjectWrapper::IgnoreRevision, value);
+ QV4::QObjectWrapper::setQmlProperty(v4->current, context, ao, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, *value);
} else if (type && type->isSingleton()) {
QQmlEngine *e = v8engine->engine();
QQmlType::SingletonInstanceInfo *siinfo = type->singletonInstanceInfo();
@@ -247,7 +247,7 @@ void QmlTypeWrapper::put(Managed *m, String *name, const Value &value)
QObject *qobjectSingleton = siinfo->qobjectApi(e);
if (qobjectSingleton) {
- QV4::QObjectWrapper::setQmlProperty(v4->current, context, qobjectSingleton, name, QV4::QObjectWrapper::IgnoreRevision, value);
+ QV4::QObjectWrapper::setQmlProperty(v4->current, context, qobjectSingleton, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, *value);
} else if (!siinfo->scriptApi(e).isUndefined()) {
QV4::Object *apiprivate = QJSValuePrivate::get(siinfo->scriptApi(e))->value.asObject();
if (!apiprivate) {
diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h
index 770c50cc64..6c762a2d19 100644
--- a/src/qml/qml/qqmltypewrapper_p.h
+++ b/src/qml/qml/qqmltypewrapper_p.h
@@ -83,7 +83,7 @@ public:
static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty);
- static void put(Managed *m, String *name, const Value &value);
+ static void put(Managed *m, const StringRef name, const ValueRef value);
static PropertyAttributes query(const Managed *, String *name);
static void destroy(Managed *that);
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index ca6fa1f277..e38bc191dd 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -326,7 +326,7 @@ ReturnedValue QmlValueTypeWrapper::get(Managed *m, const StringRef name, bool *h
#undef VALUE_TYPE_ACCESSOR
}
-void QmlValueTypeWrapper::put(Managed *m, String *name, const Value &value)
+void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef value)
{
ExecutionEngine *v4 = m->engine();
Scope scope(v4);
@@ -350,7 +350,7 @@ void QmlValueTypeWrapper::put(Managed *m, String *name, const Value &value)
QQmlBinding *newBinding = 0;
- QV4::FunctionObject *f = value.asFunctionObject();
+ QV4::ScopedFunctionObject f(scope, value);
if (f) {
if (!f->bindingKeyFlag) {
// assigning a JS function to a non-var-property is not allowed.
@@ -372,7 +372,7 @@ void QmlValueTypeWrapper::put(Managed *m, String *name, const Value &value)
QV4::ExecutionEngine::StackFrame frame = v4->currentStackFrame();
- newBinding = new QQmlBinding(value, reference->object, context,
+ newBinding = new QQmlBinding(*value, reference->object, context,
frame.source, qmlSourceCoordinate(frame.line), qmlSourceCoordinate(frame.column));
newBinding->setTarget(reference->object, cacheData, context);
newBinding->setEvaluateFlags(newBinding->evaluateFlags() |
@@ -385,7 +385,7 @@ void QmlValueTypeWrapper::put(Managed *m, String *name, const Value &value)
oldBinding->destroy();
if (!f) {
- QVariant v = r->v8->toVariant(value, -1);
+ QVariant v = r->v8->toVariant(*value, -1);
if (p.isEnumType() && (QMetaType::Type)v.type() == QMetaType::Double)
v = v.toInt();
@@ -409,7 +409,7 @@ void QmlValueTypeWrapper::put(Managed *m, String *name, const Value &value)
if (index == -1)
return;
- QVariant v = r->v8->toVariant(value, -1);
+ QVariant v = r->v8->toVariant(*value, -1);
r->type->setValue(copy->value);
QMetaProperty p = r->type->metaObject()->property(index);
diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h
index 5e1256f8a1..1ff04f6104 100644
--- a/src/qml/qml/qqmlvaluetypewrapper_p.h
+++ b/src/qml/qml/qqmlvaluetypewrapper_p.h
@@ -84,7 +84,7 @@ public:
static ReturnedValue get(Managed *m, const StringRef name, bool *hasProperty);
- static void put(Managed *m, String *name, const Value &value);
+ static void put(Managed *m, const StringRef name, const ValueRef value);
static void destroy(Managed *that);
static bool isEqualTo(Managed *m, Managed *other);
static PropertyAttributes query(const Managed *, String *name);
diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp
index aa2ac897cc..79b9344994 100644
--- a/src/qml/qml/qqmlxmlhttprequest.cpp
+++ b/src/qml/qml/qqmlxmlhttprequest.cpp
@@ -105,9 +105,9 @@ static ReturnedValue constructMeObject(const Value &thisObj, QV8Engine *e)
ExecutionEngine *v4 = QV8Engine::getV4(e);
Scope scope(v4);
Scoped<Object> meObj(scope, v4->newObject());
- meObj->put(v4->newString(QStringLiteral("ThisObject")), thisObj);
+ meObj->put(ScopedString(scope, v4->newString(QStringLiteral("ThisObject"))), ScopedValue(scope, thisObj));
ScopedValue v(scope, QmlContextWrapper::qmlScope(e, e->callingContext(), 0));
- meObj->put(v4->newString(QStringLiteral("ActivationObject")), v);
+ meObj->put(ScopedString(scope, v4->newString(QStringLiteral("ActivationObject"))), v);
return meObj.asReturnedValue();
}
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
index 816680e1d9..c5cba16f48 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
@@ -96,14 +96,16 @@ QV4::QtObject::QtObject(ExecutionEngine *v4, QQmlEngine *qmlEngine)
// Set all the enums from the "Qt" namespace
const QMetaObject *qtMetaObject = StaticQtMetaObject::get();
+ ScopedString str(scope);
+ ScopedValue v(scope);
for (int ii = 0; ii < qtMetaObject->enumeratorCount(); ++ii) {
QMetaEnum enumerator = qtMetaObject->enumerator(ii);
for (int jj = 0; jj < enumerator.keyCount(); ++jj) {
- put(v4->newString(enumerator.key(jj)), QV4::Value::fromInt32(enumerator.value(jj)));
+ put((str = v4->newString(enumerator.key(jj))), (v = QV4::Value::fromInt32(enumerator.value(jj))));
}
}
- put(v4->newString("Asynchronous"), QV4::Value::fromInt32(0));
- put(v4->newString("Synchronous"), QV4::Value::fromInt32(1));
+ put((str = v4->newString("Asynchronous")), (v = QV4::Value::fromInt32(0)));
+ put((str = v4->newString("Synchronous")), (v = QV4::Value::fromInt32(1)));
defineDefaultProperty(QStringLiteral("include"), QV4Include::method_include);
defineDefaultProperty(QStringLiteral("isQtObject"), method_isQtObject);
@@ -946,19 +948,22 @@ ReturnedValue QtObject::method_createQmlObject(SimpleCallContext *ctx)
QString errorstr = QLatin1String("Qt.createQmlObject(): failed to create object: ");
QV4::Scoped<ArrayObject> qmlerrors(scope, v4->newArrayObject());
+ QV4::ScopedObject qmlerror(scope);
+ QV4::ScopedString s(scope);
+ QV4::ScopedValue v(scope);
for (int ii = 0; ii < errors.count(); ++ii) {
const QQmlError &error = errors.at(ii);
errorstr += QLatin1String("\n ") + error.toString();
- QV4::Scoped<QV4::Object> qmlerror(scope, v4->newObject());
- qmlerror->put(v4->newString("lineNumber"), QV4::Value::fromInt32(error.line()));
- qmlerror->put(v4->newString("columnNumber"), QV4::Value::fromInt32(error.column()));
- qmlerror->put(v4->newString("fileName"), Value::fromString(v4->newString(error.url().toString())));
- qmlerror->put(v4->newString("message"), Value::fromString(v4->newString(error.description())));
+ qmlerror = v4->newObject();
+ qmlerror->put((s = v4->newString("lineNumber")), (v = QV4::Value::fromInt32(error.line())));
+ qmlerror->put((s = v4->newString("columnNumber")), (v = QV4::Value::fromInt32(error.column())));
+ qmlerror->put((s = v4->newString("fileName")), (v = Value::fromString(v4->newString(error.url().toString()))));
+ qmlerror->put((s = v4->newString("message")), (v = Value::fromString(v4->newString(error.description()))));
qmlerrors->putIndexed(ii, qmlerror.asValue());
}
Scoped<Object> errorObject(scope, v4->newErrorObject(Value::fromString(v4->newString(errorstr))));
- errorObject->put(v4->newString("qmlErrors"), qmlerrors.asValue());
+ errorObject->put((s = v4->newString("qmlErrors")), qmlerrors);
return errorObject.asReturnedValue();
}
};
diff --git a/src/qml/qml/v8/qv4domerrors_p.h b/src/qml/qml/v8/qv4domerrors_p.h
index ce6fb9edea..3742e37114 100644
--- a/src/qml/qml/v8/qv4domerrors_p.h
+++ b/src/qml/qml/v8/qv4domerrors_p.h
@@ -79,7 +79,7 @@ QT_BEGIN_NAMESPACE
#define V4THROW_DOM(error, string) { \
QV4::ScopedValue v(scope, QV4::Value::fromString(ctx, QStringLiteral(string))); \
QV4::Scoped<Object> ex(scope, ctx->engine->newErrorObject(v)); \
- ex->put(ctx->engine->newIdentifier(QStringLiteral("code")), QV4::Value::fromInt32(error)); \
+ ex->put(QV4::ScopedString(scope, ctx->engine->newIdentifier(QStringLiteral("code"))), QV4::ScopedValue(scope, QV4::Value::fromInt32(error))); \
ctx->throwError(ex); \
}
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index 38c0902a7e..70c3104ffa 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -212,9 +212,11 @@ static QV4::ReturnedValue objectFromVariantMap(QV8Engine *engine, const QVariant
{
QV4::ExecutionEngine *e = QV8Engine::getV4(engine);
QV4::Scope scope(e);
- QV4::Scoped<QV4::Object> o(scope, e->newObject());
+ QV4::ScopedObject o(scope, e->newObject());
+ QV4::ScopedString s(scope);
+ QV4::ScopedValue v(scope);
for (QVariantMap::ConstIterator iter = map.begin(); iter != map.end(); ++iter)
- o->put(e->newString(iter.key()), QV4::Value::fromReturnedValue(engine->fromVariant(iter.value())));
+ o->put((s = e->newString(iter.key())), (v = engine->fromVariant(iter.value())));
return o.asReturnedValue();
}