diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2010-09-28 19:16:56 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:07:19 -0300 |
commit | a001e8538adce84bdd201e897b9309902cdd8458 (patch) | |
tree | baa5898d65cda5434de3ab44189eddc3762d0eb0 /libshiboken/typeresolver.cpp | |
parent | e8c26169f9c67a7cfc7c6e63d0e1a9b247505b72 (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.cpp | 35 |
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; } |