diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-05-06 11:37:53 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-05-06 13:08:58 +0200 |
commit | 0328241012fc2dc00f4384d37184e2ba7525fb39 (patch) | |
tree | 29e9e0b973aef1b47c3981bf219a5cd8dd6c5c54 | |
parent | 92396e11dc810c542fcfd0c60f7949760fe21bac (diff) |
Move the internalClass pointer from Object to Managed
This allows us to get back the ExecutionEngine for all
memeory managed objects, so we can avoid lots of special
handling for String objects.
Simplify and cleanup QV4::PersistentValue and make use
of the available engine pointer in Managed.
Change-Id: Ia2e08b6207f7e706c23be219d5f6e74b414035a3
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/qml/qml/v4/qv4codegen.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4engine.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4managed.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4managed_p.h | 10 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4mm.cpp | 3 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4object.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4object_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4regexp.cpp | 3 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4runtime.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4string.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4string_p.h | 4 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4value.cpp | 37 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4value_p.h | 16 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsengine.cpp | 21 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsvalue.cpp | 76 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsvalue_p.h | 29 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsvalueiterator.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 13 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8qobjectwrapper.cpp | 2 |
19 files changed, 146 insertions, 106 deletions
diff --git a/src/qml/qml/v4/qv4codegen.cpp b/src/qml/qml/v4/qv4codegen.cpp index 6196a03127..2b796b3916 100644 --- a/src/qml/qml/v4/qv4codegen.cpp +++ b/src/qml/qml/v4/qv4codegen.cpp @@ -2113,7 +2113,7 @@ bool Codegen::visit(ObjectLiteral *ast) if (!valueMap.isEmpty()) { V4IR::ExprList *current; for (QMap<QString, ObjectPropertyValue>::iterator it = valueMap.begin(); it != valueMap.end(); ) { - if (QV4::String(it.key()).asArrayIndex() != UINT_MAX) { + if (QV4::String(0, it.key()).asArrayIndex() != UINT_MAX) { ++it; continue; } diff --git a/src/qml/qml/v4/qv4engine.cpp b/src/qml/qml/v4/qv4engine.cpp index 074a8e5b16..a507cab13c 100644 --- a/src/qml/qml/v4/qv4engine.cpp +++ b/src/qml/qml/v4/qv4engine.cpp @@ -374,7 +374,7 @@ Object *ExecutionEngine::newObject(InternalClass *internalClass) String *ExecutionEngine::newString(const QString &s) { - return new (memoryManager) String(s); + return new (memoryManager) String(this, s); } String *ExecutionEngine::newIdentifier(const QString &text) diff --git a/src/qml/qml/v4/qv4managed.cpp b/src/qml/qml/v4/qv4managed.cpp index 8347674664..77e36a780d 100644 --- a/src/qml/qml/v4/qv4managed.cpp +++ b/src/qml/qml/v4/qv4managed.cpp @@ -91,6 +91,11 @@ void Managed::operator delete(void *ptr, MemoryManager *mm) operator delete(ptr); } +ExecutionEngine *Managed::engine() const +{ + return internalClass ? internalClass->engine : 0; +} + QString Managed::className() const { const char *s = 0; diff --git a/src/qml/qml/v4/qv4managed_p.h b/src/qml/qml/v4/qv4managed_p.h index 678c034d26..46030bf4a0 100644 --- a/src/qml/qml/v4/qv4managed_p.h +++ b/src/qml/qml/v4/qv4managed_p.h @@ -56,6 +56,7 @@ struct Object; struct ObjectPrototype; struct ExecutionContext; struct ScriptFunction; +struct InternalClass; struct BooleanObject; struct NumberObject; @@ -72,6 +73,7 @@ struct Managed; struct Value; class RegExp; struct Lookup; +struct ExecutionEngine; struct ManagedVTable { @@ -123,8 +125,8 @@ private: void operator = (const Managed &other); protected: - Managed() - : _data(0), vtbl(&static_vtbl) + Managed(InternalClass *internal) + : _data(0), vtbl(&static_vtbl), internalClass(internal) { inUse = 1; extensible = 1; } public: @@ -159,6 +161,8 @@ public: Type_RegExp }; + ExecutionEngine *engine() const; + String *asString() { return reinterpret_cast<String *>(this); } Object *asObject() { return reinterpret_cast<Object *>(this); } ArrayObject *asArrayObject() { return type == Type_ArrayObject ? reinterpret_cast<ArrayObject *>(this) : 0; } @@ -243,6 +247,8 @@ protected: static const ManagedVTable static_vtbl; const ManagedVTable *vtbl; +public: + InternalClass *internalClass; private: friend class MemoryManager; diff --git a/src/qml/qml/v4/qv4mm.cpp b/src/qml/qml/v4/qv4mm.cpp index 572a90f12e..b59100dd28 100644 --- a/src/qml/qml/v4/qv4mm.cpp +++ b/src/qml/qml/v4/qv4mm.cpp @@ -400,8 +400,7 @@ MemoryManager::~MemoryManager() PersistentValuePrivate *persistent = m_persistentValues; while (persistent) { if (Managed *m = persistent->value.asManaged()) - persistent->value = Value::undefinedValue(); - persistent->engine = 0; + persistent->value = Value::deletedValue(); PersistentValuePrivate *n = persistent->next; persistent->next = 0; persistent = n; diff --git a/src/qml/qml/v4/qv4object.cpp b/src/qml/qml/v4/qv4object.cpp index f5462b696a..19b5146c81 100644 --- a/src/qml/qml/v4/qv4object.cpp +++ b/src/qml/qml/v4/qv4object.cpp @@ -68,8 +68,8 @@ using namespace QV4; DEFINE_MANAGED_VTABLE(Object); Object::Object(ExecutionEngine *engine) - : prototype(0) - , internalClass(engine->emptyClass) + : Managed(engine->emptyClass) + , prototype(0) , memberDataAlloc(InlinePropertySize), memberData(inlineProperties) , arrayOffset(0), arrayDataLen(0), arrayAlloc(0), arrayAttributes(0), arrayData(0), sparseArray(0) , externalResource(0) @@ -79,8 +79,8 @@ Object::Object(ExecutionEngine *engine) } Object::Object(ExecutionContext *context) - : prototype(0) - , internalClass(context->engine->emptyClass) + : Managed(context->engine->emptyClass) + , prototype(0) , memberDataAlloc(InlinePropertySize), memberData(inlineProperties) , arrayOffset(0), arrayDataLen(0), arrayAlloc(0), arrayAttributes(0), arrayData(0), sparseArray(0) , externalResource(0) @@ -90,8 +90,8 @@ Object::Object(ExecutionContext *context) } Object::Object(ExecutionEngine *engine, InternalClass *internalClass) - : prototype(0) - , internalClass(internalClass) + : Managed(internalClass) + , prototype(0) , memberDataAlloc(InlinePropertySize), memberData(inlineProperties) , arrayOffset(0), arrayDataLen(0), arrayAlloc(0), arrayAttributes(0), arrayData(0), sparseArray(0) , externalResource(0) diff --git a/src/qml/qml/v4/qv4object_p.h b/src/qml/qml/v4/qv4object_p.h index aef9367b9e..b8d3b1c23d 100644 --- a/src/qml/qml/v4/qv4object_p.h +++ b/src/qml/qml/v4/qv4object_p.h @@ -108,7 +108,6 @@ struct Q_QML_EXPORT Object: Managed { }; Object *prototype; - InternalClass *internalClass; uint memberDataAlloc; Property *memberData; diff --git a/src/qml/qml/v4/qv4regexp.cpp b/src/qml/qml/v4/qv4regexp.cpp index 0dfbad3c3b..6ea9841471 100644 --- a/src/qml/qml/v4/qv4regexp.cpp +++ b/src/qml/qml/v4/qv4regexp.cpp @@ -92,7 +92,8 @@ RegExp* RegExp::create(ExecutionEngine* engine, const QString& pattern, bool ign } RegExp::RegExp(ExecutionEngine* engine, const QString &pattern, bool ignoreCase, bool multiline) - : m_pattern(pattern) + : Managed(engine->emptyClass) + , m_pattern(pattern) , m_cache(0) , m_subPatternCount(0) , m_ignoreCase(ignoreCase) diff --git a/src/qml/qml/v4/qv4runtime.cpp b/src/qml/qml/v4/qv4runtime.cpp index b85fbebd06..d21399a481 100644 --- a/src/qml/qml/v4/qv4runtime.cpp +++ b/src/qml/qml/v4/qv4runtime.cpp @@ -69,7 +69,7 @@ using namespace QV4; Exception::Exception(ExecutionContext *throwingContext, const Value &exceptionValue) - : exception(PersistentValue(throwingContext->engine, exceptionValue)) + : exception(exceptionValue) { this->throwingContext = throwingContext->engine->current; accepted = false; diff --git a/src/qml/qml/v4/qv4string.cpp b/src/qml/qml/v4/qv4string.cpp index 9288afdc74..41682121f0 100644 --- a/src/qml/qml/v4/qv4string.cpp +++ b/src/qml/qml/v4/qv4string.cpp @@ -174,6 +174,14 @@ bool String::deleteIndexedProperty(Managed *m, ExecutionContext *ctx, uint index return false; } +String::String(ExecutionEngine *engine, const QString &text) + : Managed(engine ? engine->emptyClass : 0), _text(text), stringHash(UINT_MAX), identifier(UINT_MAX) +{ + vtbl = &static_vtbl; + type = Type_String; + subtype = StringType_Unknown; +} + uint String::toUInt(bool *ok) const { *ok = true; diff --git a/src/qml/qml/v4/qv4string_p.h b/src/qml/qml/v4/qv4string_p.h index a681330a0a..f5864fc9f4 100644 --- a/src/qml/qml/v4/qv4string_p.h +++ b/src/qml/qml/v4/qv4string_p.h @@ -58,9 +58,9 @@ struct String : public Managed { StringType_ArrayIndex }; - String(const QString &text) - : _text(text), stringHash(UINT_MAX), identifier(UINT_MAX) + String() : Managed(0), stringHash(UINT_MAX), identifier(UINT_MAX) { vtbl = &static_vtbl; type = Type_String; subtype = StringType_Unknown; } + String(ExecutionEngine *engine, const QString &text); ~String() { _data = 0; } inline bool isEqualTo(const String *other) const { diff --git a/src/qml/qml/v4/qv4value.cpp b/src/qml/qml/v4/qv4value.cpp index 6722e4d39f..7e2f164ed9 100644 --- a/src/qml/qml/v4/qv4value.cpp +++ b/src/qml/qml/v4/qv4value.cpp @@ -222,8 +222,8 @@ PersistentValue::PersistentValue() { } -PersistentValue::PersistentValue(ExecutionEngine *e, const Value &val) - : d(new PersistentValuePrivate(e, val)) +PersistentValue::PersistentValue(const Value &val) + : d(new PersistentValuePrivate(val)) { } @@ -244,6 +244,11 @@ PersistentValue &PersistentValue::operator=(const PersistentValue &other) d->ref(); } +PersistentValue &PersistentValue::operator =(const Value &other) +{ + d->value = other; +} + PersistentValue::~PersistentValue() { d->deref(); @@ -252,26 +257,26 @@ PersistentValue::~PersistentValue() PersistentValuePrivate::PersistentValuePrivate(const Value &v) : value(v) , refcount(1) - , engine(0) , next(0) { - assert(!v.asManaged()); -} - - -PersistentValuePrivate::PersistentValuePrivate(ExecutionEngine *e, const Value &v) - : value(v) - , refcount(1) - , engine(e) - , next(engine->memoryManager->m_persistentValues) -{ - engine->memoryManager->m_persistentValues = this; + if (Managed *m = v.asManaged()) { + ExecutionEngine *engine = m->engine(); + if (engine) { + next = engine->memoryManager->m_persistentValues; + engine->memoryManager->m_persistentValues = this; + } + } } void PersistentValuePrivate::deref() { // if engine is not 0, they are registered with the memory manager // and will get cleaned up in the next gc run - if (!--refcount && !engine) - delete this; + if (!--refcount && !next) { + ExecutionEngine *e = 0; + if (Managed *m = value.asManaged()) + e = m->engine(); + if (!e) + delete this; + } } diff --git a/src/qml/qml/v4/qv4value_p.h b/src/qml/qml/v4/qv4value_p.h index 6207458985..fb6393588c 100644 --- a/src/qml/qml/v4/qv4value_p.h +++ b/src/qml/qml/v4/qv4value_p.h @@ -274,6 +274,11 @@ struct Q_QML_EXPORT Value Value property(ExecutionContext *ctx, String *name) const; + ExecutionEngine *engine() const { + Managed *m = asManaged(); + return m ? m->engine() : 0; + } + // Section 9.12 bool sameValue(Value other) const; @@ -549,14 +554,11 @@ struct PersistentValuePrivate PersistentValuePrivate() : value(Value::undefinedValue()) , refcount(1) - , engine(0) , next(0) {} - PersistentValuePrivate(ExecutionEngine *e, const Value &v); PersistentValuePrivate(const Value &v); Value value; int refcount; - ExecutionEngine *engine; PersistentValuePrivate *next; void ref() { ++refcount; } @@ -567,14 +569,20 @@ class PersistentValue { public: PersistentValue(); - PersistentValue(ExecutionEngine *e, const Value &val); + PersistentValue(const Value &val); PersistentValue(const PersistentValue &other); PersistentValue &operator=(const PersistentValue &other); + PersistentValue &operator=(const Value &other); ~PersistentValue(); Value *operator->() { return &d->value; } Value *operator*() { return &d->value; } + ExecutionEngine *engine() { + Managed *m = d->value.asManaged(); + return m ? m->engine() : 0; + } + operator Value() const { return d->value; } private: diff --git a/src/qml/qml/v8/qjsengine.cpp b/src/qml/qml/v8/qjsengine.cpp index b5dc1d19a6..39aae969b9 100644 --- a/src/qml/qml/v8/qjsengine.cpp +++ b/src/qml/qml/v8/qjsengine.cpp @@ -254,17 +254,18 @@ void QJSEngine::collectGarbage() */ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) { + QV4::ExecutionContext *ctx = d->m_v4Engine->current; try { - QV4::Function *f = QV4::EvalFunction::parseSource(d->m_v4Engine->current, fileName, program, QQmlJS::Codegen::EvalCode, - d->m_v4Engine->current->strictMode, true); + QV4::Function *f = QV4::EvalFunction::parseSource(ctx, fileName, program, QQmlJS::Codegen::EvalCode, + d->m_v4Engine->current->strictMode, true); if (!f) return QJSValue(); QV4::Value result = d->m_v4Engine->run(f); - return new QJSValuePrivate(d->m_v4Engine, result); + return new QJSValuePrivate(result); } catch (QV4::Exception& ex) { - ex.accept(d->m_v4Engine->current); - return new QJSValuePrivate(d->m_v4Engine, ex.value()); + ex.accept(ctx); + return new QJSValuePrivate(ex.value()); } } @@ -278,7 +279,7 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in */ QJSValue QJSEngine::newObject() { - return new QJSValuePrivate(d->m_v4Engine, d->m_v4Engine->newObject()); + return new QJSValuePrivate(d->m_v4Engine->newObject()); } /*! @@ -292,7 +293,7 @@ QJSValue QJSEngine::newArray(uint length) if (length < 0x1000) array->arrayReserve(length); array->setArrayLengthUnchecked(length); - return new QJSValuePrivate(d->m_v4Engine, array); + return new QJSValuePrivate(array); } /*! @@ -334,7 +335,7 @@ QJSValue QJSEngine::newQObject(QObject *object) */ QJSValue QJSEngine::globalObject() const { - return new QJSValuePrivate(d->m_v4Engine, d->m_v4Engine->globalObject); + return new QJSValuePrivate(d->m_v4Engine->globalObject); } /*! @@ -344,7 +345,7 @@ QJSValue QJSEngine::globalObject() const QJSValue QJSEngine::create(int type, const void *ptr) { Q_D(QJSEngine); - return new QJSValuePrivate(QV8Engine::getV4(d), d->metaTypeToJS(type, ptr)); + return new QJSValuePrivate(d->metaTypeToJS(type, ptr)); } /*! @@ -354,7 +355,7 @@ QJSValue QJSEngine::create(int type, const void *ptr) bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) { QJSValuePrivate *vp = QJSValuePrivate::get(value); - QV4::ExecutionEngine *e = vp->engine; + QV4::ExecutionEngine *e = vp->engine(); QV8Engine *engine = e ? QV8Engine::get(e->publicEngine) : 0; if (engine) { return engine->metaTypeFromJS(vp->getValue(engine->m_v4Engine), type, ptr); diff --git a/src/qml/qml/v8/qjsvalue.cpp b/src/qml/qml/v8/qjsvalue.cpp index 839bdab197..ed75edcd5e 100644 --- a/src/qml/qml/v8/qjsvalue.cpp +++ b/src/qml/qml/v8/qjsvalue.cpp @@ -352,7 +352,8 @@ QString QJSValue::toString() const */ double QJSValue::toNumber() const { - QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0; + QV4::ExecutionEngine *e = d->engine(); + QV4::ExecutionContext *ctx = e ? e->current : 0; try { return d->value.toNumber(); } catch (Exception &e) { @@ -375,7 +376,8 @@ double QJSValue::toNumber() const */ bool QJSValue::toBool() const { - QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0; + QV4::ExecutionEngine *e = d->engine(); + QV4::ExecutionContext *ctx = e ? e->current : 0; try { return d->value.toBoolean(); } catch (Exception &e) { @@ -398,7 +400,8 @@ bool QJSValue::toBool() const */ qint32 QJSValue::toInt() const { - QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0; + QV4::ExecutionEngine *e = d->engine(); + QV4::ExecutionContext *ctx = e ? e->current : 0; try { return d->value.toInt32(); } catch (Exception &e) { @@ -421,7 +424,8 @@ qint32 QJSValue::toInt() const */ quint32 QJSValue::toUInt() const { - QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0; + QV4::ExecutionEngine *e = d->engine(); + QV4::ExecutionContext *ctx = e ? e->current : 0; try { return d->value.toUInt32(); } catch (Exception &e) { @@ -479,7 +483,7 @@ QJSValue QJSValue::call(const QJSValueList &args) if (!f) return QJSValue(); - ExecutionEngine *engine = d->engine; + ExecutionEngine *engine = d->engine(); assert(engine); QVarLengthArray<Value> arguments(args.length()); @@ -487,15 +491,15 @@ QJSValue QJSValue::call(const QJSValueList &args) arguments[i] = args.at(i).d->getValue(engine); Value result; - QV4::ExecutionContext *ctx = d->engine->current; + QV4::ExecutionContext *ctx = engine->current; try { - result = f->call(ctx, Value::fromObject(d->engine->globalObject), arguments.data(), arguments.size()); + result = f->call(ctx, Value::fromObject(engine->globalObject), arguments.data(), arguments.size()); } catch (Exception &e) { e.accept(ctx); result = e.value(); } - return new QJSValuePrivate(engine, result); + return new QJSValuePrivate(result); } /*! @@ -524,7 +528,7 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList if (!f) return QJSValue(); - ExecutionEngine *engine = d->engine; + ExecutionEngine *engine = d->engine(); assert(engine); QVarLengthArray<Value> arguments(args.length()); @@ -532,7 +536,7 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList arguments[i] = args.at(i).d->getValue(engine); Value result; - QV4::ExecutionContext *ctx = d->engine->current; + QV4::ExecutionContext *ctx = engine->current; try { result = f->call(ctx, instance.d->getValue(engine), arguments.data(), arguments.size()); } catch (Exception &e) { @@ -540,7 +544,7 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList result = e.value(); } - return new QJSValuePrivate(engine, result); + return new QJSValuePrivate(result); } /*! @@ -567,7 +571,7 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args) if (!f) return QJSValue(); - ExecutionEngine *engine = d->engine; + ExecutionEngine *engine = d->engine(); assert(engine); QVarLengthArray<Value> arguments(args.length()); @@ -575,7 +579,7 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args) arguments[i] = args.at(i).d->getValue(engine); Value result; - QV4::ExecutionContext *ctx = d->engine->current; + QV4::ExecutionContext *ctx = engine->current; try { result = f->construct(ctx, arguments.data(), arguments.size()); } catch (Exception &e) { @@ -583,7 +587,7 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args) result = e.value(); } - return new QJSValuePrivate(engine, result); + return new QJSValuePrivate(result); } #ifdef QT_DEPRECATED @@ -597,8 +601,9 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args) */ QJSEngine* QJSValue::engine() const { - if (d->engine) - return d->engine->publicEngine; + QV4::ExecutionEngine *engine = d->engine(); + if (engine) + return engine->publicEngine; } #endif // QT_DEPRECATED @@ -615,7 +620,7 @@ QJSValue QJSValue::prototype() const Object *o = d->value.asObject(); if (!o) return QJSValue(); - return new QJSValuePrivate(d->engine, Value::fromObject(o->prototype)); + return new QJSValuePrivate(Value::fromObject(o->prototype)); } /*! @@ -731,16 +736,17 @@ QJSValue QJSValue::property(const QString& name) const if (!o) return QJSValue(); - String *s = d->engine->newString(name); + ExecutionEngine *engine = d->engine(); + String *s = engine->newString(name); uint idx = s->asArrayIndex(); if (idx < UINT_MAX) return property(idx); - s->makeIdentifier(d->engine->current); - QV4::ExecutionContext *ctx = d->engine->current; + s->makeIdentifier(engine->current); + QV4::ExecutionContext *ctx = engine->current; try { QV4::Value v = o->get(ctx, s); - return new QJSValuePrivate(d->engine, v); + return new QJSValuePrivate(v); } catch (QV4::Exception &e) { e.accept(ctx); return QJSValue(); @@ -765,10 +771,11 @@ QJSValue QJSValue::property(quint32 arrayIndex) const if (!o) return QJSValue(); - QV4::ExecutionContext *ctx = d->engine->current; + ExecutionEngine *engine = d->engine(); + QV4::ExecutionContext *ctx = engine->current; try { - QV4::Value v = arrayIndex == UINT_MAX ? o->get(ctx, ctx->engine->id_uintMax) : o->getIndexed(ctx, arrayIndex); - return new QJSValuePrivate(d->engine, v); + QV4::Value v = arrayIndex == UINT_MAX ? o->get(ctx, engine->id_uintMax) : o->getIndexed(ctx, arrayIndex); + return new QJSValuePrivate(v); } catch (QV4::Exception &e) { e.accept(ctx); return QJSValue(); @@ -792,14 +799,15 @@ void QJSValue::setProperty(const QString& name, const QJSValue& value) if (!o) return; - String *s = d->engine->newString(name); + ExecutionEngine *engine = d->engine(); + String *s = engine->newString(name); uint idx = s->asArrayIndex(); if (idx < UINT_MAX) { setProperty(idx, value); return; } - QV4::ExecutionContext *ctx = d->engine->current; + QV4::ExecutionContext *ctx = engine->current; s->makeIdentifier(ctx); try { o->put(ctx, s, value.d->value); @@ -826,12 +834,13 @@ void QJSValue::setProperty(quint32 arrayIndex, const QJSValue& value) if (!o) return; - QV4::ExecutionContext *ctx = d->engine->current; + ExecutionEngine *engine = d->engine(); + QV4::ExecutionContext *ctx = engine->current; try { if (arrayIndex != UINT_MAX) o->putIndexed(ctx, arrayIndex, value.d->value); else - o->put(ctx, ctx->engine->id_uintMax, value.d->value); + o->put(ctx, engine->id_uintMax, value.d->value); } catch (QV4::Exception &e) { e.accept(ctx); } @@ -863,8 +872,9 @@ bool QJSValue::deleteProperty(const QString &name) if (!o) return false; - String *s = d->engine->newIdentifier(name); - return o->deleteProperty(d->engine->current, s); + ExecutionEngine *engine = d->engine(); + String *s = engine->newIdentifier(name); + return o->deleteProperty(engine->current, s); } /*! @@ -879,7 +889,8 @@ bool QJSValue::hasProperty(const QString &name) const if (!o) return false; - String *s = d->engine->newIdentifier(name); + ExecutionEngine *engine = d->engine(); + String *s = engine->newIdentifier(name); return o->__hasProperty__(s); } @@ -895,7 +906,8 @@ bool QJSValue::hasOwnProperty(const QString &name) const if (!o) return false; - String *s = d->engine->newIdentifier(name); + ExecutionEngine *engine = d->engine(); + String *s = engine->newIdentifier(name); return o->__getOwnProperty__(s); } diff --git a/src/qml/qml/v8/qjsvalue_p.h b/src/qml/qml/v8/qjsvalue_p.h index c085f39d50..441ab1a04a 100644 --- a/src/qml/qml/v8/qjsvalue_p.h +++ b/src/qml/qml/v8/qjsvalue_p.h @@ -67,40 +67,35 @@ QT_BEGIN_NAMESPACE class QJSValuePrivate : public QV4::PersistentValuePrivate { public: - QJSValuePrivate(QV4::ExecutionEngine *e, const QV4::Value &v) - : PersistentValuePrivate(e, v) - , string(QString()) + QJSValuePrivate(const QV4::Value &v) + : PersistentValuePrivate(v) { if (value.isDeleted()) value = QV4::Value::undefinedValue(); } - QJSValuePrivate(QV4::ExecutionEngine *e, QV4::Object *o) - : PersistentValuePrivate(e, QV4::Value::fromObject(o)) - , string(QString()) + QJSValuePrivate(QV4::Object *o) + : PersistentValuePrivate(QV4::Value::fromObject(o)) {} - QJSValuePrivate(QV4::ExecutionEngine *e, QV4::String *s) - : PersistentValuePrivate(e, QV4::Value::fromString(s)) - , string(QString()) - {} - QJSValuePrivate(const QV4::Value &v) - : PersistentValuePrivate(v) - , string(QString()) + QJSValuePrivate(QV4::String *s) + : PersistentValuePrivate(QV4::Value::fromString(s)) {} QJSValuePrivate(const QString &s) : PersistentValuePrivate() - , string(s) + , string(0, s) { value = QV4::Value::fromString(&string); } QV4::Value getValue(QV4::ExecutionEngine *e) { - if (value.asString() == &string) { - engine = e; + if (value.asString() == &string) value = QV4::Value::fromString(e->newString(string.toQString())); - } return value; } + QV4::ExecutionEngine *engine() const { + return value.engine(); + } + static QJSValuePrivate *get(const QJSValue &v) { return v.d; } QV4::String string; diff --git a/src/qml/qml/v8/qjsvalueiterator.cpp b/src/qml/qml/v8/qjsvalueiterator.cpp index ecc2cd7c2d..a547918a09 100644 --- a/src/qml/qml/v8/qjsvalueiterator.cpp +++ b/src/qml/qml/v8/qjsvalueiterator.cpp @@ -176,10 +176,12 @@ QJSValue QJSValueIterator::value() const return QJSValue(); QV4::Object *o = d_ptr->iterator.object; + QV4::ExecutionContext *ctx = o->internalClass->engine->current; try { - QV4::Value v = o->getValue(o->internalClass->engine->current, d_ptr->currentValue, d_ptr->currentAttributes); - return new QJSValuePrivate(o->internalClass->engine, v); + QV4::Value v = o->getValue(ctx, d_ptr->currentValue, d_ptr->currentAttributes); + return new QJSValuePrivate(v); } catch (QV4::Exception &e) { + e.accept(ctx); return QJSValue(); } } diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 5295ff9a96..de1637cb68 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -150,7 +150,7 @@ QV8Engine::QV8Engine(QJSEngine* qq) QV8GCCallback::registerGcPrologueCallback(); m_strongReferencer = qPersistentNew(v8::Object::New()); - m_bindingFlagKey = QV4::PersistentValue(m_v4Engine, QV4::Value::fromString(m_v4Engine->current, QStringLiteral("qml::binding"))); + m_bindingFlagKey = QV4::Value::fromString(m_v4Engine->current, QStringLiteral("qml::binding")); m_contextWrapper.init(this); m_qobjectWrapper.init(this); @@ -383,8 +383,7 @@ QV4::Value QV8Engine::fromVariant(const QVariant &variant) } else if (type == qMetaTypeId<QJSValue>()) { const QJSValue *value = reinterpret_cast<const QJSValue *>(ptr); QJSValuePrivate *valuep = QJSValuePrivate::get(*value); - valuep->engine = m_v4Engine; - return valuep->getValue(valuep->engine); + return valuep->getValue(m_v4Engine); } else if (type == qMetaTypeId<QList<QObject *> >()) { // XXX Can this be made more by using Array as a prototype and implementing // directly against QList<QObject*>? @@ -677,7 +676,7 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global) QV4::Value result = evaluateScript(QStringLiteral(FREEZE_SOURCE), 0); Q_ASSERT(result.asFunctionObject()); - m_freezeObject = QV4::PersistentValue(m_v4Engine, result); + m_freezeObject = result; #undef FREEZE_SOURCE } } @@ -1226,7 +1225,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::Value &value, int type, void *data) { *reinterpret_cast<void* *>(data) = 0; return true; } else if (type == qMetaTypeId<QJSValue>()) { - *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(m_v4Engine, value)); + *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(value)); return true; } @@ -1348,12 +1347,12 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::Value &value) QJSValue QV8Engine::scriptValueFromInternal(const QV4::Value &value) const { - return new QJSValuePrivate(m_v4Engine, value); + return new QJSValuePrivate(value); } QJSValue QV8Engine::newArray(uint length) { - return new QJSValuePrivate(m_v4Engine, v8::Array::New(length).get()->v4Value()); + return new QJSValuePrivate(v8::Array::New(length).get()->v4Value()); } void QV8Engine::startTimer(const QString &timerName) diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp index 6fe8721e5c..e863747c92 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -2141,7 +2141,7 @@ void CallArgument::fromValue(int callType, QV8Engine *engine, v8::Handle<v8::Val if (type != 0) { cleanup(); type = 0; } if (callType == qMetaTypeId<QJSValue>()) { - qjsValuePtr = new (&allocData) QJSValue(new QJSValuePrivate(QV8Engine::getV4(engine), value.get()->v4Value())); + qjsValuePtr = new (&allocData) QJSValue(new QJSValuePrivate(value.get()->v4Value())); type = qMetaTypeId<QJSValue>(); } else if (callType == QMetaType::Int) { intValue = quint32(value->Int32Value()); |