From 78bef0f2288de34f68525721733e43c769eb4496 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 8 Apr 2013 13:53:26 +0200 Subject: Simplify internal class logic getOrAddMember was always used for adding. Make that explicit. Change-Id: Iff202a83e857aefd231eadf59f310619c4338b52 Reviewed-by: Simon Hausmann --- src/v4/qv4internalclass.cpp | 30 +++++++----------------------- src/v4/qv4internalclass.h | 3 +-- src/v4/qv4object.cpp | 3 ++- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/v4/qv4internalclass.cpp b/src/v4/qv4internalclass.cpp index f60312adf0..25857de361 100644 --- a/src/v4/qv4internalclass.cpp +++ b/src/v4/qv4internalclass.cpp @@ -57,34 +57,19 @@ InternalClass::InternalClass(const QQmlJS::VM::InternalClass &other) { } -InternalClass *InternalClass::addMember(String *string) +InternalClass *InternalClass::addMember(String *string, uint *index) { engine->identifierCache->toIdentifier(string); uint id = string->identifier; - InternalClass *newClass = new InternalClass(*this); - newClass->propertyTable.insert(id, size); - newClass->nameMap.append(string); - ++newClass->size; - transitions.insert(id, newClass); - return newClass; -} - -uint InternalClass::getOrAddMember(Object *object, String *string) -{ - engine->identifierCache->toIdentifier(string); - uint id = string->identifier; - - QHash::const_iterator it = propertyTable.constFind(id); - if (it != propertyTable.constEnd()) - return it.value(); - - // new member, need to transition to a new internal class + assert(propertyTable.constFind(id) == propertyTable.constEnd()); QHash::const_iterator tit = transitions.constFind(id); + if (index) + *index = size; if (tit != transitions.constEnd()) { - object->internalClass = tit.value(); + return tit.value(); } else { // create a new class and add it to the tree InternalClass *newClass = new InternalClass(*this); @@ -92,9 +77,8 @@ uint InternalClass::getOrAddMember(Object *object, String *string) newClass->nameMap.append(string); ++newClass->size; transitions.insert(id, newClass); - object->internalClass = newClass; + return newClass; } - return size; } void InternalClass::removeMember(Object *object, uint id) @@ -116,7 +100,7 @@ void InternalClass::removeMember(Object *object, uint id) for (int i = 0; i < nameMap.size(); ++i) { if (i == propIdx) continue; - object->internalClass->getOrAddMember(object, nameMap.at(i)); + object->internalClass = object->internalClass->addMember(nameMap.at(i)); } transitions.insert(toRemove, object->internalClass); diff --git a/src/v4/qv4internalclass.h b/src/v4/qv4internalclass.h index 0d20d4001b..8ad14123f0 100644 --- a/src/v4/qv4internalclass.h +++ b/src/v4/qv4internalclass.h @@ -62,11 +62,10 @@ struct InternalClass { InternalClass(ExecutionEngine *engine) : engine(engine), size(0) {} - uint getOrAddMember(Object *object, String *string); + InternalClass *addMember(String *string, uint *index = 0); void removeMember(Object *object, uint id); uint find(String *s); - InternalClass *addMember(String *string); private: InternalClass(const InternalClass &other); }; diff --git a/src/v4/qv4object.cpp b/src/v4/qv4object.cpp index 4f5a6579ec..36af4b65a0 100644 --- a/src/v4/qv4object.cpp +++ b/src/v4/qv4object.cpp @@ -252,7 +252,8 @@ void Object::markObjects(Managed *that) PropertyDescriptor *Object::insertMember(String *s) { - uint idx = internalClass->getOrAddMember(this, s); + uint idx; + internalClass = internalClass->addMember(s, &idx); if (idx >= memberDataAlloc) { memberDataAlloc = qMax((uint)8, 2*memberDataAlloc); -- cgit v1.2.3