enhance raw_svector_ostream::write_impl to work with unbuffered streams,
authorChris Lattner <sabre@nondot.org>
Mon, 15 Feb 2010 02:18:26 +0000 (02:18 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 15 Feb 2010 02:18:26 +0000 (02:18 +0000)
which may call write_impl on things that are not the usual buffer.

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

lib/Support/raw_ostream.cpp

index af6dc7cf48bde4b7abc14dfd6e81dc9f6b96aede..25c3fbdef32a1eb95034517ecaecd19c1de8f759 100644 (file)
@@ -574,12 +574,18 @@ void raw_svector_ostream::resync() {
 }
 
 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
-  assert(Ptr == OS.end() && OS.size() + Size <= OS.capacity() &&
-         "Invalid write_impl() call!");
-
-  // We don't need to copy the bytes, just commit the bytes to the
-  // SmallVector.
-  OS.set_size(OS.size() + Size);
+  // If we're writing bytes from the end of the buffer into the smallvector, we
+  // don't need to copy the bytes, just commit the bytes because they are
+  // already in the right place.
+  if (Ptr == OS.end()) {
+    assert(OS.size() + Size <= OS.capacity() && "Invalid write_impl() call!");
+    OS.set_size(OS.size() + Size);
+  } else {
+    assert(GetNumBytesInBuffer() == 0 &&
+           "Should be writing from buffer if some bytes in it");
+    // Otherwise, do copy the bytes.
+    OS.append(Ptr, Ptr+Size);
+  }
 
   // Grow the vector if necessary.
   if (OS.capacity() - OS.size() < 64)