aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-09-24 14:28:02 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-26 09:05:25 +0200
commit9062476491dd1c81f63bb7a3ae6e6a080db1db1e (patch)
tree362935aece4c4c4fd62f15ef14b61c048bcc514c
parent0f204625dc6720d40df22ca352af995af5448525 (diff)
Make parts of qv8engine_p.h GC safe
Change-Id: Iaa15423cedc307a09b3cd7287272d93d7a604caf Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp2
-rw-r--r--src/qml/jsruntime/qv4scopedvalue_p.h6
-rw-r--r--src/qml/jsruntime/qv4value_def_p.h1
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp12
-rw-r--r--src/qml/qml/qqmlxmlhttprequest.cpp36
-rw-r--r--src/qml/qml/v8/qv8engine.cpp14
-rw-r--r--src/qml/qml/v8/qv8engine_p.h7
-rw-r--r--src/qmltest/quicktestresult.cpp2
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