[llvm-commits] [llvm] r67057 - in /llvm/trunk: include/llvm/Support/raw_ostream.h lib/Support/raw_ostream.cpp

Daniel Dunbar daniel at zuster.org
Mon Mar 16 15:55:06 PDT 2009


Author: ddunbar
Date: Mon Mar 16 17:55:06 2009
New Revision: 67057

URL: http://llvm.org/viewvc/llvm-project?rev=67057&view=rev
Log:
raw_ostream: Lift out flush_nonempty.
 - Flush a known non-empty buffers; enforces the interface to
   flush_impl and kills off HandleFlush (which I saw no reason to be
   an inline method, Chris?).

 - Clarify invariant that flush_impl is only called with OutBufCur >
   OutBufStart.

 - This also cleary collects all places where we have to deal with the
   buffer possibly not existing.

 - A few more comments and fixing the unbuffered behavior remain in
   this commit sequence.

Modified:
    llvm/trunk/include/llvm/Support/raw_ostream.h
    llvm/trunk/lib/Support/raw_ostream.cpp

Modified: llvm/trunk/include/llvm/Support/raw_ostream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=67057&r1=67056&r2=67057&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Support/raw_ostream.h (original)
+++ llvm/trunk/include/llvm/Support/raw_ostream.h Mon Mar 16 17:55:06 2009
@@ -31,6 +31,10 @@
 /// a chunk at a time.
 class raw_ostream {
 protected:
+  /// \invariant { The buffer is uninitialized (OutBufStart,
+  /// OutBufEnd, and OutBufCur are non-zero), or none of them are zero
+  /// and there are at least 64 total bytes in the buffer. }
+
   char *OutBufStart, *OutBufEnd, *OutBufCur;
   bool Unbuffered;
 
@@ -77,7 +81,7 @@
 
   void flush() {
     if (OutBufCur != OutBufStart)
-      flush_impl();
+      flush_nonempty();
   }
 
   raw_ostream &operator<<(char C) {
@@ -85,7 +89,7 @@
       return write(C);
     *OutBufCur++ = C;
     if (Unbuffered)
-      flush_impl();
+      flush_nonempty();
     return *this;
   }
 
@@ -94,7 +98,7 @@
       return write(C);
     *OutBufCur++ = C;
     if (Unbuffered)
-      flush_impl();
+      flush_nonempty();
     return *this;
   }
 
@@ -103,7 +107,7 @@
       return write(C);
     *OutBufCur++ = C;
     if (Unbuffered)
-      flush_impl();
+      flush_nonempty();
     return *this;
   }
 
@@ -142,23 +146,25 @@
   // Subclass Interface
   //===--------------------------------------------------------------------===//
 
-protected:
-
+private:
   /// flush_impl - The is the piece of the class that is implemented by
-  /// subclasses.  This outputs the currently buffered data and resets the
-  /// buffer to empty.
+  /// subclasses.  This only outputs the currently buffered data.
+  ///
+  /// raw_ostream guarantees to only call this routine when there is
+  /// buffered data, i.e. OutBufStart != OutBufCur.
   virtual void flush_impl() = 0;
 
-  /// HandleFlush - A stream's implementation of flush should call this after
-  /// emitting the bytes to the data sink.
-  void HandleFlush() {
-    if (OutBufStart == 0)
-      SetBufferSize(4096);
-    OutBufCur = OutBufStart;
-  }
-private:
   // An out of line virtual method to provide a home for the class vtable.
   virtual void handle();
+
+  //===--------------------------------------------------------------------===//
+  // Private Interface
+  //===--------------------------------------------------------------------===//
+private:
+  /// flush_nonempty - Flush the current buffer, which is known to be
+  /// non-empty. This outputs the currently buffered data and resets
+  /// the buffer to empty.
+  void flush_nonempty();
 };
 
 //===----------------------------------------------------------------------===//
@@ -192,8 +198,10 @@
   ~raw_fd_ostream();
 
   /// flush_impl - The is the piece of the class that is implemented by
-  /// subclasses.  This outputs the currently buffered data and resets the
-  /// buffer to empty.
+  /// subclasses.  This only outputs the currently buffered data.
+  ///
+  /// raw_ostream guarantees to only call this routine when there is
+  /// buffered data, i.e. OutBufStart != OutBufCur.
   virtual void flush_impl();
 
   /// close - Manually flush the stream and close the file.
@@ -249,8 +257,10 @@
   ~raw_os_ostream();
 
   /// flush_impl - The is the piece of the class that is implemented by
-  /// subclasses.  This outputs the currently buffered data and resets the
-  /// buffer to empty.
+  /// subclasses.  This only outputs the currently buffered data.
+  ///
+  /// raw_ostream guarantees to only call this routine when there is
+  /// buffered data, i.e. OutBufStart != OutBufCur.
   virtual void flush_impl();
 };
 
@@ -270,8 +280,10 @@
   }
 
   /// flush_impl - The is the piece of the class that is implemented by
-  /// subclasses.  This outputs the currently buffered data and resets the
-  /// buffer to empty.
+  /// subclasses.  This only outputs the currently buffered data.
+  ///
+  /// raw_ostream guarantees to only call this routine when there is
+  /// buffered data, i.e. OutBufStart != OutBufCur.
   virtual void flush_impl();
 };
 
@@ -284,8 +296,10 @@
   ~raw_svector_ostream();
 
   /// flush_impl - The is the piece of the class that is implemented by
-  /// subclasses.  This outputs the currently buffered data and resets the
-  /// buffer to empty.
+  /// subclasses.  This only outputs the currently buffered data.
+  ///
+  /// raw_ostream guarantees to only call this routine when there is
+  /// buffered data, i.e. OutBufStart != OutBufCur.
   virtual void flush_impl();
 };
 

Modified: llvm/trunk/lib/Support/raw_ostream.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=67057&r1=67056&r2=67057&view=diff

==============================================================================
--- llvm/trunk/lib/Support/raw_ostream.cpp (original)
+++ llvm/trunk/lib/Support/raw_ostream.cpp Mon Mar 16 17:55:06 2009
@@ -116,17 +116,27 @@
   return write(CurPtr, EndPtr-CurPtr);
 }
 
+void raw_ostream::flush_nonempty() {
+  assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.");
+  flush_impl();
+  OutBufCur = OutBufStart;    
+}
+
 raw_ostream &raw_ostream::write(unsigned char C) {
-  if (OutBufCur >= OutBufEnd)
-    flush_impl();
+  if (!OutBufStart)
+    SetBufferSize(4096);
+  else if (OutBufCur >= OutBufEnd)
+    flush_nonempty();
 
   *OutBufCur++ = C;
   return *this;
 }
 
 raw_ostream &raw_ostream::write(const char *Ptr, unsigned Size) {
-  if (OutBufCur+Size > OutBufEnd)
-    flush_impl();
+  if (!OutBufStart)
+    SetBufferSize(4096);
+  else if (OutBufCur+Size > OutBufEnd)
+    flush_nonempty();
   
   // Handle short strings specially, memcpy isn't very good at very short
   // strings.
@@ -153,14 +163,14 @@
       Ptr += NumToEmit;
       Size -= NumToEmit;
       OutBufCur = OutBufStart + NumToEmit;
-      flush_impl();
+      flush_nonempty();
     }
     break;
   }
   OutBufCur += Size;
 
   if (Unbuffered)
-    flush_impl();
+    flush();
   return *this;
 }
 
@@ -260,11 +270,8 @@
 
 void raw_fd_ostream::flush_impl() {
   assert (FD >= 0 && "File already closed.");
-  if (OutBufCur-OutBufStart) {
-    pos += (OutBufCur - OutBufStart);
-    ::write(FD, OutBufStart, OutBufCur-OutBufStart);
-  }
-  HandleFlush();
+  pos += (OutBufCur - OutBufStart);
+  ::write(FD, OutBufStart, OutBufCur-OutBufStart);
 }
 
 void raw_fd_ostream::close() {
@@ -319,9 +326,7 @@
 /// subclasses.  This outputs the currently buffered data and resets the
 /// buffer to empty.
 void raw_os_ostream::flush_impl() {
-  if (OutBufCur-OutBufStart)
-    OS.write(OutBufStart, OutBufCur-OutBufStart);
-  HandleFlush();
+  OS.write(OutBufStart, OutBufCur-OutBufStart);
 }
 
 //===----------------------------------------------------------------------===//
@@ -336,9 +341,7 @@
 /// subclasses.  This outputs the currently buffered data and resets the
 /// buffer to empty.
 void raw_string_ostream::flush_impl() {
-  if (OutBufCur-OutBufStart)
-    OS.append(OutBufStart, OutBufCur-OutBufStart);
-  HandleFlush();
+  OS.append(OutBufStart, OutBufCur-OutBufStart);
 }
 
 //===----------------------------------------------------------------------===//
@@ -353,8 +356,6 @@
 /// subclasses.  This outputs the currently buffered data and resets the
 /// buffer to empty.
 void raw_svector_ostream::flush_impl() {
-  if (OutBufCur-OutBufStart)
-    OS.append(OutBufStart, OutBufCur);
-  HandleFlush();
+  OS.append(OutBufStart, OutBufCur);
 }
 





More information about the llvm-commits mailing list