From faf13a3aa0c97b7386e44d02f323a9156a733c9f Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 11 Nov 2014 13:34:18 +0100 Subject: Ported most ExecutionEnginew::new* factory methods away from Returned We don't need Returned anymore with the QV4:: vs. Heap:: separation. Eliminating Returned simplifies also some code. Change-Id: Ic2a9cd3c1a94f2ea37b539d3984d63997121c2b9 Reviewed-by: Lars Knoll --- src/qml/compiler/qv4compileddata.cpp | 2 +- src/qml/jsruntime/qv4context.cpp | 2 +- src/qml/jsruntime/qv4engine.cpp | 102 ++++++++++++++++---------------- src/qml/jsruntime/qv4engine_p.h | 48 +++++++-------- src/qml/jsruntime/qv4functionobject.cpp | 2 +- src/qml/jsruntime/qv4global_p.h | 1 + src/qml/jsruntime/qv4runtime.cpp | 18 +++--- src/qml/jsruntime/qv4runtime_p.h | 2 +- src/qml/jsruntime/qv4value.cpp | 8 +-- src/qml/jsruntime/qv4value_p.h | 9 ++- src/qml/qml/qqmlcontextwrapper.cpp | 4 +- 11 files changed, 103 insertions(+), 95 deletions(-) diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index fbef8b8566..c46392676b 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -83,7 +83,7 @@ QV4::Function *CompilationUnit::linkToEngine(ExecutionEngine *engine) flags |= IR::RegExp::RegExp_IgnoreCase; if (re->flags & CompiledData::RegExp::RegExp_Multiline) flags |= IR::RegExp::RegExp_Multiline; - runtimeRegularExpressions[i] = engine->newRegExpObject(data->stringAt(re->stringIndex), flags); + runtimeRegularExpressions[i] = QV4::Value::fromHeapObject(engine->newRegExpObject(data->stringAt(re->stringIndex), flags)); } if (data->lookupTableSize) { diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index a73b85d580..d360ccdc57 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -112,7 +112,7 @@ void ExecutionContext::createMutableBinding(String *name, bool deletable) if (ctx->d()->type >= Heap::ExecutionContext::Type_CallContext) { CallContext *c = static_cast(ctx.getPointer()); if (!c->d()->activation) - c->d()->activation = d()->engine->newObject()->getPointer()->d(); + c->d()->activation = d()->engine->newObject(); activation = c->d()->activation; break; } diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 3ae19bb42a..164ad176f3 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -394,7 +394,8 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) // // set up the global object // - globalObject = newObject()->getPointer(); + ScopedObject global(scope, newObject()); + globalObject = global; rootContext->d()->global = globalObject->d(); rootContext->d()->callData->thisObject = globalObject; Q_ASSERT(globalObject->internalClass()->vtable); @@ -517,18 +518,18 @@ ExecutionContext *ExecutionEngine::pushGlobalContext() } -Returned *ExecutionEngine::newObject() +Heap::Object *ExecutionEngine::newObject() { Scope scope(this); ScopedObject object(scope, memoryManager->alloc(this)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newObject(InternalClass *internalClass) +Heap::Object *ExecutionEngine::newObject(InternalClass *internalClass) { Scope scope(this); ScopedObject object(scope, memoryManager->alloc(internalClass)); - return object->asReturned(); + return object->d(); } Returned *ExecutionEngine::newString(const QString &s) @@ -542,28 +543,28 @@ String *ExecutionEngine::newIdentifier(const QString &text) return identifierTable->insertString(text); } -Returned *ExecutionEngine::newStringObject(const ValueRef value) +Heap::Object *ExecutionEngine::newStringObject(const ValueRef value) { Scope scope(this); Scoped object(scope, memoryManager->alloc(this, value)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newNumberObject(const ValueRef value) +Heap::Object *ExecutionEngine::newNumberObject(const ValueRef value) { Scope scope(this); Scoped object(scope, memoryManager->alloc(this, value)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newBooleanObject(const ValueRef value) +Heap::Object *ExecutionEngine::newBooleanObject(const ValueRef value) { Scope scope(this); ScopedObject object(scope, memoryManager->alloc(this, value)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newArrayObject(int count) +Heap::ArrayObject *ExecutionEngine::newArrayObject(int count) { Scope scope(this); ScopedArrayObject object(scope, memoryManager->alloc(this)); @@ -573,39 +574,39 @@ Returned *ExecutionEngine::newArrayObject(int count) object->arrayReserve(count); object->setArrayLengthUnchecked(count); } - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newArrayObject(const QStringList &list) +Heap::ArrayObject *ExecutionEngine::newArrayObject(const QStringList &list) { Scope scope(this); ScopedArrayObject object(scope, memoryManager->alloc(this, list)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newArrayObject(InternalClass *ic) +Heap::ArrayObject *ExecutionEngine::newArrayObject(InternalClass *ic) { Scope scope(this); ScopedArrayObject object(scope, memoryManager->alloc(ic)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newDateObject(const ValueRef value) +Heap::DateObject *ExecutionEngine::newDateObject(const ValueRef value) { Scope scope(this); Scoped object(scope, memoryManager->alloc(this, value)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newDateObject(const QDateTime &dt) +Heap::DateObject *ExecutionEngine::newDateObject(const QDateTime &dt) { Scope scope(this); Scoped object(scope, memoryManager->alloc(this, dt)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newRegExpObject(const QString &pattern, int flags) +Heap::RegExpObject *ExecutionEngine::newRegExpObject(const QString &pattern, int flags) { bool global = (flags & IR::RegExp::RegExp_Global); bool ignoreCase = false; @@ -620,94 +621,94 @@ Returned *ExecutionEngine::newRegExpObject(const QString &pattern, return newRegExpObject(re, global); } -Returned *ExecutionEngine::newRegExpObject(RegExp *re, bool global) +Heap::RegExpObject *ExecutionEngine::newRegExpObject(RegExp *re, bool global) { Scope scope(this); Scoped object(scope, memoryManager->alloc(this, re, global)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newRegExpObject(const QRegExp &re) +Heap::RegExpObject *ExecutionEngine::newRegExpObject(const QRegExp &re) { Scope scope(this); Scoped object(scope, memoryManager->alloc(this, re)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newErrorObject(const ValueRef value) +Heap::Object *ExecutionEngine::newErrorObject(const ValueRef value) { Scope scope(this); ScopedObject object(scope, memoryManager->alloc(errorClass, value)); - return object->asReturned(); + return object->d(); } -Returned *ExecutionEngine::newSyntaxErrorObject(const QString &message) +Heap::Object *ExecutionEngine::newSyntaxErrorObject(const QString &message) { Scope scope(this); ScopedString s(scope, newString(message)); ScopedObject error(scope, memoryManager->alloc(this, s)); - return error->asReturned(); + return error->d(); } -Returned *ExecutionEngine::newSyntaxErrorObject(const QString &message, const QString &fileName, int line, int column) +Heap::Object *ExecutionEngine::newSyntaxErrorObject(const QString &message, const QString &fileName, int line, int column) { Scope scope(this); ScopedObject error(scope, memoryManager->alloc(this, message, fileName, line, column)); - return error->asReturned(); + return error->d(); } -Returned *ExecutionEngine::newReferenceErrorObject(const QString &message) +Heap::Object *ExecutionEngine::newReferenceErrorObject(const QString &message) { Scope scope(this); ScopedObject o(scope, memoryManager->alloc(this, message)); - return o->asReturned(); + return o->d(); } -Returned *ExecutionEngine::newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber, int columnNumber) +Heap::Object *ExecutionEngine::newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber, int columnNumber) { Scope scope(this); ScopedObject o(scope, memoryManager->alloc(this, message, fileName, lineNumber, columnNumber)); - return o->asReturned(); + return o->d(); } -Returned *ExecutionEngine::newTypeErrorObject(const QString &message) +Heap::Object *ExecutionEngine::newTypeErrorObject(const QString &message) { Scope scope(this); ScopedObject o(scope, memoryManager->alloc(this, message)); - return o->asReturned(); + return o->d(); } -Returned *ExecutionEngine::newRangeErrorObject(const QString &message) +Heap::Object *ExecutionEngine::newRangeErrorObject(const QString &message) { Scope scope(this); ScopedObject o(scope, memoryManager->alloc(this, message)); - return o->asReturned(); + return o->d(); } -Returned *ExecutionEngine::newURIErrorObject(const ValueRef message) +Heap::Object *ExecutionEngine::newURIErrorObject(const ValueRef message) { Scope scope(this); ScopedObject o(scope, memoryManager->alloc(this, message)); - return o->asReturned(); + return o->d(); } -Returned *ExecutionEngine::newVariantObject(const QVariant &v) +Heap::Object *ExecutionEngine::newVariantObject(const QVariant &v) { Scope scope(this); ScopedObject o(scope, memoryManager->alloc(this, v)); - return o->asReturned(); + return o->d(); } -Returned *ExecutionEngine::newForEachIteratorObject(Object *o) +Heap::Object *ExecutionEngine::newForEachIteratorObject(Object *o) { Scope scope(this); ScopedObject obj(scope, memoryManager->alloc(this, o)); - return obj->asReturned(); + return obj->d(); } -Returned *ExecutionEngine::qmlContextObject() const +Heap::Object *ExecutionEngine::qmlContextObject() const { Heap::ExecutionContext *ctx = currentContext()->d(); @@ -724,11 +725,8 @@ Returned *ExecutionEngine::qmlContextObject() const if (ctx->type != Heap::ExecutionContext::Type_QmlContext) return 0; - Scope scope(currentContext()); - ScopedObject activation(scope, static_cast(ctx)->activation); - Q_ASSERT(activation); - - return activation->asReturned(); + Q_ASSERT(static_cast(ctx)->activation); + return static_cast(ctx)->activation; } QVector ExecutionEngine::stackTrace(int frameLimit) const diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 203bfdb90c..5e2a6cb50b 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -305,41 +305,41 @@ public: void pushContext(CallContext *context); ExecutionContext *popContext(); - Returned *newObject(); - Returned *newObject(InternalClass *internalClass); + Heap::Object *newObject(); + Heap::Object *newObject(InternalClass *internalClass); Returned *newString(const QString &s); String *newIdentifier(const QString &text); - Returned *newStringObject(const ValueRef value); - Returned *newNumberObject(const ValueRef value); - Returned *newBooleanObject(const ValueRef value); + Heap::Object *newStringObject(const ValueRef value); + Heap::Object *newNumberObject(const ValueRef value); + Heap::Object *newBooleanObject(const ValueRef value); - Returned *newArrayObject(int count = 0); - Returned *newArrayObject(const QStringList &list); - Returned *newArrayObject(InternalClass *ic); + Heap::ArrayObject *newArrayObject(int count = 0); + Heap::ArrayObject *newArrayObject(const QStringList &list); + Heap::ArrayObject *newArrayObject(InternalClass *ic); - Returned *newDateObject(const ValueRef value); - Returned *newDateObject(const QDateTime &dt); + Heap::DateObject *newDateObject(const ValueRef value); + Heap::DateObject *newDateObject(const QDateTime &dt); - Returned *newRegExpObject(const QString &pattern, int flags); - Returned *newRegExpObject(RegExp *re, bool global); - Returned *newRegExpObject(const QRegExp &re); + Heap::RegExpObject *newRegExpObject(const QString &pattern, int flags); + Heap::RegExpObject *newRegExpObject(RegExp *re, bool global); + Heap::RegExpObject *newRegExpObject(const QRegExp &re); - Returned *newErrorObject(const ValueRef value); - Returned *newSyntaxErrorObject(const QString &message, const QString &fileName, int line, int column); - Returned *newSyntaxErrorObject(const QString &message); - Returned *newReferenceErrorObject(const QString &message); - Returned *newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber, int columnNumber); - Returned *newTypeErrorObject(const QString &message); - Returned *newRangeErrorObject(const QString &message); - Returned *newURIErrorObject(const ValueRef message); + Heap::Object *newErrorObject(const ValueRef value); + Heap::Object *newSyntaxErrorObject(const QString &message, const QString &fileName, int line, int column); + Heap::Object *newSyntaxErrorObject(const QString &message); + Heap::Object *newReferenceErrorObject(const QString &message); + Heap::Object *newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber, int columnNumber); + Heap::Object *newTypeErrorObject(const QString &message); + Heap::Object *newRangeErrorObject(const QString &message); + Heap::Object *newURIErrorObject(const ValueRef message); - Returned *newVariantObject(const QVariant &v); + Heap::Object *newVariantObject(const QVariant &v); - Returned *newForEachIteratorObject(Object *o); + Heap::Object *newForEachIteratorObject(Object *o); - Returned *qmlContextObject() const; + Heap::Object *qmlContextObject() const; StackTrace stackTrace(int frameLimit = -1) const; StackFrame currentStackFrame() const; diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index 622a2b8232..59c5c43ccb 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -468,7 +468,7 @@ ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData) Scoped f(scope, static_cast(that)); InternalClass *ic = f->internalClassForConstructor(); - callData->thisObject = v4->newObject(ic); + callData->thisObject = Value::fromHeapObject(v4->newObject(ic)); ExecutionContext *context = v4->currentContext(); ExecutionContextSaver ctxSaver(context); diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h index 1127967b32..1c2b8af6bb 100644 --- a/src/qml/jsruntime/qv4global_p.h +++ b/src/qml/jsruntime/qv4global_p.h @@ -137,6 +137,7 @@ namespace Heap { struct ErrorObject; struct ArgumentsObject; struct QObjectWrapper; + struct RegExpObject; struct ArrayBuffer; struct DataView; diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 771c388870..f3e85933a1 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -411,7 +411,7 @@ ReturnedValue RuntimeHelpers::objectDefaultValue(Object *object, int typeHint) -Returned *RuntimeHelpers::convertToObject(ExecutionEngine *engine, const ValueRef value) +Heap::Object *RuntimeHelpers::convertToObject(ExecutionEngine *engine, const ValueRef value) { Q_ASSERT(!value->isObject()); switch (value->type()) { @@ -1248,7 +1248,7 @@ QV4::ReturnedValue RuntimeHelpers::toObject(ExecutionEngine *engine, const QV4:: if (value->isObject()) return value.asReturnedValue(); - Returned *o = RuntimeHelpers::convertToObject(engine, value); + Heap::Object *o = RuntimeHelpers::convertToObject(engine, value); if (!o) // type error return Encode::undefined(); @@ -1296,8 +1296,10 @@ ReturnedValue Runtime::regexpLiteral(ExecutionEngine *engine, int id) ReturnedValue Runtime::getQmlIdArray(NoThrowEngine *engine) { - Q_ASSERT(engine->qmlContextObject()->getPointer()->as()); - return static_cast(engine->qmlContextObject()->getPointer())->idObjectsArray(); + Q_ASSERT(engine->qmlContextObject()); + Scope scope(engine); + Scoped wrapper(scope, engine->qmlContextObject()); + return wrapper->idObjectsArray(); } ReturnedValue Runtime::getQmlContextObject(NoThrowEngine *engine) @@ -1311,7 +1313,7 @@ ReturnedValue Runtime::getQmlContextObject(NoThrowEngine *engine) ReturnedValue Runtime::getQmlScopeObject(NoThrowEngine *engine) { Scope scope(engine); - QV4::Scoped c(scope, engine->qmlContextObject(), Scoped::Cast); + QV4::Scoped c(scope, engine->qmlContextObject()); return QObjectWrapper::wrap(engine, c->getScopeObject()); } @@ -1329,7 +1331,7 @@ ReturnedValue Runtime::getQmlQObjectProperty(ExecutionEngine *engine, const Valu QV4::ReturnedValue Runtime::getQmlAttachedProperty(ExecutionEngine *engine, int attachedPropertiesId, int propertyIndex) { Scope scope(engine); - QV4::Scoped c(scope, engine->qmlContextObject(), Scoped::Cast); + QV4::Scoped c(scope, engine->qmlContextObject()); QObject *scopeObject = c->getScopeObject(); QObject *attachedObject = qmlAttachedPropertiesObjectById(attachedPropertiesId, scopeObject); @@ -1370,7 +1372,9 @@ ReturnedValue Runtime::getQmlImportedScripts(NoThrowEngine *engine) QV4::ReturnedValue Runtime::getQmlSingleton(QV4::NoThrowEngine *engine, String *name) { - return static_cast(engine->qmlContextObject()->getPointer())->qmlSingletonWrapper(engine->v8Engine, name); + Scope scope(engine); + Scoped wrapper(scope, engine->qmlContextObject()); + return wrapper->qmlSingletonWrapper(engine->v8Engine, name); } void Runtime::convertThisToObject(ExecutionEngine *engine) diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h index ea76451760..24971c695a 100644 --- a/src/qml/jsruntime/qv4runtime_p.h +++ b/src/qml/jsruntime/qv4runtime_p.h @@ -229,7 +229,7 @@ struct Q_QML_PRIVATE_EXPORT RuntimeHelpers { static Returned *convertToString(ExecutionEngine *engine, const ValueRef value); static ReturnedValue toObject(ExecutionEngine *engine, const ValueRef value); - static Returned *convertToObject(ExecutionEngine *engine, const ValueRef value); + static Heap::Object *convertToObject(ExecutionEngine *engine, const ValueRef value); static Bool equalHelper(const ValueRef x, const ValueRef y); static Bool strictEqual(const ValueRef x, const ValueRef y); diff --git a/src/qml/jsruntime/qv4value.cpp b/src/qml/jsruntime/qv4value.cpp index 004f7cb6a3..410fa6482e 100644 --- a/src/qml/jsruntime/qv4value.cpp +++ b/src/qml/jsruntime/qv4value.cpp @@ -279,14 +279,14 @@ String *Value::toString(ExecutionContext *ctx) const return toString(ctx->engine()); } -Object *Value::toObject(ExecutionEngine *e) const +Heap::Object *Value::toObject(ExecutionEngine *e) const { if (isObject()) - return objectValue(); - return RuntimeHelpers::convertToObject(e, ValueRef::fromRawValue(this))->getPointer(); + return objectValue()->d(); + return RuntimeHelpers::convertToObject(e, ValueRef::fromRawValue(this)); } -Object *Value::toObject(ExecutionContext *ctx) const +Heap::Object *Value::toObject(ExecutionContext *ctx) const { return toObject(ctx->engine()); } diff --git a/src/qml/jsruntime/qv4value_p.h b/src/qml/jsruntime/qv4value_p.h index 6f62b1cc36..5126d4f0d7 100644 --- a/src/qml/jsruntime/qv4value_p.h +++ b/src/qml/jsruntime/qv4value_p.h @@ -345,8 +345,8 @@ struct Q_QML_PRIVATE_EXPORT Value QString toQString() const; String *toString(ExecutionEngine *e) const; String *toString(ExecutionContext *ctx) const; - Object *toObject(ExecutionEngine *e) const; - Object *toObject(ExecutionContext *ctx) const; + Heap::Object *toObject(ExecutionEngine *e) const; + Heap::Object *toObject(ExecutionContext *ctx) const; inline bool isPrimitive() const; inline bool tryIntegerConversion() { @@ -524,6 +524,11 @@ struct Encode { val = t->getPointer()->asReturnedValue(); } + Encode(Heap::Base *o) { + Q_ASSERT(o); + val = Value::fromHeapObject(o).asReturnedValue(); + } + operator ReturnedValue() const { return val; } diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index a7b5d58583..88a788f014 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -97,7 +97,7 @@ ReturnedValue QmlContextWrapper::urlScope(QV8Engine *v8, const QUrl &url) QQmlContextData *QmlContextWrapper::callingContext(ExecutionEngine *v4) { Scope scope(v4); - QV4::Scoped c(scope, v4->qmlContextObject(), QV4::Scoped::Cast); + QV4::Scoped c(scope, v4->qmlContextObject()); return !!c ? c->getContext() : 0; } @@ -368,7 +368,7 @@ void QmlContextWrapper::registerQmlDependencies(ExecutionEngine *engine, const C return; QV4::Scope scope(engine); - QV4::Scoped contextWrapper(scope, engine->qmlContextObject(), QV4::Scoped::Cast); + QV4::Scoped contextWrapper(scope, engine->qmlContextObject()); QQmlContextData *qmlContext = contextWrapper->getContext(); const quint32 *idObjectDependency = compiledFunction->qmlIdObjectDependencyTable(); -- cgit v1.2.3