diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-16 22:02:27 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-22 01:06:20 +0200 |
commit | e441692b0b8f8fffdfdfa8a21c570adcd5cbae7a (patch) | |
tree | 9b764401d87682012328c46dc947721f47b428b2 /src/qml/qml | |
parent | a0f8be4021caa9bb5055923f0eea3bee0e345235 (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.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmllocale.cpp | 26 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmlxmlhttprequest.cpp | 104 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 7 | ||||
-rw-r--r-- | src/qml/qml/v8/qv4domerrors.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/v8/qv4sqlerrors.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 10 |
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. |