In Twine::str(), if the Twine stores only a std::string, just return a direct copy...
authorFrits van Bommel <fvbommel@gmail.com>
Fri, 15 Jul 2011 11:05:37 +0000 (11:05 +0000)
committerFrits van Bommel <fvbommel@gmail.com>
Fri, 15 Jul 2011 11:05:37 +0000 (11:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135267 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/Twine.cpp

index 75cea2961a9dc68d8faccbbd4a6e99681c69283f..d62123cc985e4a32931d5f91cbe70b0aee1ed075 100644 (file)
 using namespace llvm;
 
 std::string Twine::str() const {
+  // If we're storing only a std::string, just return it.
+  if (LHSKind == StdStringKind && RHSKind == EmptyKind)
+    return *static_cast<const std::string*>(LHS);
+
+  // Otherwise, flatten and copy the contents first.
   SmallString<256> Vec;
   return toStringRef(Vec).str();
 }
@@ -37,9 +42,9 @@ StringRef Twine::toNullTerminatedStringRef(SmallVectorImpl<char> &Out) const {
       // Already null terminated, yay!
       return StringRef(static_cast<const char*>(LHS));
     case StdStringKind: {
-        const std::string *str = static_cast<const std::string*>(LHS);
-        return StringRef(str->c_str(), str->size());
-      }
+      const std::string *str = static_cast<const std::string*>(LHS);
+      return StringRef(str->c_str(), str->size());
+    }
     default:
       break;
     }