File tree Expand file tree Collapse file tree 4 files changed +59
-2
lines changed Expand file tree Collapse file tree 4 files changed +59
-2
lines changed Original file line number Diff line number Diff line change @@ -712,7 +712,9 @@ impl DoubleEndedIterator for Args {
712712#[ stable( feature = "std_debug" , since = "1.16.0" ) ]
713713impl fmt:: Debug for Args {
714714 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
715- f. pad ( "Args { .. }" )
715+ f. debug_struct ( "Args" )
716+ . field ( "inner" , & self . inner . inner . inner_debug ( ) )
717+ . finish ( )
716718 }
717719}
718720
@@ -737,7 +739,9 @@ impl DoubleEndedIterator for ArgsOs {
737739#[ stable( feature = "std_debug" , since = "1.16.0" ) ]
738740impl fmt:: Debug for ArgsOs {
739741 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
740- f. pad ( "ArgsOs { .. }" )
742+ f. debug_struct ( "ArgsOs" )
743+ . field ( "inner" , & self . inner . inner_debug ( ) )
744+ . finish ( )
741745 }
742746}
743747
@@ -1085,4 +1089,14 @@ mod tests {
10851089 r#""c:\te;st";c:\"# ) ) ;
10861090 assert ! ( join_paths( [ r#"c:\te"st"# ] . iter( ) . cloned( ) ) . is_err( ) ) ;
10871091 }
1092+
1093+ #[ test]
1094+ fn args_debug ( ) {
1095+ assert_eq ! (
1096+ format!( "Args {{ inner: {:?} }}" , args( ) . collect:: <Vec <_>>( ) ) ,
1097+ format!( "{:?}" , args( ) ) ) ;
1098+ assert_eq ! (
1099+ format!( "ArgsOs {{ inner: {:?} }}" , args_os( ) . collect:: <Vec <_>>( ) ) ,
1100+ format!( "{:?}" , args_os( ) ) ) ;
10881101 }
1102+ }
Original file line number Diff line number Diff line change @@ -35,6 +35,12 @@ pub struct Args {
3535 _dont_send_or_sync_me : PhantomData < * mut ( ) > ,
3636}
3737
38+ impl Args {
39+ pub fn inner_debug ( & self ) -> & [ OsString ] {
40+ self . iter . as_slice ( )
41+ }
42+ }
43+
3844impl Iterator for Args {
3945 type Item = OsString ;
4046 fn next ( & mut self ) -> Option < OsString > { self . iter . next ( ) }
Original file line number Diff line number Diff line change @@ -35,6 +35,12 @@ pub struct Args {
3535 _dont_send_or_sync_me : PhantomData < * mut ( ) > ,
3636}
3737
38+ impl Args {
39+ pub fn inner_debug ( & self ) -> & [ OsString ] {
40+ self . iter . as_slice ( )
41+ }
42+ }
43+
3844impl Iterator for Args {
3945 type Item = OsString ;
4046 fn next ( & mut self ) -> Option < OsString > { self . iter . next ( ) }
Original file line number Diff line number Diff line change @@ -16,6 +16,7 @@ use slice;
1616use ops:: Range ;
1717use ffi:: OsString ;
1818use libc:: { c_int, c_void} ;
19+ use fmt;
1920
2021pub unsafe fn init ( _argc : isize , _argv : * const * const u8 ) { }
2122
@@ -39,6 +40,36 @@ pub struct Args {
3940 cur : * mut * mut u16 ,
4041}
4142
43+ pub struct ArgsInnerDebug < ' a > {
44+ args : & ' a Args ,
45+ }
46+
47+ impl < ' a > fmt:: Debug for ArgsInnerDebug < ' a > {
48+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
49+ f. write_str ( "[" ) ?;
50+ let mut first = true ;
51+ for i in self . args . range . clone ( ) {
52+ if !first {
53+ f. write_str ( ", " ) ?;
54+ }
55+ first = false ;
56+
57+ // Here we do allocation which could be avoided.
58+ fmt:: Debug :: fmt ( & unsafe { os_string_from_ptr ( * self . args . cur . offset ( i) ) } , f) ?;
59+ }
60+ f. write_str ( "]" ) ?;
61+ Ok ( ( ) )
62+ }
63+ }
64+
65+ impl Args {
66+ pub fn inner_debug ( & self ) -> ArgsInnerDebug {
67+ ArgsInnerDebug {
68+ args : self
69+ }
70+ }
71+ }
72+
4273unsafe fn os_string_from_ptr ( ptr : * mut u16 ) -> OsString {
4374 let mut len = 0 ;
4475 while * ptr. offset ( len) != 0 { len += 1 ; }
You can’t perform that action at this time.
0 commit comments