diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-24 14:28:02 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-26 09:05:25 +0200 |
commit | 9062476491dd1c81f63bb7a3ae6e6a080db1db1e (patch) | |
tree | 362935aece4c4c4fd62f15ef14b61c048bcc514c /src | |
parent | 0f204625dc6720d40df22ca352af995af5448525 (diff) |
Make parts of qv8engine_p.h GC safe
Change-Id: Iaa15423cedc307a09b3cd7287272d93d7a604caf
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4scopedvalue_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4value_def_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/qqmlxmlhttprequest.cpp | 36 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 14 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine_p.h | 7 | ||||
-rw-r--r-- | src/qmltest/quicktestresult.cpp | 2 |
8 files changed, 44 insertions, 36 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index adeeedbbc7..5dd5512c0a 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -1615,7 +1615,7 @@ QV4::ReturnedValue CallArgument::toValue(QV8Engine *engine) } else if (type == QMetaType::Float) { return QV4::Encode(floatValue); } else if (type == QMetaType::QString) { - return engine->toString(*qstringPtr).asReturnedValue(); + return engine->toString(*qstringPtr); } else if (type == QMetaType::QObjectStar) { QObject *object = qobjectPtr; if (object) diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index f11a982b65..a8e18dac78 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -592,6 +592,12 @@ inline SafeValue &SafeValue::operator=(const Scoped<T> &t) return *this; } +inline SafeValue &SafeValue::operator=(const ValueRef v) +{ + val = v.asReturnedValue(); + return *this; +} + template<typename T> inline Returned<T> *SafeValue::as() { diff --git a/src/qml/jsruntime/qv4value_def_p.h b/src/qml/jsruntime/qv4value_def_p.h index bf344a7f3d..5cf1581588 100644 --- a/src/qml/jsruntime/qv4value_def_p.h +++ b/src/qml/jsruntime/qv4value_def_p.h @@ -352,6 +352,7 @@ struct SafeValue : public Value } template<typename T> SafeValue &operator=(const Scoped<T> &t); + SafeValue &operator=(const ValueRef v); SafeValue &operator=(const Value &v) { val = v.val; return *this; diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index f1d2f3a85c..ba3cfc0801 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -252,7 +252,7 @@ ReturnedValue QmlValueTypeWrapper::method_toString(SimpleCallContext *ctx) if (w->objectType == QmlValueTypeWrapper::Reference) { QmlValueTypeReference *reference = static_cast<QmlValueTypeReference *>(w); if (reference->object && readReferenceValue(reference)) { - return w->v8->toString(w->type->toString()).asReturnedValue(); + return w->v8->toString(w->type->toString()); } else { return QV4::Encode::undefined(); } @@ -260,7 +260,7 @@ ReturnedValue QmlValueTypeWrapper::method_toString(SimpleCallContext *ctx) Q_ASSERT(w->objectType == QmlValueTypeWrapper::Copy); QmlValueTypeCopy *copy = static_cast<QmlValueTypeCopy *>(w); w->type->setValue(copy->value); - return w->v8->toString(w->type->toString()).asReturnedValue(); + return w->v8->toString(w->type->toString()); } } @@ -310,14 +310,14 @@ ReturnedValue QmlValueTypeWrapper::get(Managed *m, const StringRef name, bool *h cpptype v; \ void *args[] = { &v, 0 }; \ r->type->qt_metacall(QMetaObject::ReadProperty, result->coreIndex, args); \ - return constructor(v).asReturnedValue(); \ + return constructor(v); \ } // These four types are the most common used by the value type wrappers - VALUE_TYPE_LOAD(QMetaType::QReal, qreal, QV4::Value::fromDouble); - VALUE_TYPE_LOAD(QMetaType::Int, int, QV4::Value::fromInt32); + 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::Bool, bool, QV4::Value::fromBoolean); + VALUE_TYPE_LOAD(QMetaType::Bool, bool, QV4::Encode); QVariant v(result->propType, (void *)0); void *args[] = { v.data(), 0 }; diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index 10d407a48d..04ecda6422 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -584,7 +584,7 @@ Value NodePrototype::getProto(ExecutionEngine *v4) if (d->nodePrototype.isUndefined()) { ScopedObject p(scope, new (v4->memoryManager) NodePrototype(v4)); d->nodePrototype = p; - v4->v8Engine->freezeObject(p.asValue()); + v4->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->nodePrototype.value()); } @@ -632,7 +632,7 @@ Value Element::prototype(ExecutionEngine *engine) p->setPrototype(NodePrototype::getProto(engine).asObject()); p->defineAccessorProperty(QStringLiteral("tagName"), NodePrototype::method_get_nodeName, 0); d->elementPrototype = p; - engine->v8Engine->freezeObject(p.asValue()); + engine->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->elementPrototype.value()); } @@ -648,7 +648,7 @@ Value Attr::prototype(ExecutionEngine *engine) p->defineAccessorProperty(QStringLiteral("value"), method_value, 0); p->defineAccessorProperty(QStringLiteral("ownerElement"), method_ownerElement, 0); d->attrPrototype = p; - engine->v8Engine->freezeObject(p.asValue()); + engine->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->attrPrototype.value()); } @@ -660,7 +660,7 @@ ReturnedValue Attr::method_name(SimpleCallContext *ctx) return Encode::undefined(); QV8Engine *engine = ctx->engine->v8Engine; - return engine->toString(r->d->name).asReturnedValue(); + return engine->toString(r->d->name); } ReturnedValue Attr::method_value(SimpleCallContext *ctx) @@ -670,7 +670,7 @@ ReturnedValue Attr::method_value(SimpleCallContext *ctx) return Encode::undefined(); QV8Engine *engine = ctx->engine->v8Engine; - return engine->toString(r->d->data).asReturnedValue(); + return engine->toString(r->d->data); } ReturnedValue Attr::method_ownerElement(SimpleCallContext *ctx) @@ -703,7 +703,7 @@ Value CharacterData::prototype(ExecutionEngine *v4) p->defineAccessorProperty(QStringLiteral("data"), NodePrototype::method_get_nodeValue, 0); p->defineAccessorProperty(QStringLiteral("length"), method_length, 0); d->characterDataPrototype = p; - v4->v8Engine->freezeObject(p.asValue()); + v4->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->characterDataPrototype.value()); } @@ -723,7 +723,7 @@ ReturnedValue Text::method_wholeText(SimpleCallContext *ctx) return Encode::undefined(); QV8Engine *engine = ctx->engine->v8Engine; - return engine->toString(r->d->data).asReturnedValue(); + return engine->toString(r->d->data); } Value Text::prototype(ExecutionEngine *v4) @@ -736,7 +736,7 @@ Value Text::prototype(ExecutionEngine *v4) p->defineAccessorProperty(QStringLiteral("isElementContentWhitespace"), method_isElementContentWhitespace, 0); p->defineAccessorProperty(QStringLiteral("wholeText"), method_wholeText, 0); d->textPrototype = p; - v4->v8Engine->freezeObject(p.asValue()); + v4->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->textPrototype.value()); } @@ -750,7 +750,7 @@ Value CDATA::prototype(ExecutionEngine *v4) Scoped<Object> p(scope, v4->newObject()); p->setPrototype(Text::prototype(v4).asObject()); d->cdataPrototype = p; - v4->v8Engine->freezeObject(p.asValue()); + v4->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->cdataPrototype.value()); } @@ -767,7 +767,7 @@ Value Document::prototype(ExecutionEngine *v4) p->defineAccessorProperty(QStringLiteral("xmlStandalone"), method_xmlStandalone, 0); p->defineAccessorProperty(QStringLiteral("documentElement"), method_documentElement, 0); d->documentPrototype = p; - v4->v8Engine->freezeObject(p.asValue()); + v4->v8Engine->freezeObject(p); } return Value::fromReturnedValue(d->documentPrototype.value()); } @@ -994,7 +994,7 @@ ReturnedValue Document::method_xmlVersion(SimpleCallContext *ctx) return Encode::undefined(); QV8Engine *engine = ctx->engine->v8Engine; - return engine->toString(static_cast<DocumentImpl *>(r->d)->version).asReturnedValue(); + return engine->toString(static_cast<DocumentImpl *>(r->d)->version); } ReturnedValue Document::method_xmlEncoding(SimpleCallContext *ctx) @@ -1004,7 +1004,7 @@ ReturnedValue Document::method_xmlEncoding(SimpleCallContext *ctx) return Encode::undefined(); QV8Engine *engine = ctx->engine->v8Engine; - return engine->toString(static_cast<DocumentImpl *>(r->d)->encoding).asReturnedValue(); + return engine->toString(static_cast<DocumentImpl *>(r->d)->encoding); } class QQmlXMLHttpRequest : public QObject @@ -1836,7 +1836,7 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_getResponseHeader(SimpleCallContext r->readyState() != QQmlXMLHttpRequest::HeadersReceived) V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); - return engine->toString(r->header(ctx->arguments[0].toQStringNoThrow())).asReturnedValue(); + return engine->toString(r->header(ctx->arguments[0].toQStringNoThrow())); } ReturnedValue QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(SimpleCallContext *ctx) @@ -1858,7 +1858,7 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_getAllResponseHeaders(SimpleCallCon r->readyState() != QQmlXMLHttpRequest::HeadersReceived) V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); - return engine->toString(r->headers()).asReturnedValue(); + return engine->toString(r->headers()); } // XMLHttpRequest properties @@ -1909,9 +1909,9 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_get_statusText(SimpleCallContext *c V4THROW_DOM(DOMEXCEPTION_INVALID_STATE_ERR, "Invalid state"); if (r->errorFlag()) - return engine->toString(QString()).asReturnedValue(); + return engine->toString(QString()); else - return engine->toString(r->replyStatusText()).asReturnedValue(); + return engine->toString(r->replyStatusText()); } ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseText(SimpleCallContext *ctx) @@ -1927,9 +1927,9 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseText(SimpleCallContext if (r->readyState() != QQmlXMLHttpRequest::Loading && r->readyState() != QQmlXMLHttpRequest::Done) - return engine->toString(QString()).asReturnedValue(); + return engine->toString(QString()); else - return engine->toString(r->responseBody()).asReturnedValue(); + return engine->toString(r->responseBody()); } ReturnedValue QQmlXMLHttpRequestCtor::method_get_responseXML(SimpleCallContext *ctx) diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index e8c84eee35..40b512bdc7 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -459,7 +459,7 @@ void QV8Engine::initializeGlobal() } } -void QV8Engine::freezeObject(const QV4::Value &value) +void QV8Engine::freezeObject(const QV4::ValueRef value) { QV4::Scope scope(m_v4Engine); QV4::ScopedFunctionObject f(scope, m_freezeObject.value()); @@ -507,7 +507,9 @@ void QV8Engine::setExtensionData(int index, Deletable *data) void QV8Engine::initQmlGlobalObject() { initializeGlobal(); - freezeObject(QV4::Value::fromObject(m_v4Engine->globalObject)); + QV4::Scope scope(m_v4Engine); + QV4::ScopedValue v(scope, m_v4Engine->globalObject); + freezeObject(v); } void QV8Engine::setEngine(QQmlEngine *engine) @@ -516,9 +518,9 @@ void QV8Engine::setEngine(QQmlEngine *engine) initQmlGlobalObject(); } -QV4::Value QV8Engine::global() +QV4::ReturnedValue QV8Engine::global() { - return QV4::Value::fromObject(m_v4Engine->globalObject); + return m_v4Engine->globalObject->asReturnedValue(); } // Converts a QVariantList to JS. @@ -992,9 +994,9 @@ int QV8Engine::consoleCountHelper(const QString &file, quint16 line, quint16 col return number; } -QV4::Value QV8Engine::toString(const QString &string) +QV4::ReturnedValue QV8Engine::toString(const QString &string) { - return QV4::Value::fromString(m_v4Engine->newString(string)); + return QV4::Value::fromString(m_v4Engine->newString(string)).asReturnedValue(); } QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index d7490036f3..e27be50f29 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -194,7 +194,7 @@ public: void setEngine(QQmlEngine *engine); QQmlEngine *engine() { return m_engine; } QJSEngine *publicEngine() { return q; } - QV4::Value global(); + QV4::ReturnedValue global(); void *xmlHttpRequestData() { return m_xmlHttpRequestData; } @@ -203,13 +203,13 @@ public: QQmlContextData *callingContext(); - void freezeObject(const QV4::Value &value); + void freezeObject(const QV4::ValueRef value); QVariant toVariant(const QV4::Value &value, int typeHint); QV4::ReturnedValue fromVariant(const QVariant &); // Return a JS string for the given QString \a string - QV4::Value toString(const QString &string); + QV4::ReturnedValue toString(const QString &string); // Return the network access manager for this engine. By default this returns the network // access manager of the QQmlEngine. It is overridden in the case of a threaded v8 @@ -219,7 +219,6 @@ public: // Return the list of illegal id names (the names of the properties on the global object) const QV4::IdentifierHash<bool> &illegalNames() const; - inline void collectGarbage() { gc(); } void gc(); static QMutex *registrationMutex(); diff --git a/src/qmltest/quicktestresult.cpp b/src/qmltest/quicktestresult.cpp index d38282d955..d549d1235b 100644 --- a/src/qmltest/quicktestresult.cpp +++ b/src/qmltest/quicktestresult.cpp @@ -513,7 +513,7 @@ void QuickTestResult::stringify(QQmlV4Function *args) result.append(tmp); } - args->setReturnValue(args->engine()->toString(result).asReturnedValue()); + args->setReturnValue(args->engine()->toString(result)); } bool QuickTestResult::compare |