Skip to content

Commit

Permalink
Auto merge of #42798 - stepancheg:args-debug, r=sfackler
Browse files Browse the repository at this point in the history
Better Debug for Args and ArgsOs

Display actual args instead of two dots.
  • Loading branch information
bors committed Jun 22, 2017
2 parents 03c8b92 + 275f9a0 commit 6f01c84
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 2 deletions.
18 changes: 16 additions & 2 deletions src/libstd/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -741,7 +741,9 @@ impl DoubleEndedIterator for Args {
#[stable(feature = "std_debug", since = "1.16.0")]
impl fmt::Debug for Args {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad("Args { .. }")
f.debug_struct("Args")
.field("inner", &self.inner.inner.inner_debug())
.finish()
}
}

Expand All @@ -766,7 +768,9 @@ impl DoubleEndedIterator for ArgsOs {
#[stable(feature = "std_debug", since = "1.16.0")]
impl fmt::Debug for ArgsOs {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad("ArgsOs { .. }")
f.debug_struct("ArgsOs")
.field("inner", &self.inner.inner_debug())
.finish()
}
}

Expand Down Expand Up @@ -1114,4 +1118,14 @@ mod tests {
r#""c:\te;st";c:\"#));
assert!(join_paths([r#"c:\te"st"#].iter().cloned()).is_err());
}

#[test]
fn args_debug() {
assert_eq!(
format!("Args {{ inner: {:?} }}", args().collect::<Vec<_>>()),
format!("{:?}", args()));
assert_eq!(
format!("ArgsOs {{ inner: {:?} }}", args_os().collect::<Vec<_>>()),
format!("{:?}", args_os()));
}
}
6 changes: 6 additions & 0 deletions src/libstd/sys/redox/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ pub struct Args {
_dont_send_or_sync_me: PhantomData<*mut ()>,
}

impl Args {
pub fn inner_debug(&self) -> &[OsString] {
self.iter.as_slice()
}
}

impl Iterator for Args {
type Item = OsString;
fn next(&mut self) -> Option<OsString> { self.iter.next() }
Expand Down
6 changes: 6 additions & 0 deletions src/libstd/sys/unix/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ pub struct Args {
_dont_send_or_sync_me: PhantomData<*mut ()>,
}

impl Args {
pub fn inner_debug(&self) -> &[OsString] {
self.iter.as_slice()
}
}

impl Iterator for Args {
type Item = OsString;
fn next(&mut self) -> Option<OsString> { self.iter.next() }
Expand Down
31 changes: 31 additions & 0 deletions src/libstd/sys/windows/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use slice;
use ops::Range;
use ffi::OsString;
use libc::{c_int, c_void};
use fmt;

pub unsafe fn init(_argc: isize, _argv: *const *const u8) { }

Expand All @@ -39,6 +40,36 @@ pub struct Args {
cur: *mut *mut u16,
}

pub struct ArgsInnerDebug<'a> {
args: &'a Args,
}

impl<'a> fmt::Debug for ArgsInnerDebug<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("[")?;
let mut first = true;
for i in self.args.range.clone() {
if !first {
f.write_str(", ")?;
}
first = false;

// Here we do allocation which could be avoided.
fmt::Debug::fmt(&unsafe { os_string_from_ptr(*self.args.cur.offset(i)) }, f)?;
}
f.write_str("]")?;
Ok(())
}
}

impl Args {
pub fn inner_debug(&self) -> ArgsInnerDebug {
ArgsInnerDebug {
args: self
}
}
}

unsafe fn os_string_from_ptr(ptr: *mut u16) -> OsString {
let mut len = 0;
while *ptr.offset(len) != 0 { len += 1; }
Expand Down

0 comments on commit 6f01c84

Please sign in to comment.