aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-09-16 22:02:27 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-22 01:06:20 +0200
commite441692b0b8f8fffdfdfa8a21c570adcd5cbae7a (patch)
tree9b764401d87682012328c46dc947721f47b428b2 /src/qml/qml
parenta0f8be4021caa9bb5055923f0eea3bee0e345235 (diff)
Further work towards an exact GC
Add some more convenience in the helper classes in qscopedvalue_p.h Make accesses to CallData safer, and change ExecutionEngine::newObject() to return a safe pointer. Change-Id: I980909754ce9681cf6faa1355bab3a1e5d6dd186 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlcomponent.cpp5
-rw-r--r--src/qml/qml/qqmllocale.cpp26
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp5
-rw-r--r--src/qml/qml/qqmlxmlhttprequest.cpp104
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp7
-rw-r--r--src/qml/qml/v8/qv4domerrors.cpp5
-rw-r--r--src/qml/qml/v8/qv4sqlerrors.cpp5
-rw-r--r--src/qml/qml/v8/qv8engine.cpp10
8 files changed, 107 insertions, 60 deletions
diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp
index 5ed75a1e06..149cbf2c49 100644
--- a/src/qml/qml/qqmlcomponent.cpp
+++ b/src/qml/qml/qqmlcomponent.cpp
@@ -1408,7 +1408,8 @@ void QQmlComponentPrivate::initializeObjectWithInitialProperties(const QV4::Valu
QQmlComponentExtension::QQmlComponentExtension(QV8Engine *engine)
{
QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
- QV4::Object *proto = v4->newObject();
+ QV4::Scope scope(v4);
+ QV4::Scoped<QV4::Object> proto(scope, v4->newObject());
QV4::Property *s = proto->insertMember(v4->newString(QStringLiteral("onStatusChanged")),
QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable);
s->setGetter(V4FUNCTION(QmlIncubatorObject::method_get_statusChanged, v4));
@@ -1421,7 +1422,7 @@ QQmlComponentExtension::QQmlComponentExtension(QV8Engine *engine)
s->setGetter(V4FUNCTION(QmlIncubatorObject::method_get_object, v4));
proto->defineDefaultProperty(v4, QStringLiteral("forceCompletion"), QmlIncubatorObject::method_forceCompletion);
- incubationProto = QV4::Value::fromObject(proto);
+ incubationProto = proto;
}
QV4::ReturnedValue QmlIncubatorObject::method_get_object(QV4::SimpleCallContext *ctx)
diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp
index 405411e65c..d4998ec5ba 100644
--- a/src/qml/qml/qqmllocale.cpp
+++ b/src/qml/qml/qqmllocale.cpp
@@ -112,7 +112,7 @@ private:
DEFINE_MANAGED_VTABLE(QQmlLocaleData);
#define GET_LOCALE_DATA_RESOURCE(OBJECT) \
- QQmlLocaleData *r = OBJECT.as<QQmlLocaleData>(); \
+ QV4::Scoped<QQmlLocaleData> r(scope, OBJECT.as<QQmlLocaleData>()); \
if (!r) \
V4THROW_ERROR("Not a valid Locale object")
@@ -140,6 +140,8 @@ QV4::ReturnedValue QQmlDateExtension::method_toLocaleString(QV4::SimpleCallConte
if (ctx->argumentCount > 2)
return QV4::DatePrototype::method_toLocaleString(ctx);
+ QV4::Scope scope(ctx);
+
QV4::DateObject *date = ctx->thisObject.asDateObject();
if (!date)
return QV4::DatePrototype::method_toLocaleString(ctx);
@@ -182,6 +184,8 @@ QV4::ReturnedValue QQmlDateExtension::method_toLocaleTimeString(QV4::SimpleCallC
if (ctx->argumentCount > 2)
return QV4::DatePrototype::method_toLocaleTimeString(ctx);
+ QV4::Scope scope(ctx);
+
QV4::DateObject *date = ctx->thisObject.asDateObject();
if (!date)
return QV4::DatePrototype::method_toLocaleTimeString(ctx);
@@ -225,6 +229,8 @@ QV4::ReturnedValue QQmlDateExtension::method_toLocaleDateString(QV4::SimpleCallC
if (ctx->argumentCount > 2)
return QV4::DatePrototype::method_toLocaleDateString(ctx);
+ QV4::Scope scope(ctx);
+
QV4::DateObject *dateObj = ctx->thisObject.asDateObject();
if (!dateObj)
return QV4::DatePrototype::method_toLocaleDateString(ctx);
@@ -273,6 +279,8 @@ QV4::ReturnedValue QQmlDateExtension::method_fromLocaleString(QV4::SimpleCallCon
return QV4::Encode(engine->newDateObject(dt));
}
+ QV4::Scope scope(ctx);
+
if (ctx->argumentCount < 1 || ctx->argumentCount > 3 || !isLocaleObject(ctx->arguments[0]))
V4THROW_ERROR("Locale: Date.fromLocaleString(): Invalid arguments");
@@ -315,6 +323,8 @@ QV4::ReturnedValue QQmlDateExtension::method_fromLocaleTimeString(QV4::SimpleCal
if (ctx->argumentCount < 1 || ctx->argumentCount > 3 || !isLocaleObject(ctx->arguments[0]))
V4THROW_ERROR("Locale: Date.fromLocaleTimeString(): Invalid arguments");
+ QV4::Scope scope(ctx);
+
GET_LOCALE_DATA_RESOURCE(ctx->arguments[0]);
QLocale::FormatType enumFormat = QLocale::LongFormat;
@@ -355,6 +365,8 @@ QV4::ReturnedValue QQmlDateExtension::method_fromLocaleDateString(QV4::SimpleCal
if (ctx->argumentCount < 1 || ctx->argumentCount > 3 || !isLocaleObject(ctx->arguments[0]))
V4THROW_ERROR("Locale: Date.fromLocaleDateString(): Invalid arguments");
+ QV4::Scope scope(ctx);
+
GET_LOCALE_DATA_RESOURCE(ctx->arguments[0]);
QLocale::FormatType enumFormat = QLocale::LongFormat;
@@ -414,6 +426,8 @@ QV4::ReturnedValue QQmlNumberExtension::method_toLocaleString(QV4::SimpleCallCon
if (!isLocaleObject(ctx->arguments[0]))
return QV4::NumberPrototype::method_toLocaleString(ctx); // Use the default Number toLocaleString()
+ QV4::Scope scope(ctx);
+
GET_LOCALE_DATA_RESOURCE(ctx->arguments[0]);
quint16 format = 'f';
@@ -450,6 +464,8 @@ QV4::ReturnedValue QQmlNumberExtension::method_toLocaleCurrencyString(QV4::Simpl
if (!isLocaleObject(ctx->arguments[0]))
V4THROW_ERROR("Locale: Number.toLocaleCurrencyString(): Invalid arguments");
+ QV4::Scope scope(ctx);
+
GET_LOCALE_DATA_RESOURCE(ctx->arguments[0]);
QString symbol;
@@ -470,6 +486,8 @@ QV4::ReturnedValue QQmlNumberExtension::method_fromLocaleString(QV4::SimpleCallC
int numberIdx = 0;
QLocale locale;
+ QV4::Scope scope(ctx);
+
if (ctx->argumentCount == 2) {
if (!isLocaleObject(ctx->arguments[0]))
V4THROW_ERROR("Locale: Number.fromLocaleString(): Invalid arguments");
@@ -671,8 +689,8 @@ public:
QV8LocaleDataDeletable::QV8LocaleDataDeletable(QV8Engine *engine)
{
QV4::ExecutionEngine *eng = QV8Engine::getV4(engine);
- QV4::Object *o = eng->newObject();
- prototype = QV4::Value::fromObject(o);
+ QV4::Scope scope(eng);
+ QV4::Scoped<QV4::Object> o(scope, eng->newObject());
o->defineDefaultProperty(eng, QStringLiteral("dateFormat"), QQmlLocaleData::method_dateFormat, 0);
o->defineDefaultProperty(eng, QStringLiteral("standaloneDayName"), QQmlLocaleData::method_standaloneDayName, 0);
@@ -699,6 +717,8 @@ QV8LocaleDataDeletable::QV8LocaleDataDeletable(QV8Engine *engine)
o->defineAccessorProperty(eng, QStringLiteral("amText"), QQmlLocaleData::method_get_amText, 0);
o->defineAccessorProperty(eng, QStringLiteral("measurementSystem"), QQmlLocaleData::method_get_measurementSystem, 0);
o->defineAccessorProperty(eng, QStringLiteral("exponential"), QQmlLocaleData::method_get_exponential, 0);
+
+ prototype = o;
}
QV8LocaleDataDeletable::~QV8LocaleDataDeletable()
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index f89ce15a57..b5073763b8 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -134,9 +134,10 @@ void QmlValueTypeWrapper::initProto(ExecutionEngine *v4)
if (v4->qmlExtensions()->valueTypeWrapperPrototype)
return;
- Object *o = v4->newObject();
+ Scope scope(v4);
+ Scoped<Object> o(scope, v4->newObject());
o->defineDefaultProperty(v4, QStringLiteral("toString"), method_toString, 1);
- v4->qmlExtensions()->valueTypeWrapperPrototype = o;
+ v4->qmlExtensions()->valueTypeWrapperPrototype = o.getPointer();
}
ReturnedValue QmlValueTypeWrapper::create(QV8Engine *v8, QObject *object, int property, QQmlValueType *type)
diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp
index dc98bd176e..bef943fd51 100644
--- a/src/qml/qml/qqmlxmlhttprequest.cpp
+++ b/src/qml/qml/qqmlxmlhttprequest.cpp
@@ -65,6 +65,7 @@
#include <QtCore/qdebug.h>
#include <private/qv4objectproto_p.h>
+#include <private/qv4scopedvalue_p.h>
using namespace QV4;
@@ -99,15 +100,15 @@ static inline QQmlXMLHttpRequestData *xhrdata(QV8Engine *engine)
return (QQmlXMLHttpRequestData *)engine->xmlHttpRequestData();
}
-static Value constructMeObject(const Value &thisObj, QV8Engine *e)
+static ReturnedValue constructMeObject(const Value &thisObj, QV8Engine *e)
{
ExecutionEngine *v4 = QV8Engine::getV4(e);
Scope scope(v4);
- Object *meObj = v4->newObject();
+ Scoped<Object> meObj(scope, v4->newObject());
meObj->put(v4->newString(QStringLiteral("ThisObject")), thisObj);
ScopedValue v(scope, QmlContextWrapper::qmlScope(e, e->callingContext(), 0));
meObj->put(v4->newString(QStringLiteral("ActivationObject")), v);
- return Value::fromObject(meObj);
+ return meObj.asReturnedValue();
}
QQmlXMLHttpRequestData::QQmlXMLHttpRequestData()
@@ -625,10 +626,11 @@ Value Element::prototype(ExecutionEngine *engine)
{
QQmlXMLHttpRequestData *d = xhrdata(engine->v8Engine);
if (d->elementPrototype.isEmpty()) {
- Object *p = engine->newObject();
+ Scope scope(engine);
+ Scoped<Object> p(scope, engine->newObject());
p->setPrototype(NodePrototype::getProto(engine).asObject());
p->defineAccessorProperty(engine, QStringLiteral("tagName"), NodePrototype::method_get_nodeName, 0);
- d->elementPrototype = Value::fromObject(p);
+ d->elementPrototype = p;
engine->v8Engine->freezeObject(d->elementPrototype.value());
}
return d->elementPrototype.value();
@@ -638,12 +640,13 @@ Value Attr::prototype(ExecutionEngine *engine)
{
QQmlXMLHttpRequestData *d = xhrdata(engine->v8Engine);
if (d->attrPrototype.isEmpty()) {
- Object *p = engine->newObject();
+ Scope scope(engine);
+ Scoped<Object> p(scope, engine->newObject());
p->setPrototype(NodePrototype::getProto(engine).asObject());
p->defineAccessorProperty(engine, QStringLiteral("name"), method_name, 0);
p->defineAccessorProperty(engine, QStringLiteral("value"), method_value, 0);
p->defineAccessorProperty(engine, QStringLiteral("ownerElement"), method_ownerElement, 0);
- d->attrPrototype = Value::fromObject(p);
+ d->attrPrototype = p;
engine->v8Engine->freezeObject(d->attrPrototype.value());
}
return d->attrPrototype.value();
@@ -693,11 +696,12 @@ Value CharacterData::prototype(ExecutionEngine *v4)
{
QQmlXMLHttpRequestData *d = xhrdata(v4->v8Engine);
if (d->characterDataPrototype.isEmpty()) {
- Object *p = v4->newObject();
+ Scope scope(v4);
+ Scoped<Object> p(scope, v4->newObject());
p->setPrototype(NodePrototype::getProto(v4).asObject());
p->defineAccessorProperty(v4, QStringLiteral("data"), NodePrototype::method_get_nodeValue, 0);
p->defineAccessorProperty(v4, QStringLiteral("length"), method_length, 0);
- d->characterDataPrototype = Value::fromObject(p);
+ d->characterDataPrototype = p;
v4->v8Engine->freezeObject(d->characterDataPrototype);
}
return d->characterDataPrototype.value();
@@ -725,11 +729,12 @@ Value Text::prototype(ExecutionEngine *v4)
{
QQmlXMLHttpRequestData *d = xhrdata(v4->v8Engine);
if (d->textPrototype.isEmpty()) {
- Object *p = v4->newObject();
+ Scope scope(v4);
+ Scoped<Object> p(scope, v4->newObject());
p->setPrototype(CharacterData::prototype(v4).asObject());
p->defineAccessorProperty(v4, QStringLiteral("isElementContentWhitespace"), method_isElementContentWhitespace, 0);
p->defineAccessorProperty(v4, QStringLiteral("wholeText"), method_wholeText, 0);
- d->textPrototype = Value::fromObject(p);
+ d->textPrototype = p;
v4->v8Engine->freezeObject(d->textPrototype);
}
return d->textPrototype.value();
@@ -740,9 +745,10 @@ Value CDATA::prototype(ExecutionEngine *v4)
// ### why not just use TextProto???
QQmlXMLHttpRequestData *d = xhrdata(v4->v8Engine);
if (d->cdataPrototype.isEmpty()) {
- Object *p = v4->newObject();
+ Scope scope(v4);
+ Scoped<Object> p(scope, v4->newObject());
p->setPrototype(Text::prototype(v4).asObject());
- d->cdataPrototype = Value::fromObject(p);
+ d->cdataPrototype = p;
v4->v8Engine->freezeObject(d->cdataPrototype);
}
return d->cdataPrototype.value();
@@ -752,13 +758,14 @@ Value Document::prototype(ExecutionEngine *v4)
{
QQmlXMLHttpRequestData *d = xhrdata(v4->v8Engine);
if (d->documentPrototype.isEmpty()) {
- Object *p = v4->newObject();
+ Scope scope(v4);
+ Scoped<Object> p(scope, v4->newObject());
p->setPrototype(NodePrototype::getProto(v4).asObject());
p->defineAccessorProperty(v4, QStringLiteral("xmlVersion"), method_xmlVersion, 0);
p->defineAccessorProperty(v4, QStringLiteral("xmlEncoding"), method_xmlEncoding, 0);
p->defineAccessorProperty(v4, QStringLiteral("xmlStandalone"), method_xmlStandalone, 0);
p->defineAccessorProperty(v4, QStringLiteral("documentElement"), method_documentElement, 0);
- d->documentPrototype = Value::fromObject(p);
+ d->documentPrototype = p;
v4->v8Engine->freezeObject(d->documentPrototype);
}
return d->documentPrototype.value();
@@ -1016,9 +1023,9 @@ public:
int replyStatus() const;
QString replyStatusText() const;
- Value open(const Value &me, const QString &, const QUrl &);
- Value send(const Value &me, const QByteArray &);
- Value abort(const Value &me);
+ ReturnedValue open(const ValueRef me, const QString &, const QUrl &);
+ ReturnedValue send(const ValueRef me, const QByteArray &);
+ ReturnedValue abort(const ValueRef me);
void addHeader(const QString &, const QString &);
QString header(const QString &name);
@@ -1060,11 +1067,11 @@ private:
#endif
void readEncoding();
- Value getMe() const;
- void setMe(const Value &me);
+ ReturnedValue getMe() const;
+ void setMe(const ValueRef me);
PersistentValue m_me;
- void dispatchCallback(const Value &me);
+ void dispatchCallback(const ValueRef me);
void printError(const Exception &e);
int m_status;
@@ -1115,8 +1122,7 @@ QString QQmlXMLHttpRequest::replyStatusText() const
return m_statusText;
}
-Value QQmlXMLHttpRequest::open(const Value &me, const QString &method,
- const QUrl &url)
+ReturnedValue QQmlXMLHttpRequest::open(const ValueRef me, const QString &method, const QUrl &url)
{
destroyNetwork();
m_sendFlag = false;
@@ -1127,7 +1133,7 @@ Value QQmlXMLHttpRequest::open(const Value &me, const QString &method,
m_state = Opened;
m_addedHeaders.clear();
dispatchCallback(me);
- return Value::undefinedValue();
+ return Encode::undefined();
}
void QQmlXMLHttpRequest::addHeader(const QString &name, const QString &value)
@@ -1241,7 +1247,7 @@ void QQmlXMLHttpRequest::requestFromUrl(const QUrl &url)
this, SLOT(finished()));
}
-Value QQmlXMLHttpRequest::send(const Value &me, const QByteArray &data)
+ReturnedValue QQmlXMLHttpRequest::send(const ValueRef me, const QByteArray &data)
{
m_errorFlag = false;
m_sendFlag = true;
@@ -1252,10 +1258,10 @@ Value QQmlXMLHttpRequest::send(const Value &me, const QByteArray &data)
requestFromUrl(m_url);
- return Value::undefinedValue();
+ return Encode::undefined();
}
-Value QQmlXMLHttpRequest::abort(const Value &me)
+ReturnedValue QQmlXMLHttpRequest::abort(const ValueRef me)
{
destroyNetwork();
m_responseEntityBody = QByteArray();
@@ -1273,15 +1279,15 @@ Value QQmlXMLHttpRequest::abort(const Value &me)
m_state = Unsent;
- return Value::undefinedValue();
+ return Encode::undefined();
}
-Value QQmlXMLHttpRequest::getMe() const
+ReturnedValue QQmlXMLHttpRequest::getMe() const
{
- return m_me.value();
+ return m_me.value().asReturnedValue();
}
-void QQmlXMLHttpRequest::setMe(const Value &me)
+void QQmlXMLHttpRequest::setMe(const ValueRef me)
{
m_me = me;
}
@@ -1293,18 +1299,22 @@ void QQmlXMLHttpRequest::readyRead()
m_statusText =
QString::fromUtf8(m_network->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray());
+ Scope scope(v4);
+ ScopedValue me(scope, m_me.value());
+
// ### We assume if this is called the headers are now available
if (m_state < HeadersReceived) {
m_state = HeadersReceived;
fillHeadersList ();
- dispatchCallback(m_me.value());
+ dispatchCallback(me);
}
bool wasEmpty = m_responseEntityBody.isEmpty();
m_responseEntityBody.append(m_network->readAll());
if (wasEmpty && !m_responseEntityBody.isEmpty())
m_state = Loading;
- dispatchCallback(m_me.value());
+
+ dispatchCallback(me);
}
static const char *errorToString(QNetworkReply::NetworkError error)
@@ -1335,6 +1345,9 @@ void QQmlXMLHttpRequest::error(QNetworkReply::NetworkError error)
qWarning().nospace() << " " << error << ' ' << errorToString(error) << ' ' << m_statusText;
}
+ Scope scope(v4);
+ ScopedValue me(scope, m_me.value());
+
if (error == QNetworkReply::ContentAccessDenied ||
error == QNetworkReply::ContentOperationNotPermittedError ||
error == QNetworkReply::ContentNotFoundError ||
@@ -1342,7 +1355,7 @@ void QQmlXMLHttpRequest::error(QNetworkReply::NetworkError error)
error == QNetworkReply::ContentReSendError ||
error == QNetworkReply::UnknownContentError) {
m_state = Loading;
- dispatchCallback(m_me.value());
+ dispatchCallback(me);
} else {
m_errorFlag = true;
m_responseEntityBody = QByteArray();
@@ -1350,7 +1363,7 @@ void QQmlXMLHttpRequest::error(QNetworkReply::NetworkError error)
m_state = Done;
- dispatchCallback(m_me.value());
+ dispatchCallback(me);
}
#define XMLHTTPREQUEST_MAXIMUM_REDIRECT_RECURSION 15
@@ -1405,7 +1418,9 @@ void QQmlXMLHttpRequest::finished()
dispatchCallback(m_me);
- setMe(Value::emptyValue());
+ Scope scope(v4);
+ ScopedValue v(scope, Value::emptyValue());
+ setMe(v);
}
@@ -1483,12 +1498,12 @@ const QByteArray &QQmlXMLHttpRequest::rawResponseBody() const
return m_responseEntityBody;
}
-void QQmlXMLHttpRequest::dispatchCallback(const Value &me)
+void QQmlXMLHttpRequest::dispatchCallback(const ValueRef me)
{
ExecutionContext *ctx = v4->current;
QV4::Scope scope(v4);
try {
- Object *o = me.asObject();
+ Scoped<Object> o(scope, me);
if (!o)
ctx->throwError(QStringLiteral("QQmlXMLHttpRequest: internal error: empty ThisObject"));
@@ -1631,7 +1646,9 @@ DEFINE_MANAGED_VTABLE(QQmlXMLHttpRequestCtor);
void QQmlXMLHttpRequestCtor::setupProto()
{
ExecutionEngine *v4 = engine();
- proto = v4->newObject();
+ Scope scope(v4);
+ Scoped<Object> p(scope, v4->newObject());
+ proto = p.getPointer();
// Methods
proto->defineDefaultProperty(v4, QStringLiteral("open"), method_open);
@@ -1704,7 +1721,8 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_open(SimpleCallContext *ctx)
if (!username.isNull()) url.setUserName(username);
if (!password.isNull()) url.setPassword(password);
- return r->open(constructMeObject(ctx->thisObject, engine), method, url).asReturnedValue();
+ ScopedValue meObject(scope, constructMeObject(ctx->thisObject, engine));
+ return r->open(meObject, method, url);
}
ReturnedValue QQmlXMLHttpRequestCtor::method_setRequestHeader(SimpleCallContext *ctx)
@@ -1774,7 +1792,8 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_send(SimpleCallContext *ctx)
if (ctx->argumentCount > 0)
data = ctx->arguments[0].toQStringNoThrow().toUtf8();
- return r->send(constructMeObject(ctx->thisObject, engine), data).asReturnedValue();
+ ScopedValue meObject(scope, constructMeObject(ctx->thisObject, engine));
+ return r->send(meObject, data);
}
ReturnedValue QQmlXMLHttpRequestCtor::method_abort(SimpleCallContext *ctx)
@@ -1786,7 +1805,8 @@ ReturnedValue QQmlXMLHttpRequestCtor::method_abort(SimpleCallContext *ctx)
V4THROW_REFERENCE("Not an XMLHttpRequest object");
QQmlXMLHttpRequest *r = w->request;
- return r->abort(constructMeObject(ctx->thisObject, ctx->engine->v8Engine)).asReturnedValue();
+ ScopedValue meObject(scope, constructMeObject(ctx->thisObject, ctx->engine->v8Engine));
+ return r->abort(meObject);
}
ReturnedValue QQmlXMLHttpRequestCtor::method_getResponseHeader(SimpleCallContext *ctx)
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
index 6389ad2715..40b5075ddd 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
@@ -962,12 +962,12 @@ ReturnedValue QtObject::method_createQmlObject(SimpleCallContext *ctx)
for (int ii = 0; ii < errors.count(); ++ii) {
const QQmlError &error = errors.at(ii);
errorstr += QLatin1String("\n ") + error.toString();
- QV4::Object *qmlerror = v4->newObject();
+ 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())));
- qmlerrors->putIndexed(ii, QV4::Value::fromObject(qmlerror));
+ qmlerrors->putIndexed(ii, qmlerror.asValue());
}
Scoped<Object> errorObject(scope, v4->newErrorObject(Value::fromString(v4->newString(errorstr))));
@@ -1001,7 +1001,8 @@ ReturnedValue QtObject::method_createQmlObject(SimpleCallContext *ctx)
url = context->resolvedUrl(url);
QObject *parentArg = 0;
- if (QV4::QObjectWrapper *qobjectWrapper = ctx->arguments[1].as<QV4::QObjectWrapper>())
+ QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, ctx->arguments[1]);
+ if (!!qobjectWrapper)
parentArg = qobjectWrapper->object();
if (!parentArg)
V4THROW_ERROR("Qt.createQmlObject(): Missing parent object");
diff --git a/src/qml/qml/v8/qv4domerrors.cpp b/src/qml/qml/v8/qv4domerrors.cpp
index 63c79f85c2..f89831fa2f 100644
--- a/src/qml/qml/v8/qv4domerrors.cpp
+++ b/src/qml/qml/v8/qv4domerrors.cpp
@@ -48,7 +48,8 @@ using namespace QV4;
void qt_add_domexceptions(ExecutionEngine *e)
{
- Object *domexception = e->newObject();
+ Scope scope(e);
+ Scoped<Object> domexception(scope, e->newObject());
domexception->defineReadonlyProperty(e, QStringLiteral("INDEX_SIZE_ERR"), Value::fromInt32(DOMEXCEPTION_INDEX_SIZE_ERR));
domexception->defineReadonlyProperty(e, QStringLiteral("DOMSTRING_SIZE_ERR"), Value::fromInt32(DOMEXCEPTION_DOMSTRING_SIZE_ERR));
domexception->defineReadonlyProperty(e, QStringLiteral("HIERARCHY_REQUEST_ERR"), Value::fromInt32(DOMEXCEPTION_HIERARCHY_REQUEST_ERR));
@@ -66,7 +67,7 @@ void qt_add_domexceptions(ExecutionEngine *e)
domexception->defineReadonlyProperty(e, QStringLiteral("INVALID_ACCESS_ERR"), Value::fromInt32(DOMEXCEPTION_INVALID_ACCESS_ERR));
domexception->defineReadonlyProperty(e, QStringLiteral("VALIDATION_ERR"), Value::fromInt32(DOMEXCEPTION_VALIDATION_ERR));
domexception->defineReadonlyProperty(e, QStringLiteral("TYPE_MISMATCH_ERR"), Value::fromInt32(DOMEXCEPTION_TYPE_MISMATCH_ERR));
- e->globalObject->defineDefaultProperty(e->current, QStringLiteral("DOMException"), Value::fromObject(domexception));
+ e->globalObject->defineDefaultProperty(e->current, QStringLiteral("DOMException"), domexception.asValue());
}
QT_END_NAMESPACE
diff --git a/src/qml/qml/v8/qv4sqlerrors.cpp b/src/qml/qml/v8/qv4sqlerrors.cpp
index bd5a9fdc83..a203fd9980 100644
--- a/src/qml/qml/v8/qv4sqlerrors.cpp
+++ b/src/qml/qml/v8/qv4sqlerrors.cpp
@@ -49,7 +49,8 @@ using namespace QV4;
void qt_add_sqlexceptions(QV4::ExecutionEngine *engine)
{
- Object *sqlexception = engine->newObject();
+ Scope scope(engine);
+ Scoped<Object> sqlexception(scope, engine->newObject());
sqlexception->defineReadonlyProperty(engine, QStringLiteral("UNKNOWN_ERR"), Value::fromInt32(SQLEXCEPTION_UNKNOWN_ERR));
sqlexception->defineReadonlyProperty(engine, QStringLiteral("DATABASE_ERR"), Value::fromInt32(SQLEXCEPTION_DATABASE_ERR));
sqlexception->defineReadonlyProperty(engine, QStringLiteral("VERSION_ERR"), Value::fromInt32(SQLEXCEPTION_VERSION_ERR));
@@ -58,7 +59,7 @@ void qt_add_sqlexceptions(QV4::ExecutionEngine *engine)
sqlexception->defineReadonlyProperty(engine, QStringLiteral("SYNTAX_ERR"), Value::fromInt32(SQLEXCEPTION_SYNTAX_ERR));
sqlexception->defineReadonlyProperty(engine, QStringLiteral("CONSTRAINT_ERR"), Value::fromInt32(SQLEXCEPTION_CONSTRAINT_ERR));
sqlexception->defineReadonlyProperty(engine, QStringLiteral("TIMEOUT_ERR"), Value::fromInt32(SQLEXCEPTION_TIMEOUT_ERR));
- engine->globalObject->defineDefaultProperty(engine->current, QStringLiteral("SQLException"), Value::fromObject(sqlexception));
+ engine->globalObject->defineDefaultProperty(engine->current, QStringLiteral("SQLException"), sqlexception.asValue());
}
QT_END_NAMESPACE
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index 08bbd4c960..b62d8c173d 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -212,10 +212,11 @@ static QV4::ReturnedValue arrayFromVariantList(QV8Engine *engine, const QVariant
static QV4::ReturnedValue objectFromVariantMap(QV8Engine *engine, const QVariantMap &map)
{
QV4::ExecutionEngine *e = QV8Engine::getV4(engine);
- QV4::Object *o = e->newObject();
+ QV4::Scope scope(e);
+ QV4::Scoped<QV4::Object> o(scope, e->newObject());
for (QVariantMap::ConstIterator iter = map.begin(); iter != map.end(); ++iter)
o->put(e->newString(iter.key()), QV4::Value::fromReturnedValue(engine->fromVariant(iter.value())));
- return QV4::Value::fromObject(o).asReturnedValue();
+ return o.asReturnedValue();
}
Q_CORE_EXPORT QString qt_regexp_toCanonical(const QString &, QRegExp::PatternSyntax);
@@ -566,13 +567,14 @@ QVariantList QV8Engine::variantListFromJS(QV4::ArrayObject *a,
// the QVariantMap converted to JS, recursively.
QV4::ReturnedValue QV8Engine::variantMapToJS(const QVariantMap &vmap)
{
- QV4::Object *o = m_v4Engine->newObject();
+ QV4::Scope scope(m_v4Engine);
+ QV4::Scoped<QV4::Object> o(scope, m_v4Engine->newObject());
QVariantMap::const_iterator it;
for (it = vmap.constBegin(); it != vmap.constEnd(); ++it) {
QV4::Property *p = o->insertMember(m_v4Engine->newIdentifier(it.key()), QV4::Attr_Data);
p->value = QV4::Value::fromReturnedValue(variantToJS(it.value()));
}
- return QV4::Value::fromObject(o).asReturnedValue();
+ return o.asReturnedValue();
}
// Converts a JS Object to a QVariantMap.