aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-08-25 17:07:18 +0200
committerLars Knoll <lars.knoll@theqtcompany.com>2015-09-15 19:12:51 +0000
commit458892bcd570b5b517387a22782afe3cff2eea6d (patch)
treeecd284b1e696c3fe6e28ed02dfdaeeacded141e7 /src/qml/jsruntime
parent64c3e1cbb100f7cd67c2d79b4b92a2e873e8163d (diff)
Encapsulate the remaining direct accesses to Object::memberData
Change-Id: I17f202cf58dc355524b89a456e6722d41e444ca1 Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp22
-rw-r--r--src/qml/jsruntime/qv4object_p.h2
2 files changed, 18 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp
index de30a1e9ea..bb2670036d 100644
--- a/src/qml/jsruntime/qv4internalclass.cpp
+++ b/src/qml/jsruntime/qv4internalclass.cpp
@@ -134,6 +134,16 @@ InternalClass::InternalClass(const QV4::InternalClass &other)
Q_ASSERT(extensible);
}
+static void insertHoleIntoPropertyData(Object *object, int idx)
+{
+ memmove(object->d()->memberData->data + idx + 1, object->d()->memberData->data + idx, (object->internalClass()->size - idx - 1)*sizeof(Value));
+}
+
+static void removeFromPropertyData(Object *object, int idx, bool accessor = false)
+{
+ memmove(object->d()->memberData->data + idx, object->d()->memberData->data + idx + (accessor ? 2 : 1), (object->internalClass()->size - idx)*sizeof(Value));
+}
+
void InternalClass::changeMember(Object *object, String *string, PropertyAttributes data, uint *index)
{
uint idx;
@@ -145,10 +155,10 @@ void InternalClass::changeMember(Object *object, String *string, PropertyAttribu
object->setInternalClass(newClass);
if (newClass->size > oldClass->size) {
Q_ASSERT(newClass->size == oldClass->size + 1);
- memmove(object->memberData()->data + idx + 2, object->memberData()->data + idx + 1, (object->internalClass()->size - idx - 1)*sizeof(Value));
+ insertHoleIntoPropertyData(object, idx + 1);
} else if (newClass->size < oldClass->size) {
Q_ASSERT(newClass->size == oldClass->size - 1);
- memmove(object->memberData()->data + idx + 1, object->memberData()->data + idx + 2, (object->internalClass()->size - idx - 1)*sizeof(Value));
+ removeFromPropertyData(object, idx + 1);
}
}
@@ -287,6 +297,8 @@ void InternalClass::removeMember(Object *object, Identifier *id)
Transition temp = { id, 0, -1 };
Transition &t = object->internalClass()->lookupOrInsertTransition(temp);
+ bool accessor = oldClass->propertyData.at(propIdx).isAccessor();
+
if (t.lookup) {
object->setInternalClass(t.lookup);
} else {
@@ -301,8 +313,10 @@ void InternalClass::removeMember(Object *object, Identifier *id)
object->setInternalClass(newClass);
}
- // remove the entry in memberdata
- memmove(object->memberData()->data + propIdx, object->memberData()->data + propIdx + 1, (object->internalClass()->size - propIdx)*sizeof(Value));
+ Q_ASSERT(object->internalClass()->size == oldClass->size - (accessor ? 2 : 1));
+
+ // remove the entry in the property data
+ removeFromPropertyData(object, propIdx, accessor);
t.lookup = object->internalClass();
Q_ASSERT(t.lookup);
diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h
index a2c8164f8d..b748f2e113 100644
--- a/src/qml/jsruntime/qv4object_p.h
+++ b/src/qml/jsruntime/qv4object_p.h
@@ -137,8 +137,6 @@ struct Q_QML_EXPORT Object: Managed {
const Value *propertyData(uint index) const { return d()->propertyData(index); }
Value *propertyData(uint index) { return d()->propertyData(index); }
- Heap::MemberData *memberData() { return d()->memberData; }
- const Heap::MemberData *memberData() const { return d()->memberData; }
Heap::ArrayData *arrayData() const { return d()->arrayData; }
void setArrayData(ArrayData *a) { d()->arrayData = a->d(); }