}
WeakValue::WeakValue(const Value &val)
- : d(new PersistentValuePrivate(val, /*weak*/true))
+ : d(new PersistentValuePrivate(val, /*engine*/0, /*weak*/true))
{
}
WeakValue &WeakValue::operator =(const Value &other)
{
if (!d) {
- d = new PersistentValuePrivate(other, /*weak*/true);
+ d = new PersistentValuePrivate(other, /*engine*/0, /*weak*/true);
return *this;
}
d = d->detach(other, /*weak*/true);
m->mark();
}
-PersistentValuePrivate::PersistentValuePrivate(const Value &v, bool weak)
+PersistentValuePrivate::PersistentValuePrivate(const Value &v, ExecutionEngine *e, bool weak)
: value(v)
, refcount(1)
, prev(0)
, next(0)
+ , engine(e)
{
- Managed *m = v.asManaged();
- if (!m)
- return;
+ if (!engine) {
+ Managed *m = v.asManaged();
+ if (!m)
+ return;
- ExecutionEngine *engine = m->engine();
+ engine = m->engine();
+ }
if (engine) {
PersistentValuePrivate **listRoot = weak ? &engine->memoryManager->m_weakValues : &engine->memoryManager->m_persistentValues;
return this;
}
--refcount;
- return new PersistentValuePrivate(value, weak);
+ return new PersistentValuePrivate(value, engine, weak);
}
struct PersistentValuePrivate
{
- PersistentValuePrivate(const Value &v, bool weak = false);
+ PersistentValuePrivate(const Value &v, ExecutionEngine *engine = 0, bool weak = false);
virtual ~PersistentValuePrivate();
Value value;
uint refcount;
+ QV4::ExecutionEngine *engine;
PersistentValuePrivate **prev;
PersistentValuePrivate *next;
void ref() { ++refcount; }
void deref();
PersistentValuePrivate *detach(const QV4::Value &value, bool weak = false);
+
+ bool checkEngine(QV4::ExecutionEngine *otherEngine) {
+ if (!engine) {
+ Q_ASSERT(!value.isObject());
+ engine = otherEngine;
+ }
+ return (engine == otherEngine);
+ }
};
class Q_QML_EXPORT PersistentValue
QV4::Value QJSValuePrivate::getValue(QV4::ExecutionEngine *e)
{
- if (!this->e)
- this->e = e;
- else if (this->e != e) {
+ if (!this->engine)
+ this->engine = e;
+ else if (this->engine != e) {
qWarning("JSValue can't be reassigned to another engine.");
return QV4::Value::emptyValue();
}
if (value.asString() == &string) {
- value = QV4::Value::fromString(e->newString(string.toQString()));
- PersistentValuePrivate **listRoot = &e->memoryManager->m_persistentValues;
+ value = QV4::Value::fromString(engine->newString(string.toQString()));
+ PersistentValuePrivate **listRoot = &engine->memoryManager->m_persistentValues;
prev = listRoot;
next = *listRoot;
*prev = this;
*/
double QJSValue::toNumber() const
{
- QV4::ExecutionEngine *e = d->engine();
- QV4::ExecutionContext *ctx = e ? e->current : 0;
+ QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0;
try {
return d->value.toNumber();
} catch (Exception &e) {
*/
bool QJSValue::toBool() const
{
- QV4::ExecutionEngine *e = d->engine();
- QV4::ExecutionContext *ctx = e ? e->current : 0;
+ QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0;
try {
return d->value.toBoolean();
} catch (Exception &e) {
*/
qint32 QJSValue::toInt() const
{
- QV4::ExecutionEngine *e = d->engine();
- QV4::ExecutionContext *ctx = e ? e->current : 0;
+ QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0;
try {
return d->value.toInt32();
} catch (Exception &e) {
*/
quint32 QJSValue::toUInt() const
{
- QV4::ExecutionEngine *e = d->engine();
- QV4::ExecutionContext *ctx = e ? e->current : 0;
+ QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0;
try {
return d->value.toUInt32();
} catch (Exception &e) {
if (!f)
return QJSValue();
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
assert(engine);
QVarLengthArray<Value, 9> arguments(args.length());
if (!f)
return QJSValue();
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
assert(engine);
if (!instance.d->checkEngine(engine)) {
if (!f)
return QJSValue();
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
assert(engine);
QVarLengthArray<Value, 9> arguments(args.length());
*/
QJSEngine* QJSValue::engine() const
{
- QV4::ExecutionEngine *engine = d->engine();
+ QV4::ExecutionEngine *engine = d->engine;
if (engine)
return engine->v8Engine->publicEngine();
}
if (!o)
return QJSValue();
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
String *s = engine->newString(name);
uint idx = s->asArrayIndex();
if (idx < UINT_MAX)
if (!o)
return QJSValue();
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
QV4::ExecutionContext *ctx = engine->current;
try {
QV4::Value v = arrayIndex == UINT_MAX ? o->get(ctx, engine->id_uintMax) : o->getIndexed(ctx, arrayIndex);
return;
}
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
String *s = engine->newString(name);
uint idx = s->asArrayIndex();
if (idx < UINT_MAX) {
if (!o)
return;
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
QV4::ExecutionContext *ctx = engine->current;
try {
if (arrayIndex != UINT_MAX)
if (!o)
return false;
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
String *s = engine->newString(name);
return o->deleteProperty(engine->current, s);
}
if (!o)
return false;
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
String *s = engine->newIdentifier(name);
return o->__hasProperty__(s);
}
if (!o)
return false;
- ExecutionEngine *engine = d->engine();
+ ExecutionEngine *engine = d->engine;
String *s = engine->newIdentifier(name);
return o->__getOwnProperty__(s);
}
{
public:
QJSValuePrivate(QV4::ExecutionEngine *engine, const QV4::Value &v)
- : PersistentValuePrivate(v)
- , e(engine)
+ : PersistentValuePrivate(v, 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);
- bool checkEngine(QV4::ExecutionEngine *otherEngine) {
- if (!e) {
- assert(!value.isObject());
- e = otherEngine;
- }
- return (e == otherEngine);
- }
-
- QV4::ExecutionEngine *engine() const {
- 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