aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/v8/qjsengine.cpp6
-rw-r--r--src/qml/qml/v8/qjsvalue.cpp22
-rw-r--r--src/qml/qml/v8/qjsvalue_p.h16
-rw-r--r--src/qml/qml/v8/qjsvalueiterator.cpp5
-rw-r--r--src/qml/qml/v8/qv8engine.cpp6
-rw-r--r--src/qml/qml/v8/qv8qobjectwrapper.cpp2
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());