diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-23 15:52:10 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-26 09:05:16 +0200 |
commit | 12fd2ccd3fa2dc0133b5a3fb89f9fdf5cf721232 (patch) | |
tree | 880acb9c7c0d8289185b6aebe4339f439c707a0e /src/qml/jsruntime/qv4value.cpp | |
parent | 2e4f66caa8a5f9e887dbdb4e3f2ae5c9be9a7005 (diff) |
Fix Persistent/WeakValue API
Don't use unprotected Values in the API anymore.
Change-Id: I8851628227fca374de24701bc8ee0908b5ae3923
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4value.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4value.cpp | 73 |
1 files changed, 32 insertions, 41 deletions
diff --git a/src/qml/jsruntime/qv4value.cpp b/src/qml/jsruntime/qv4value.cpp index 197b1c2ee5..51f7fba6d3 100644 --- a/src/qml/jsruntime/qv4value.cpp +++ b/src/qml/jsruntime/qv4value.cpp @@ -285,18 +285,13 @@ Object *Value::toObject(ExecutionContext *ctx) const } -PersistentValue::PersistentValue(const Value &val) - : d(new PersistentValuePrivate(val)) -{ -} - -PersistentValue::PersistentValue(const ScopedValue &val) - : d(new PersistentValuePrivate(*val.operator ->())) +PersistentValue::PersistentValue(const ValueRef val) + : d(new PersistentValuePrivate(val.asReturnedValue())) { } PersistentValue::PersistentValue(ReturnedValue val) - : d(new PersistentValuePrivate(Value::fromReturnedValue(val))) + : d(new PersistentValuePrivate(val)) { } @@ -323,33 +318,23 @@ PersistentValue &PersistentValue::operator=(const PersistentValue &other) return *this; } -PersistentValue &PersistentValue::operator =(const Value &other) +PersistentValue &PersistentValue::operator =(const ValueRef other) { if (!d) { - d = new PersistentValuePrivate(other); + d = new PersistentValuePrivate(other.asReturnedValue()); return *this; } - d = d->detach(other); + d = d->detach(other.asReturnedValue()); return *this; } -PersistentValue &PersistentValue::operator =(const ScopedValue &other) -{ - return operator=(*other.operator ->()); -} - -PersistentValue &PersistentValue::operator =(const ValueRef other) -{ - return operator=(*other.operator ->()); -} - -PersistentValue &PersistentValue::operator =(const ReturnedValue &other) +PersistentValue &PersistentValue::operator =(ReturnedValue other) { if (!d) { - d = new PersistentValuePrivate(Value::fromReturnedValue(other)); + d = new PersistentValuePrivate(other); return *this; } - d = d->detach(Value::fromReturnedValue(other)); + d = d->detach(other); return *this; } @@ -359,8 +344,8 @@ PersistentValue::~PersistentValue() d->deref(); } -WeakValue::WeakValue(const Value &val) - : d(new PersistentValuePrivate(val, /*engine*/0, /*weak*/true)) +WeakValue::WeakValue(const ValueRef val) + : d(new PersistentValuePrivate(val.asReturnedValue(), /*engine*/0, /*weak*/true)) { } @@ -372,7 +357,7 @@ WeakValue::WeakValue(const WeakValue &other) } WeakValue::WeakValue(ReturnedValue val) - : d(new PersistentValuePrivate(Value::fromReturnedValue(val), /*engine*/0, /*weak*/true)) + : d(new PersistentValuePrivate(val, /*engine*/0, /*weak*/true)) { } @@ -392,23 +377,23 @@ WeakValue &WeakValue::operator=(const WeakValue &other) return *this; } -WeakValue &WeakValue::operator =(const Value &other) +WeakValue &WeakValue::operator =(const ValueRef other) { if (!d) { - d = new PersistentValuePrivate(other, /*engine*/0, /*weak*/true); + d = new PersistentValuePrivate(other.asReturnedValue(), /*engine*/0, /*weak*/true); return *this; } - d = d->detach(other, /*weak*/true); + d = d->detach(other.asReturnedValue(), /*weak*/true); return *this; } WeakValue &WeakValue::operator =(const ReturnedValue &other) { if (!d) { - d = new PersistentValuePrivate(Value::fromReturnedValue(other), /*engine*/0, /*weak*/true); + d = new PersistentValuePrivate(other, /*engine*/0, /*weak*/true); return *this; } - d = d->detach(Value::fromReturnedValue(other), /*weak*/true); + d = d->detach(other, /*weak*/true); return *this; } @@ -429,21 +414,27 @@ void WeakValue::markOnce() m->mark(); } -PersistentValuePrivate::PersistentValuePrivate(const Value &v, ExecutionEngine *e, bool weak) - : value(v) - , refcount(1) +PersistentValuePrivate::PersistentValuePrivate(ReturnedValue v, ExecutionEngine *e, bool weak) + : refcount(1) + , weak(weak) + , engine(e) , prev(0) , next(0) - , engine(e) +{ + value.val = v; + init(); +} + +void PersistentValuePrivate::init() { if (!engine) { - Managed *m = v.asManaged(); + Managed *m = value.asManaged(); if (!m) return; engine = m->engine(); } - if (engine) { + if (engine && !prev) { PersistentValuePrivate **listRoot = weak ? &engine->memoryManager->m_weakValues : &engine->memoryManager->m_persistentValues; prev = listRoot; @@ -479,10 +470,10 @@ void PersistentValuePrivate::deref() } } -PersistentValuePrivate *PersistentValuePrivate::detach(const QV4::Value &value, bool weak) +PersistentValuePrivate *PersistentValuePrivate::detach(const QV4::ReturnedValue val, bool weak) { if (refcount == 1) { - this->value = value; + value.val = val; Managed *m = value.asManaged(); if (!prev) { @@ -503,6 +494,6 @@ PersistentValuePrivate *PersistentValuePrivate::detach(const QV4::Value &value, return this; } --refcount; - return new PersistentValuePrivate(value, engine, weak); + return new PersistentValuePrivate(val, engine, weak); } |