Path: Add an in-place version of path::native.
authorBenjamin Kramer <benny.kra@googlemail.com>
Wed, 11 Sep 2013 10:45:21 +0000 (10:45 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Wed, 11 Sep 2013 10:45:21 +0000 (10:45 +0000)
This reflects the common use case of nativizing a prepared path. The existing
version invokes undefined behavior if input = output, add an assert to catch
that case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190510 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Path.h
lib/Support/Path.cpp

index f9a65e533a9fc1ad5481218f6a4722095cc501f3..b2afe1b8e8ac79a39e18d275e03b9da02a9fc54a 100644 (file)
@@ -173,6 +173,13 @@ void append(SmallVectorImpl<char> &path,
 /// @param result Holds the result of the transformation.
 void native(const Twine &path, SmallVectorImpl<char> &result);
 
+/// Convert path to the native form in place. This is used to give paths to
+/// users and operating system calls in the platform's normal way. For example,
+/// on Windows all '/' are converted to '\'.
+///
+/// @param path A path that is transformed to native format.
+void native(SmallVectorImpl<char> &path);
+
 /// @}
 /// @name Lexical Observers
 /// @{
index 366fb849338cf04da3036022f67927f3f4a8661d..8d707aedded617ce90ad1237b9ebcb398fc66cc8 100644 (file)
@@ -449,23 +449,18 @@ void replace_extension(SmallVectorImpl<char> &path, const Twine &extension) {
 }
 
 void native(const Twine &path, SmallVectorImpl<char> &result) {
+  assert((!path.isSingleStringRef() ||
+          path.getSingleStringRef().data() != result.data()) &&
+         "path and result are not allowed to overlap!");
   // Clear result.
   result.clear();
-#ifdef LLVM_ON_WIN32
-  SmallString<128> path_storage;
-  StringRef p = path.toStringRef(path_storage);
-  result.reserve(p.size());
-  for (StringRef::const_iterator i = p.begin(),
-                                 e = p.end();
-                                 i != e;
-                                 ++i) {
-    if (*i == '/')
-      result.push_back('\\');
-    else
-      result.push_back(*i);
-  }
-#else
   path.toVector(result);
+  native(result);
+}
+
+void native(SmallVectorImpl<char> &path) {
+#ifdef LLVM_ON_WIN32
+  std::replace(path.begin(), path.end(), '/', '\\');
 #endif
 }