diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-15 15:46:36 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-18 13:14:21 +0200 |
commit | 87f475cbdb89fcbfbce68c3b676a240bb255a6d9 (patch) | |
tree | 9ed2acca5036e70fdd9d60204e1dd5ca3ce0d758 /src/qml/jsruntime/qv4managed_p.h | |
parent | 43cdae853b726642893622d2feffcd0f4a2d6953 (diff) |
Refactor our NaN boxing to be more efficient
* Use a unified way to store all Managed objects inside
a Value, instead of distinguishing between strings
and other objects.
* On 64 bit we store pointers as pointers, so accessing them
through Scoped<> objects is cheap. This implies that doubles
are now stored in a mangled form (xor'ed with a mask).
Change-Id: I582e0fb167a62c0c527c6bfa3452550e37944069
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4managed_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 42b6841959..f13f699748 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -226,6 +226,9 @@ public: template <typename T> T *as() { + // ### FIXME: + if (!this) + return 0; #if !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T *>(this)->qt_check_for_QMANAGED_macro(*reinterpret_cast<T *>(this)); #endif @@ -233,6 +236,9 @@ public: } template <typename T> const T *as() const { + // ### FIXME: + if (!this) + return 0; #if !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T *>(this)->qt_check_for_QMANAGED_macro(*reinterpret_cast<T *>(const_cast<Managed *>(this))); #endif @@ -315,6 +321,8 @@ public: return type; } + ReturnedValue asReturnedValue() { return Value::fromManaged(this).asReturnedValue(); } + union { uint _data; struct { @@ -345,10 +353,12 @@ private: friend struct ObjectIterator; }; -// ### Not a good placement -template<typename T> -inline T *Value::as() const { Managed *m = isObject() ? managed() : 0; return m ? m->as<T>() : 0; } - +inline ReturnedValue Managed::construct(CallData *d) { + return vtbl->construct(this, d); +} +inline ReturnedValue Managed::call(CallData *d) { + return vtbl->call(this, d); +} } |