diff options
Diffstat (limited to 'src/qml/jsruntime/qv4internalclass_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4internalclass_p.h | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/qml/jsruntime/qv4internalclass_p.h b/src/qml/jsruntime/qv4internalclass_p.h index df73ee6ccc..56ce787859 100644 --- a/src/qml/jsruntime/qv4internalclass_p.h +++ b/src/qml/jsruntime/qv4internalclass_p.h @@ -17,6 +17,7 @@ #include "qv4global_p.h" #include <QHash> +#include <QVarLengthArray> #include <climits> // for UINT_MAX #include <private/qv4propertykey_p.h> #include <private/qv4heap_p.h> @@ -132,6 +133,8 @@ struct SharedInternalClassDataPrivate<PropertyAttributes> { void grow(); + void markIfNecessary(const PropertyAttributes &) {} + uint alloc() const { return m_alloc; } uint size() const { return m_size; } void setSize(uint s) { m_size = s; } @@ -174,11 +177,14 @@ private: template<> struct SharedInternalClassDataPrivate<PropertyKey> { - SharedInternalClassDataPrivate(ExecutionEngine *e) : refcount(1), engine(e), data(nullptr) {} + SharedInternalClassDataPrivate(ExecutionEngine *e) : refcount(1), engine(e) {} SharedInternalClassDataPrivate(const SharedInternalClassDataPrivate &other); SharedInternalClassDataPrivate(const SharedInternalClassDataPrivate &other, uint pos, PropertyKey value); ~SharedInternalClassDataPrivate() {} + template<typename StringOrSymbol = Heap::StringOrSymbol> + void markIfNecessary(const PropertyKey &value); + void grow(); uint alloc() const; uint size() const; @@ -192,9 +198,20 @@ struct SharedInternalClassDataPrivate<PropertyKey> { int refcount = 1; private: ExecutionEngine *engine; - Heap::MemberData *data; + WriteBarrier::Pointer<Heap::MemberData> data; }; +template<typename StringOrSymbol> +void QV4::SharedInternalClassDataPrivate<PropertyKey>::markIfNecessary(const PropertyKey &value) +{ + QV4::WriteBarrier::markCustom(engine, [&](QV4::MarkStack *stack) { + if constexpr (QV4::WriteBarrier::isInsertionBarrier) { + if (auto s = value.asStringOrSymbol<StringOrSymbol>()) + s->mark(stack); + } + }); +} + template <typename T> struct SharedInternalClassData { using Private = SharedInternalClassDataPrivate<T>; @@ -222,6 +239,7 @@ struct SharedInternalClassData { } void add(uint pos, T value) { + d->markIfNecessary(value); if (pos < d->size()) { Q_ASSERT(d->refcount > 1); // need to detach @@ -243,6 +261,7 @@ struct SharedInternalClassData { void set(uint pos, T value) { Q_ASSERT(pos < d->size()); + d->markIfNecessary(value); if (d->refcount > 1) { // need to detach Private *dd = new Private(*d); @@ -315,7 +334,7 @@ struct InternalClass : Base { SharedInternalClassData<PropertyAttributes> propertyData; typedef InternalClassTransition Transition; - std::vector<Transition> transitions; + QVarLengthArray<Transition, 1> transitions; InternalClassTransition &lookupOrInsertTransition(const InternalClassTransition &t); uint size; @@ -332,7 +351,7 @@ struct InternalClass : Base { void init(InternalClass *other); void destroy(); - Q_QML_PRIVATE_EXPORT QString keyAt(uint index) const; + Q_QML_EXPORT ReturnedValue keyAt(uint index) const; Q_REQUIRED_RESULT InternalClass *nonExtensible(); Q_REQUIRED_RESULT InternalClass *locked(); |