diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-04-08 13:53:26 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-04-08 16:29:30 +0200 |
commit | 78bef0f2288de34f68525721733e43c769eb4496 (patch) | |
tree | 0a4be26aba63c2ae8623d988a782031e613c02c8 | |
parent | 29439b9cd745964a54af95682a869f61b102bb00 (diff) |
Simplify internal class logic
getOrAddMember was always used for adding. Make that
explicit.
Change-Id: Iff202a83e857aefd231eadf59f310619c4338b52
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/v4/qv4internalclass.cpp | 30 | ||||
-rw-r--r-- | src/v4/qv4internalclass.h | 3 | ||||
-rw-r--r-- | 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<uint, uint>::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<int, InternalClass *>::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); |