@@ -287,42 +287,29 @@ pub trait GenericPath: Clone + GenericPathUnsafe {
287287 /// Fails the task if the extension contains a NUL.
288288 fn set_extension < T : BytesContainer > ( & mut self , extension : T ) {
289289 assert ! ( !contains_nul( & extension) ) ;
290- // borrowck causes problems here too
291- let val = {
292- match self . filename ( ) {
293- None => None ,
294- Some ( name) => {
295- let dot = '.' as u8 ;
296- match name. rposition_elem ( & dot) {
297- None | Some ( 0 ) => {
298- if extension. container_as_bytes ( ) . is_empty ( ) {
299- None
300- } else {
301- let mut v;
302- let extension = extension. container_as_bytes ( ) ;
303- v = slice:: with_capacity ( name. len ( ) + extension. len ( ) + 1 ) ;
304- v. push_all ( name) ;
305- v. push ( dot) ;
306- v. push_all ( extension) ;
307- Some ( v)
308- }
309- }
310- Some ( idx) => {
311- if extension. container_as_bytes ( ) . is_empty ( ) {
312- Some ( name. slice_to ( idx) . to_owned ( ) )
313- } else {
314- let mut v;
315- let extension = extension. container_as_bytes ( ) ;
316- v = slice:: with_capacity ( idx + extension. len ( ) + 1 ) ;
317- v. push_all ( name. slice_to ( idx+1 ) ) ;
318- v. push_all ( extension) ;
319- Some ( v)
320- }
321- }
322- }
290+
291+ let val = self . filename ( ) . and_then ( |name| {
292+ let dot = '.' as u8 ;
293+ let extlen = extension. container_as_bytes ( ) . len ( ) ;
294+ match ( name. rposition_elem ( & dot) , extlen) {
295+ ( None , 0 ) | ( Some ( 0 ) , 0 ) => None ,
296+ ( Some ( idx) , 0 ) => Some ( name. slice_to ( idx) . to_owned ( ) ) ,
297+ ( idx, extlen) => {
298+ let idx = match idx {
299+ None | Some ( 0 ) => name. len ( ) ,
300+ Some ( val) => val
301+ } ;
302+
303+ let mut v;
304+ v = slice:: with_capacity ( idx + extlen + 1 ) ;
305+ v. push_all ( name. slice_to ( idx) ) ;
306+ v. push ( dot) ;
307+ v. push_all ( extension. container_as_bytes ( ) ) ;
308+ Some ( v)
323309 }
324310 }
325- } ;
311+ } ) ;
312+
326313 match val {
327314 None => ( ) ,
328315 Some ( v) => unsafe { self . set_filename_unchecked ( v) }
0 commit comments