diff options
-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()); |