Auto merge of #42798 - stepancheg:args-debug, r=sfackler

Better Debug for Args and ArgsOs

Display actual args instead of two dots.
This commit is contained in:
bors 2017-06-22 10:34:21 +00:00
commit 6f01c84fc8
4 changed files with 59 additions and 2 deletions

View file

@ -741,7 +741,9 @@ fn next_back(&mut self) -> Option<String> {
#[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()
}
}
@ -766,7 +768,9 @@ fn next_back(&mut self) -> Option<OsString> { self.inner.next_back() }
#[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()
}
}
@ -1114,4 +1118,14 @@ fn test_eq(input: &[&str], output: &str) -> bool {
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()));
}
}

View file

@ -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() }

View file

@ -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() }

View file

@ -16,6 +16,7 @@
use ops::Range;
use ffi::OsString;
use libc::{c_int, c_void};
use fmt;
pub unsafe fn init(_argc: isize, _argv: *const *const u8) { }
@ -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; }