summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-04-08 13:53:26 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-04-08 16:29:30 +0200
commit78bef0f2288de34f68525721733e43c769eb4496 (patch)
tree0a4be26aba63c2ae8623d988a782031e613c02c8 /src
parent29439b9cd745964a54af95682a869f61b102bb00 (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>
Diffstat (limited to 'src')
-rw-r--r--src/v4/qv4internalclass.cpp30
-rw-r--r--src/v4/qv4internalclass.h3
-rw-r--r--src/v4/qv4object.cpp3
3 files changed, 10 insertions, 26 deletions
diff --git a/src/v4/qv4internalclass.cpp b/src/v4/qv4internalclass.cpp
index f60312ad..25857de3 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 0d20d400..8ad14123 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 4f5a6579..36af4b65 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);