aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/typeresolver.cpp
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2010-09-28 19:16:56 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:07:19 -0300
commita001e8538adce84bdd201e897b9309902cdd8458 (patch)
treebaa5898d65cda5434de3ab44189eddc3762d0eb0 /libshiboken/typeresolver.cpp
parente8c26169f9c67a7cfc7c6e63d0e1a9b247505b72 (diff)
Optimize TypeResolver::getType function to avoid strcpy and misses on typeresolver hash.
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org> Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'libshiboken/typeresolver.cpp')
-rw-r--r--libshiboken/typeresolver.cpp35
1 files changed, 19 insertions, 16 deletions
diff --git a/libshiboken/typeresolver.cpp b/libshiboken/typeresolver.cpp
index e69f7f8d6..d1439ef80 100644
--- a/libshiboken/typeresolver.cpp
+++ b/libshiboken/typeresolver.cpp
@@ -116,22 +116,25 @@ PyTypeObject* TypeResolver::pythonType()
TypeResolver::Type TypeResolver::getType(const char* name)
{
- std::string typeName(name);
- int len = typeName.size() - 1;
- if (len > 1) {
- if (typeName[len] == '*')
- typeName.erase(len, 1);
-
- TypeResolver *resolver = TypeResolver::get(typeName.c_str());
- if (resolver)
- return TypeResolver::ValueType;
-
- typeName += '*';
- resolver = TypeResolver::get(typeName.c_str());
- if (resolver)
- return TypeResolver::ObjectType;
+ int len = strlen(name);
+ bool isObjTypeName = name[len - 1] == '*';
+ if (TypeResolver::get(name)) {
+ // great, we found the type in our first attempt!
+ return isObjTypeName ? ObjectType : ValueType;
+ } else {
+ // Type not found... let's copy the string.
+ std::string typeName;
+ typeName.reserve(len + 2);
+ if (isObjTypeName)
+ typeName.erase(len - 1, 1);
+ else
+ typeName += '*';
+ isObjTypeName = !isObjTypeName;
+
+ if (TypeResolver::get(typeName.c_str()))
+ return isObjTypeName ? ObjectType : ValueType;
+ else
+ return UnknownType;
}
-
- return TypeResolver::UnknownType;
}