diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-09-23 15:46:25 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-09-27 08:33:59 +0000 |
commit | 7cc66a996e70c52bc274ae9f15f65e8a638894d9 (patch) | |
tree | 6b493e26e775db2c6ef5b3c22a031e8dbaad01d0 /src/qml/jsruntime/qv4internalclass.cpp | |
parent | f63d48d474db7e9eff7583f1b8478228b13d3c82 (diff) |
Get rid of remaining assumptions about setter being next to getters
The only place where we now assume that getters and setters are
next to each other in the MemberData is in the internal class.
Change-Id: I3285f3abb1cbfe051853e808339cd360eb602262
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4internalclass.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4internalclass.cpp | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp index bd037ef8a6..7096c1b591 100644 --- a/src/qml/jsruntime/qv4internalclass.cpp +++ b/src/qml/jsruntime/qv4internalclass.cpp @@ -299,24 +299,24 @@ static void removeFromPropertyData(QV4::Object *object, int idx, bool accessor = o->setProperty(v4, size + 1, Value::undefinedValue()); } -void InternalClass::changeMember(QV4::Object *object, PropertyKey id, PropertyAttributes data, uint *index) +void InternalClass::changeMember(QV4::Object *object, PropertyKey id, PropertyAttributes data, InternalClassEntry *entry) { Q_ASSERT(id.isStringOrSymbol()); - uint idx; + InternalClassEntry idx; Heap::InternalClass *oldClass = object->internalClass(); Heap::InternalClass *newClass = oldClass->changeMember(id, data, &idx); - if (index) - *index = idx; + if (entry) + *entry = idx; uint oldSize = oldClass->size; object->setInternalClass(newClass); // don't use oldClass anymore, it could be GC'ed if (newClass->size > oldSize) { Q_ASSERT(newClass->size == oldSize + 1); - insertHoleIntoPropertyData(object, idx); + insertHoleIntoPropertyData(object, idx.setterIndex - 1); } else if (newClass->size < oldSize) { Q_ASSERT(newClass->size == oldSize - 1); - removeFromPropertyData(object, idx + 1); + removeFromPropertyData(object, idx.index + 1); } } @@ -340,15 +340,18 @@ static void addDummyEntry(InternalClass *newClass, PropertyHash::Entry e) ++newClass->size; } -Heap::InternalClass *InternalClass::changeMember(PropertyKey identifier, PropertyAttributes data, uint *index) +Heap::InternalClass *InternalClass::changeMember(PropertyKey identifier, PropertyAttributes data, InternalClassEntry *entry) { data.resolve(); PropertyHash::Entry *e = findEntry(identifier); Q_ASSERT(e && e->index != UINT_MAX); uint idx = e->index; - if (index) - *index = idx; + if (entry) { + entry->index = idx; + entry->setterIndex = data.isAccessor() ? idx + 1 : UINT_MAX; + entry->attributes = data; + } if (data == propertyData.at(idx)) return static_cast<Heap::InternalClass *>(this); @@ -458,43 +461,42 @@ Heap::InternalClass *InternalClass::nonExtensible() return newClass; } -void InternalClass::addMember(QV4::Object *object, PropertyKey id, PropertyAttributes data, uint *index) +void InternalClass::addMember(QV4::Object *object, PropertyKey id, PropertyAttributes data, InternalClassEntry *entry) { Q_ASSERT(id.isStringOrSymbol()); data.resolve(); PropertyHash::Entry *e = object->internalClass()->propertyTable.lookup(id); if (e && e->index < object->internalClass()->size) { - changeMember(object, id, data, index); + changeMember(object, id, data, entry); return; } - uint idx; - Heap::InternalClass *newClass = object->internalClass()->addMemberImpl(id, data, &idx); - if (index) - *index = idx; - + Heap::InternalClass *newClass = object->internalClass()->addMemberImpl(id, data, entry); object->setInternalClass(newClass); } -Heap::InternalClass *InternalClass::addMember(PropertyKey identifier, PropertyAttributes data, uint *index) +Heap::InternalClass *InternalClass::addMember(PropertyKey identifier, PropertyAttributes data, InternalClassEntry *entry) { Q_ASSERT(identifier.isStringOrSymbol()); data.resolve(); PropertyHash::Entry *e = propertyTable.lookup(identifier); if (e && e->index < size) - return changeMember(identifier, data, index); + return changeMember(identifier, data, entry); - return addMemberImpl(identifier, data, index); + return addMemberImpl(identifier, data, entry); } -Heap::InternalClass *InternalClass::addMemberImpl(PropertyKey identifier, PropertyAttributes data, uint *index) +Heap::InternalClass *InternalClass::addMemberImpl(PropertyKey identifier, PropertyAttributes data, InternalClassEntry *entry) { Transition temp = { { identifier }, nullptr, (int)data.flags() }; Transition &t = lookupOrInsertTransition(temp); - if (index) - *index = size; + if (entry) { + entry->index = size; + entry->setterIndex = data.isAccessor() ? size + 1 : UINT_MAX; + entry->attributes = data; + } if (t.lookup) return t.lookup; |