@@ -68,7 +68,7 @@ use crate::ptr;
68
68
/// [`flush`]: BufWriter::flush
69
69
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
70
70
pub struct BufWriter < W : Write > {
71
- inner : Option < W > ,
71
+ inner : W ,
72
72
// The buffer. Avoid using this like a normal `Vec` in common code paths.
73
73
// That is, don't use `buf.push`, `buf.extend_from_slice`, or any other
74
74
// methods that require bounds checking or the like. This makes an enormous
@@ -112,7 +112,7 @@ impl<W: Write> BufWriter<W> {
112
112
/// ```
113
113
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
114
114
pub fn with_capacity ( capacity : usize , inner : W ) -> BufWriter < W > {
115
- BufWriter { inner : Some ( inner ) , buf : Vec :: with_capacity ( capacity) , panicked : false }
115
+ BufWriter { inner, buf : Vec :: with_capacity ( capacity) , panicked : false }
116
116
}
117
117
118
118
/// Send data in our local buffer into the inner writer, looping as
@@ -161,10 +161,9 @@ impl<W: Write> BufWriter<W> {
161
161
}
162
162
163
163
let mut guard = BufGuard :: new ( & mut self . buf ) ;
164
- let inner = self . inner . as_mut ( ) . unwrap ( ) ;
165
164
while !guard. done ( ) {
166
165
self . panicked = true ;
167
- let r = inner. write ( guard. remaining ( ) ) ;
166
+ let r = self . inner . write ( guard. remaining ( ) ) ;
168
167
self . panicked = false ;
169
168
170
169
match r {
@@ -212,7 +211,7 @@ impl<W: Write> BufWriter<W> {
212
211
/// ```
213
212
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
214
213
pub fn get_ref ( & self ) -> & W {
215
- self . inner . as_ref ( ) . unwrap ( )
214
+ & self . inner
216
215
}
217
216
218
217
/// Gets a mutable reference to the underlying writer.
@@ -232,7 +231,7 @@ impl<W: Write> BufWriter<W> {
232
231
/// ```
233
232
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
234
233
pub fn get_mut ( & mut self ) -> & mut W {
235
- self . inner . as_mut ( ) . unwrap ( )
234
+ & mut self . inner
236
235
}
237
236
238
237
/// Returns a reference to the internally buffered data.
@@ -308,7 +307,7 @@ impl<W: Write> BufWriter<W> {
308
307
pub fn into_inner ( mut self ) -> Result < W , IntoInnerError < BufWriter < W > > > {
309
308
match self . flush_buf ( ) {
310
309
Err ( e) => Err ( IntoInnerError :: new ( self , e) ) ,
311
- Ok ( ( ) ) => Ok ( self . inner . take ( ) . unwrap ( ) ) ,
310
+ Ok ( ( ) ) => Ok ( self . into_raw_parts ( ) . 0 ) ,
312
311
}
313
312
}
314
313
@@ -339,7 +338,12 @@ impl<W: Write> BufWriter<W> {
339
338
pub fn into_raw_parts ( mut self ) -> ( W , Result < Vec < u8 > , WriterPanicked > ) {
340
339
let buf = mem:: take ( & mut self . buf ) ;
341
340
let buf = if !self . panicked { Ok ( buf) } else { Err ( WriterPanicked { buf } ) } ;
342
- ( self . inner . take ( ) . unwrap ( ) , buf)
341
+
342
+ // SAFETY: forget(self) prevents double dropping inner
343
+ let inner = unsafe { ptr:: read ( & mut self . inner ) } ;
344
+ mem:: forget ( self ) ;
345
+
346
+ ( inner, buf)
343
347
}
344
348
345
349
// Ensure this function does not get inlined into `write`, so that it
@@ -643,7 +647,7 @@ where
643
647
{
644
648
fn fmt ( & self , fmt : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
645
649
fmt. debug_struct ( "BufWriter" )
646
- . field ( "writer" , & self . inner . as_ref ( ) . unwrap ( ) )
650
+ . field ( "writer" , & self . inner )
647
651
. field ( "buffer" , & format_args ! ( "{}/{}" , self . buf. len( ) , self . buf. capacity( ) ) )
648
652
. finish ( )
649
653
}
@@ -663,7 +667,7 @@ impl<W: Write + Seek> Seek for BufWriter<W> {
663
667
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
664
668
impl < W : Write > Drop for BufWriter < W > {
665
669
fn drop ( & mut self ) {
666
- if self . inner . is_some ( ) && !self . panicked {
670
+ if !self . panicked {
667
671
// dtors should not panic, so we ignore a failed flush
668
672
let _r = self . flush_buf ( ) ;
669
673
}
0 commit comments