aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4vtable_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-08-02 15:44:12 +0200
committerLars Knoll <lars.knoll@qt.io>2018-08-02 20:25:41 +0000
commit0754f55287f4652382332bce42cd8c7d27846ef1 (patch)
tree490bbd3c5d66586a1427ba21dde76b2af65230dc /src/qml/jsruntime/qv4vtable_p.h
parent57640959320c87850315eae44c783803d113dc85 (diff)
Introduce a new mechanism to iterate over object properties
The old advanceIterator schema was extremely ugly and in addition not flexible enough to support the requirements for Proxy.ownKeys and some of the methods in Object Implemented a new scheme through a OwnPropertyKeys method in the Object VTable that creates and returns an iterator object. Ported QJSValueIterator and for-in to use the new mechanism. There's still many places where we use the old ObjectIterator (that relies on advanceIterator). Those will be ported in subsequent commits. Change-Id: I091a9bea9ff6b2b63630cc336814700757a718be Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4vtable_p.h')
-rw-r--r--src/qml/jsruntime/qv4vtable_p.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4vtable_p.h b/src/qml/jsruntime/qv4vtable_p.h
index b4e868d45d..aff8eb83ac 100644
--- a/src/qml/jsruntime/qv4vtable_p.h
+++ b/src/qml/jsruntime/qv4vtable_p.h
@@ -56,6 +56,11 @@ QT_BEGIN_NAMESPACE
namespace QV4 {
+struct OwnPropertyKeyIterator {
+ virtual ~OwnPropertyKeyIterator() = 0;
+ virtual PropertyKey next(const Object *o, Property *p = nullptr, PropertyAttributes *attrs = nullptr) = 0;
+};
+
struct VTable
{
typedef void (*Destroy)(Heap::Base *);
@@ -74,6 +79,7 @@ struct VTable
typedef bool (*SetPrototypeOf)(Managed *, const Object *);
typedef qint64 (*GetLength)(const Managed *m);
typedef void (*AdvanceIterator)(Managed *m, ObjectIterator *it, Value *name, uint *index, Property *p, PropertyAttributes *attributes);
+ typedef OwnPropertyKeyIterator *(*OwnPropertyKeys)(const Object *m);
typedef ReturnedValue (*InstanceOf)(const Object *typeObject, const Value &var);
typedef ReturnedValue (*Call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
@@ -109,6 +115,7 @@ struct VTable
SetPrototypeOf setPrototypeOf;
GetLength getLength;
AdvanceIterator advanceIterator;
+ OwnPropertyKeys ownPropertyKeys;
InstanceOf instanceOf;
Call call;
@@ -133,6 +140,7 @@ protected:
static constexpr VTable::SetPrototypeOf virtualSetPrototypeOf = nullptr;
static constexpr VTable::GetLength virtualGetLength = nullptr;
static constexpr VTable::AdvanceIterator virtualAdvanceIterator = nullptr;
+ static constexpr VTable::OwnPropertyKeys virtualOwnPropertyKeys = nullptr;
static constexpr VTable::InstanceOf virtualInstanceOf = nullptr;
static constexpr VTable::Call virtualCall = nullptr;
@@ -172,6 +180,7 @@ protected:
classname::virtualSetPrototypeOf, \
classname::virtualGetLength, \
classname::virtualAdvanceIterator, \
+ classname::virtualOwnPropertyKeys, \
classname::virtualInstanceOf, \
\
classname::virtualCall, \