[libcxx-commits] [libcxx] 49173ca - [libcxx] Avoid intermediate string objects for substrings in windows operator/=

Martin Storsjö via libcxx-commits libcxx-commits at lists.llvm.org
Thu Mar 11 09:35:28 PST 2021


Author: Martin Storsjö
Date: 2021-03-11T19:34:59+02:00
New Revision: 49173ca4db21e4d1576c2440b79ebff48c6c4156

URL: https://github.com/llvm/llvm-project/commit/49173ca4db21e4d1576c2440b79ebff48c6c4156
DIFF: https://github.com/llvm/llvm-project/commit/49173ca4db21e4d1576c2440b79ebff48c6c4156.diff

LOG: [libcxx] Avoid intermediate string objects for substrings in windows operator/=

Check that appends with a path object doesn't do allocations, even
on windows.

Suggested by Marek in D98398. The patch might apply without D98398
(depending on how much of the diff context has to match), but doesn't
make much sense until after that patch has landed.

Differential Revision: https://reviews.llvm.org/D98412

Added: 
    

Modified: 
    libcxx/include/filesystem
    libcxx/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/include/filesystem b/libcxx/include/filesystem
index 372b28f285b0..dc4ac6d30db1 100644
--- a/libcxx/include/filesystem
+++ b/libcxx/include/filesystem
@@ -1026,12 +1026,12 @@ public:
     if (__p.has_root_directory()) {
       path __root_name_str = root_name();
       __pn_ = __root_name_str.native();
-      __pn_ += __p.__pn_.substr(__p_root_name_size);
+      __pn_ += __string_view(__p.__pn_).substr(__p_root_name_size);
       return *this;
     }
     if (has_filename() || (!has_root_directory() && is_absolute()))
       __pn_ += preferred_separator;
-    __pn_ += __p.__pn_.substr(__p_root_name_size);
+    __pn_ += __string_view(__p.__pn_).substr(__p_root_name_size);
     return *this;
   }
   template <class _Source>

diff  --git a/libcxx/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
index 661ebac3749f..d7fdc3086d09 100644
--- a/libcxx/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
+++ b/libcxx/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
@@ -175,6 +175,15 @@ void doAppendSourceAllocTest(AppendOperatorTestcase const& TC)
     }
     assert(PathEq(LHS, E));
   }
+  {
+    path LHS(L); PathReserve(LHS, ReserveSize);
+    path RHS(R);
+    {
+      DisableAllocationGuard g;
+      LHS /= RHS;
+    }
+    assert(PathEq(LHS, E));
+  }
   // input iterator - For non-native char types, appends needs to copy the
   // iterator range into a contiguous block of memory before it can perform the
   // code_cvt conversions.


        


More information about the libcxx-commits mailing list