aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-05-06 11:37:53 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-05-06 13:08:58 +0200
commit0328241012fc2dc00f4384d37184e2ba7525fb39 (patch)
tree29e9e0b973aef1b47c3981bf219a5cd8dd6c5c54
parent92396e11dc810c542fcfd0c60f7949760fe21bac (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.cpp2
-rw-r--r--src/qml/qml/v4/qv4engine.cpp2
-rw-r--r--src/qml/qml/v4/qv4managed.cpp5
-rw-r--r--src/qml/qml/v4/qv4managed_p.h10
-rw-r--r--src/qml/qml/v4/qv4mm.cpp3
-rw-r--r--src/qml/qml/v4/qv4object.cpp12
-rw-r--r--src/qml/qml/v4/qv4object_p.h1
-rw-r--r--src/qml/qml/v4/qv4regexp.cpp3
-rw-r--r--src/qml/qml/v4/qv4runtime.cpp2
-rw-r--r--src/qml/qml/v4/qv4string.cpp8
-rw-r--r--src/qml/qml/v4/qv4string_p.h4
-rw-r--r--src/qml/qml/v4/qv4value.cpp37
-rw-r--r--src/qml/qml/v4/qv4value_p.h16
-rw-r--r--src/qml/qml/v8/qjsengine.cpp21
-rw-r--r--src/qml/qml/v8/qjsvalue.cpp76
-rw-r--r--src/qml/qml/v8/qjsvalue_p.h29
-rw-r--r--src/qml/qml/v8/qjsvalueiterator.cpp6
-rw-r--r--src/qml/qml/v8/qv8engine.cpp13
-rw-r--r--src/qml/qml/v8/qv8qobjectwrapper.cpp2
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());