diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-05-13 18:07:44 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-05-17 23:47:49 +0200 |
commit | 6b8160e323bd366ac383101955c8a7ba67a8a14d (patch) | |
tree | c4758c6a316655afe7bb86a3c5a9dc2e426c9574 /src | |
parent | f55d88fec958ec88a1b0912380a9bc44280be227 (diff) |
Give the QJSValuePrivate the pointer to the engine back
Unfortunately the value needs a pointer back to the engine, to keep
compatibility with the old code and have our tests pass unmodified.
Change-Id: Ibe26e6c770bd8d26dad4a26d42b40e3e1af4996c
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/v8/qjsengine.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsvalue.cpp | 22 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsvalue_p.h | 16 | ||||
-rw-r--r-- | src/qml/qml/v8/qjsvalueiterator.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8qobjectwrapper.cpp | 2 |
6 files changed, 33 insertions, 24 deletions
diff --git a/src/qml/qml/v8/qjsengine.cpp b/src/qml/qml/v8/qjsengine.cpp index 39aae969b9..754a67ebe0 100644 --- a/src/qml/qml/v8/qjsengine.cpp +++ b/src/qml/qml/v8/qjsengine.cpp @@ -262,10 +262,10 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in return QJSValue(); QV4::Value result = d->m_v4Engine->run(f); - return new QJSValuePrivate(result); + return new QJSValuePrivate(d->m_v4Engine, result); } catch (QV4::Exception& ex) { ex.accept(ctx); - return new QJSValuePrivate(ex.value()); + return new QJSValuePrivate(d->m_v4Engine, ex.value()); } } @@ -345,7 +345,7 @@ QJSValue QJSEngine::globalObject() const QJSValue QJSEngine::create(int type, const void *ptr) { Q_D(QJSEngine); - return new QJSValuePrivate(d->metaTypeToJS(type, ptr)); + return new QJSValuePrivate(d->m_v4Engine, d->metaTypeToJS(type, ptr)); } /*! diff --git a/src/qml/qml/v8/qjsvalue.cpp b/src/qml/qml/v8/qjsvalue.cpp index ed75edcd5e..293e32fb28 100644 --- a/src/qml/qml/v8/qjsvalue.cpp +++ b/src/qml/qml/v8/qjsvalue.cpp @@ -124,7 +124,7 @@ using namespace QV4; Constructs a new QJSValue with a boolean \a value. */ QJSValue::QJSValue(bool value) - : d(new QJSValuePrivate(Value::fromBoolean(value))) + : d(new QJSValuePrivate(0, Value::fromBoolean(value))) { } @@ -137,7 +137,7 @@ QJSValue::QJSValue(QJSValuePrivate *dd) Constructs a new QJSValue with a number \a value. */ QJSValue::QJSValue(int value) - : d(new QJSValuePrivate(Value::fromInt32(value))) + : d(new QJSValuePrivate(0, Value::fromInt32(value))) { } @@ -145,7 +145,7 @@ QJSValue::QJSValue(int value) Constructs a new QJSValue with a number \a value. */ QJSValue::QJSValue(uint value) - : d(new QJSValuePrivate(Value::fromUInt32(value))) + : d(new QJSValuePrivate(0, Value::fromUInt32(value))) { } @@ -153,7 +153,7 @@ QJSValue::QJSValue(uint value) Constructs a new QJSValue with a number \a value. */ QJSValue::QJSValue(double value) - : d(new QJSValuePrivate(Value::fromDouble(value))) + : d(new QJSValuePrivate(0, Value::fromDouble(value))) { } @@ -169,7 +169,7 @@ QJSValue::QJSValue(const QString& value) Constructs a new QJSValue with a special \a value. */ QJSValue::QJSValue(SpecialValue value) - : d(new QJSValuePrivate(value == UndefinedValue ? Value::undefinedValue() : Value::nullValue())) + : d(new QJSValuePrivate(0, value == UndefinedValue ? Value::undefinedValue() : Value::nullValue())) { } @@ -499,7 +499,7 @@ QJSValue QJSValue::call(const QJSValueList &args) result = e.value(); } - return new QJSValuePrivate(result); + return new QJSValuePrivate(engine, result); } /*! @@ -544,7 +544,7 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList result = e.value(); } - return new QJSValuePrivate(result); + return new QJSValuePrivate(engine, result); } /*! @@ -587,7 +587,7 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args) result = e.value(); } - return new QJSValuePrivate(result); + return new QJSValuePrivate(engine, result); } #ifdef QT_DEPRECATED @@ -620,7 +620,7 @@ QJSValue QJSValue::prototype() const Object *o = d->value.asObject(); if (!o) return QJSValue(); - return new QJSValuePrivate(Value::fromObject(o->prototype)); + return new QJSValuePrivate(o->internalClass->engine, Value::fromObject(o->prototype)); } /*! @@ -746,7 +746,7 @@ QJSValue QJSValue::property(const QString& name) const QV4::ExecutionContext *ctx = engine->current; try { QV4::Value v = o->get(ctx, s); - return new QJSValuePrivate(v); + return new QJSValuePrivate(engine, v); } catch (QV4::Exception &e) { e.accept(ctx); return QJSValue(); @@ -775,7 +775,7 @@ QJSValue QJSValue::property(quint32 arrayIndex) const QV4::ExecutionContext *ctx = engine->current; try { QV4::Value v = arrayIndex == UINT_MAX ? o->get(ctx, engine->id_uintMax) : o->getIndexed(ctx, arrayIndex); - return new QJSValuePrivate(v); + return new QJSValuePrivate(engine, v); } catch (QV4::Exception &e) { e.accept(ctx); return QJSValue(); diff --git a/src/qml/qml/v8/qjsvalue_p.h b/src/qml/qml/v8/qjsvalue_p.h index db30ad8c92..cf1148f54e 100644 --- a/src/qml/qml/v8/qjsvalue_p.h +++ b/src/qml/qml/v8/qjsvalue_p.h @@ -57,6 +57,7 @@ #include <private/qv4value_p.h> #include <private/qv4string_p.h> #include <private/qv4engine_p.h> +#include <private/qv4object_p.h> QT_BEGIN_NAMESPACE @@ -67,38 +68,45 @@ QT_BEGIN_NAMESPACE class QJSValuePrivate : public QV4::PersistentValuePrivate { public: - QJSValuePrivate(const QV4::Value &v) + QJSValuePrivate(QV4::ExecutionEngine *engine, const QV4::Value &v) : PersistentValuePrivate(v) + , e(engine) { if (value.isEmpty()) value = QV4::Value::undefinedValue(); } QJSValuePrivate(QV4::Object *o) : PersistentValuePrivate(QV4::Value::fromObject(o)) - {} + { e = o->engine(); } QJSValuePrivate(QV4::String *s) : PersistentValuePrivate(QV4::Value::fromString(s)) - {} + { e = s->engine(); } QJSValuePrivate(const QString &s) : PersistentValuePrivate(QV4::Value::undefinedValue()) , string(0, s) + , e(0) { value = QV4::Value::fromString(&string); } QV4::Value getValue(QV4::ExecutionEngine *e) { + if (!this->e) + this->e = e; if (value.asString() == &string) value = QV4::Value::fromString(e->newString(string.toQString())); return value; } QV4::ExecutionEngine *engine() const { - return value.engine(); + if (!e) + e = value.engine(); + return e; } static QJSValuePrivate *get(const QJSValue &v) { return v.d; } QV4::String string; + mutable QV4::ExecutionEngine *e; }; QT_END_NAMESPACE diff --git a/src/qml/qml/v8/qjsvalueiterator.cpp b/src/qml/qml/v8/qjsvalueiterator.cpp index 555cbf0215..6f09bc793c 100644 --- a/src/qml/qml/v8/qjsvalueiterator.cpp +++ b/src/qml/qml/v8/qjsvalueiterator.cpp @@ -177,10 +177,11 @@ QJSValue QJSValueIterator::value() const return QJSValue(); QV4::Object *o = d_ptr->iterator.object; - QV4::ExecutionContext *ctx = o->internalClass->engine->current; + QV4::ExecutionEngine *engine = o->internalClass->engine; + QV4::ExecutionContext *ctx = engine->current; try { QV4::Value v = o->getValue(ctx, d_ptr->currentValue, d_ptr->currentAttributes); - return new QJSValuePrivate(v); + return new QJSValuePrivate(engine, 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 01768d66d6..88e9adf06b 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -1225,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(value)); + *reinterpret_cast<QJSValue*>(data) = QJSValuePrivate::get(new QJSValuePrivate(m_v4Engine, value)); return true; } @@ -1347,12 +1347,12 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::Value &value) QJSValue QV8Engine::scriptValueFromInternal(const QV4::Value &value) const { - return new QJSValuePrivate(value); + return new QJSValuePrivate(m_v4Engine, value); } QJSValue QV8Engine::newArray(uint length) { - return new QJSValuePrivate(v8::Array::New(length).get()->v4Value()); + return new QJSValuePrivate(m_v4Engine, 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 a0d866b6ac..d061d503fb 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -2129,7 +2129,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(value.get()->v4Value())); + qjsValuePtr = new (&allocData) QJSValue(new QJSValuePrivate(QV8Engine::getV4(engine), value.get()->v4Value())); type = qMetaTypeId<QJSValue>(); } else if (callType == QMetaType::Int) { intValue = quint32(value->Int32Value()); |