diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-18 16:36:02 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-22 01:06:20 +0200 |
commit | df5edd28bc4258b89d9d5ffdddf837f339a17aad (patch) | |
tree | 2a5939d5e3c49928aadf43337832d3ef5a58df08 /src/qml/qml | |
parent | 700ba1bcb39e082049c96fafdfaccfe5d83cd77e (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.cpp | 13 | ||||
-rw-r--r-- | src/qml/qml/qqmlcontextwrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmllistwrapper.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmllistwrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 10 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlxmlhttprequest.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 23 | ||||
-rw-r--r-- | src/qml/qml/v8/qv4domerrors_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 6 |
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(); } |