aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4internalclass_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-09-10 23:30:04 +0200
committerLars Knoll <lars.knoll@qt.io>2018-09-16 17:00:22 +0000
commite436fb3569603bca8ad0a71fef67c03d2920aedc (patch)
treea8076925a788fd721c8b46119f0f13009ca882e8 /src/qml/jsruntime/qv4internalclass_p.h
parent6982d0d6290c137468749bb8ab2f2e20dfa453fd (diff)
Store InternalClass::nameMap in a MemberData
This helps make that memory known to the GC as well, and makes marking of internal classes much more efficient, as we don't mark the property keys repeatedly (even if they are shared between different internal classes) Change-Id: Ibb7e5383672d7657926bd08bf13f73f7680a9f31 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4internalclass_p.h')
-rw-r--r--src/qml/jsruntime/qv4internalclass_p.h39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4internalclass_p.h b/src/qml/jsruntime/qv4internalclass_p.h
index 8bf83d87b4..cb45343d6d 100644
--- a/src/qml/jsruntime/qv4internalclass_p.h
+++ b/src/qml/jsruntime/qv4internalclass_p.h
@@ -143,7 +143,7 @@ inline uint PropertyHash::lookup(PropertyKey identifier) const
template<typename T>
struct SharedInternalClassDataPrivate {
- SharedInternalClassDataPrivate()
+ SharedInternalClassDataPrivate(ExecutionEngine *)
: refcount(1),
m_alloc(0),
m_size(0),
@@ -159,7 +159,7 @@ struct SharedInternalClassDataPrivate {
memcpy(data, other.data, m_size*sizeof(T));
}
}
- SharedInternalClassDataPrivate(const SharedInternalClassDataPrivate &other, int pos, T value)
+ SharedInternalClassDataPrivate(const SharedInternalClassDataPrivate &other, uint pos, T value)
: refcount(1),
m_alloc(pos + 8),
m_size(pos + 1)
@@ -191,21 +191,45 @@ struct SharedInternalClassDataPrivate {
T at(uint i) { Q_ASSERT(data && i < m_alloc); return data[i]; }
void set(uint i, T t) { Q_ASSERT(data && i < m_alloc); data[i] = t; }
- int refcount;
+ void mark(MarkStack *) {}
+
+ int refcount = 1;
private:
uint m_alloc;
uint m_size;
T *data;
};
+template<>
+struct SharedInternalClassDataPrivate<PropertyKey> {
+ SharedInternalClassDataPrivate(ExecutionEngine *e) : refcount(1), engine(e), data(nullptr) {}
+ SharedInternalClassDataPrivate(const SharedInternalClassDataPrivate &other);
+ SharedInternalClassDataPrivate(const SharedInternalClassDataPrivate &other, uint pos, PropertyKey value);
+ ~SharedInternalClassDataPrivate() {}
+
+ void grow();
+ uint alloc() const;
+ uint size() const;
+ void setSize(uint s);
+
+ PropertyKey at(uint i);
+ void set(uint i, PropertyKey t);
+
+ void mark(MarkStack *s);
+
+ int refcount = 1;
+private:
+ ExecutionEngine *engine;
+ Heap::MemberData *data;
+};
template <typename T>
struct SharedInternalClassData {
using Private = SharedInternalClassDataPrivate<T>;
Private *d;
- inline SharedInternalClassData() {
- d = new Private;
+ inline SharedInternalClassData(ExecutionEngine *e) {
+ d = new Private(e);
}
inline SharedInternalClassData(const SharedInternalClassData &other)
@@ -238,8 +262,8 @@ struct SharedInternalClassData {
Q_ASSERT(pos == d->size());
if (pos == d->alloc())
d->grow();
- d->set(pos, value);
d->setSize(d->size() + 1);
+ d->set(pos, value);
}
void set(uint pos, T value) {
@@ -262,6 +286,8 @@ struct SharedInternalClassData {
Q_ASSERT(i < d->size());
return d->at(i);
}
+
+ void mark(MarkStack *s) { d->mark(s); }
};
struct InternalClassTransition
@@ -318,6 +344,7 @@ struct InternalClass : Base {
void init(InternalClass *other);
void destroy();
+ Q_QML_PRIVATE_EXPORT QString keyAt(uint index) const;
Q_REQUIRED_RESULT InternalClass *nonExtensible();
static void addMember(QV4::Object *object, PropertyKey id, PropertyAttributes data, uint *index);