@@ -217,10 +217,14 @@ impl UnmanagedVector {
217
217
match source {
218
218
Some ( data) => {
219
219
let ( ptr, len, cap) = {
220
- // Can be replaced with Vec::into_raw_parts when stable
221
- // https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
222
- let mut data = mem:: ManuallyDrop :: new ( data) ;
223
- ( data. as_mut_ptr ( ) , data. len ( ) , data. capacity ( ) )
220
+ if data. capacity ( ) == 0 {
221
+ ( std:: ptr:: null_mut :: < u8 > ( ) , 0 , 0 )
222
+ } else {
223
+ // Can be replaced with Vec::into_raw_parts when stable
224
+ // https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_raw_parts
225
+ let mut data = mem:: ManuallyDrop :: new ( data) ;
226
+ ( data. as_mut_ptr ( ) , data. len ( ) , data. capacity ( ) )
227
+ }
224
228
} ;
225
229
Self {
226
230
is_none : false ,
@@ -261,6 +265,8 @@ impl UnmanagedVector {
261
265
pub fn consume ( self ) -> Option < Vec < u8 > > {
262
266
if self . is_none {
263
267
None
268
+ } else if self . cap == 0 {
269
+ Some ( Vec :: new ( ) )
264
270
} else {
265
271
Some ( unsafe { Vec :: from_raw_parts ( self . ptr , self . len , self . cap ) } )
266
272
}
@@ -349,7 +355,7 @@ mod test {
349
355
// Empty data
350
356
let x = UnmanagedVector :: new ( Some ( vec ! [ ] ) ) ;
351
357
assert ! ( !x. is_none) ;
352
- assert_eq ! ( x. ptr as usize , 0x01 ) ; // We probably don't get any guarantee for this, but good to know where the 0x01 marker pointer can come from
358
+ assert_eq ! ( x. ptr as usize , 0 ) ;
353
359
assert_eq ! ( x. len, 0 ) ;
354
360
assert_eq ! ( x. cap, 0 ) ;
355
361
@@ -373,7 +379,7 @@ mod test {
373
379
// Empty data
374
380
let x = UnmanagedVector :: some ( vec ! [ ] ) ;
375
381
assert ! ( !x. is_none) ;
376
- assert_eq ! ( x. ptr as usize , 0x01 ) ; // We probably don't get any guarantee for this, but good to know where the 0x01 marker pointer can come from
382
+ assert_eq ! ( x. ptr as usize , 0 ) ;
377
383
assert_eq ! ( x. len, 0 ) ;
378
384
assert_eq ! ( x. cap, 0 ) ;
379
385
}
0 commit comments