Add rust-lldb pretty printing for Path and PathBuf
Fixes https://github.com/rust-lang/rust/issues/120553 Fixes https://github.com/rust-lang/rust/issues/48462
This commit is contained in:
parent
45796d1c24
commit
41e97a0a3f
@ -16,4 +16,7 @@ type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)R
|
|||||||
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)RefMut<.+>$" --category Rust
|
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)RefMut<.+>$" --category Rust
|
||||||
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)RefCell<.+>$" --category Rust
|
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)RefCell<.+>$" --category Rust
|
||||||
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)NonZero<.+>$" --category Rust
|
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(core::([a-z_]+::)+)NonZero<.+>$" --category Rust
|
||||||
|
type summary add -F lldb_lookup.summary_lookup -e -x -h "^core::num::([a-z_]+::)*NonZero.+$" --category Rust
|
||||||
|
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(std::([a-z_]+::)+)PathBuf$" --category Rust
|
||||||
|
type summary add -F lldb_lookup.summary_lookup -e -x -h "^&(mut )?(std::([a-z_]+::)+)Path$" --category Rust
|
||||||
type category enable Rust
|
type category enable Rust
|
||||||
|
@ -58,6 +58,11 @@ def summary_lookup(valobj, dict):
|
|||||||
if rust_type == RustType.STD_NONZERO_NUMBER:
|
if rust_type == RustType.STD_NONZERO_NUMBER:
|
||||||
return StdNonZeroNumberSummaryProvider(valobj, dict)
|
return StdNonZeroNumberSummaryProvider(valobj, dict)
|
||||||
|
|
||||||
|
if rust_type == RustType.STD_PATHBUF:
|
||||||
|
return StdPathBufSummaryProvider(valobj, dict)
|
||||||
|
if rust_type == RustType.STD_PATH:
|
||||||
|
return StdPathSummaryProvider(valobj, dict)
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
@ -173,6 +173,35 @@ def StdStrSummaryProvider(valobj, dict):
|
|||||||
return '"%s"' % data
|
return '"%s"' % data
|
||||||
|
|
||||||
|
|
||||||
|
def StdPathBufSummaryProvider(valobj, dict):
|
||||||
|
# type: (SBValue, dict) -> str
|
||||||
|
# logger = Logger.Logger()
|
||||||
|
# logger >> "[StdPathBufSummaryProvider] for " + str(valobj.GetName())
|
||||||
|
return StdOsStringSummaryProvider(valobj.GetChildMemberWithName("inner"), dict)
|
||||||
|
|
||||||
|
|
||||||
|
def StdPathSummaryProvider(valobj, dict):
|
||||||
|
# type: (SBValue, dict) -> str
|
||||||
|
# logger = Logger.Logger()
|
||||||
|
# logger >> "[StdPathSummaryProvider] for " + str(valobj.GetName())
|
||||||
|
length = valobj.GetChildMemberWithName("length").GetValueAsUnsigned()
|
||||||
|
if length == 0:
|
||||||
|
return '""'
|
||||||
|
|
||||||
|
data_ptr = valobj.GetChildMemberWithName("data_ptr")
|
||||||
|
|
||||||
|
start = data_ptr.GetValueAsUnsigned()
|
||||||
|
error = SBError()
|
||||||
|
process = data_ptr.GetProcess()
|
||||||
|
data = process.ReadMemory(start, length, error)
|
||||||
|
if PY3:
|
||||||
|
try:
|
||||||
|
data = data.decode(encoding='UTF-8')
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
return '%r' % data
|
||||||
|
return '"%s"' % data
|
||||||
|
|
||||||
|
|
||||||
class StructSyntheticProvider:
|
class StructSyntheticProvider:
|
||||||
"""Pretty-printer for structs and struct enum variants"""
|
"""Pretty-printer for structs and struct enum variants"""
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@ class RustType(object):
|
|||||||
STD_REF_MUT = "StdRefMut"
|
STD_REF_MUT = "StdRefMut"
|
||||||
STD_REF_CELL = "StdRefCell"
|
STD_REF_CELL = "StdRefCell"
|
||||||
STD_NONZERO_NUMBER = "StdNonZeroNumber"
|
STD_NONZERO_NUMBER = "StdNonZeroNumber"
|
||||||
|
STD_PATH = "StdPath"
|
||||||
|
STD_PATHBUF = "StdPathBuf"
|
||||||
|
|
||||||
|
|
||||||
STD_STRING_REGEX = re.compile(r"^(alloc::([a-z_]+::)+)String$")
|
STD_STRING_REGEX = re.compile(r"^(alloc::([a-z_]+::)+)String$")
|
||||||
@ -51,6 +53,8 @@ STD_REF_REGEX = re.compile(r"^(core::([a-z_]+::)+)Ref<.+>$")
|
|||||||
STD_REF_MUT_REGEX = re.compile(r"^(core::([a-z_]+::)+)RefMut<.+>$")
|
STD_REF_MUT_REGEX = re.compile(r"^(core::([a-z_]+::)+)RefMut<.+>$")
|
||||||
STD_REF_CELL_REGEX = re.compile(r"^(core::([a-z_]+::)+)RefCell<.+>$")
|
STD_REF_CELL_REGEX = re.compile(r"^(core::([a-z_]+::)+)RefCell<.+>$")
|
||||||
STD_NONZERO_NUMBER_REGEX = re.compile(r"^(core::([a-z_]+::)+)NonZero<.+>$")
|
STD_NONZERO_NUMBER_REGEX = re.compile(r"^(core::([a-z_]+::)+)NonZero<.+>$")
|
||||||
|
STD_PATHBUF_REGEX = re.compile(r"^(std::([a-z_]+::)+)PathBuf$")
|
||||||
|
STD_PATH_REGEX = re.compile(r"^&(mut )?(std::([a-z_]+::)+)Path$")
|
||||||
|
|
||||||
TUPLE_ITEM_REGEX = re.compile(r"__\d+$")
|
TUPLE_ITEM_REGEX = re.compile(r"__\d+$")
|
||||||
|
|
||||||
@ -75,6 +79,8 @@ STD_TYPE_TO_REGEX = {
|
|||||||
RustType.STD_REF_CELL: STD_REF_CELL_REGEX,
|
RustType.STD_REF_CELL: STD_REF_CELL_REGEX,
|
||||||
RustType.STD_CELL: STD_CELL_REGEX,
|
RustType.STD_CELL: STD_CELL_REGEX,
|
||||||
RustType.STD_NONZERO_NUMBER: STD_NONZERO_NUMBER_REGEX,
|
RustType.STD_NONZERO_NUMBER: STD_NONZERO_NUMBER_REGEX,
|
||||||
|
RustType.STD_PATHBUF: STD_PATHBUF_REGEX,
|
||||||
|
RustType.STD_PATH: STD_PATH_REGEX,
|
||||||
}
|
}
|
||||||
|
|
||||||
def is_tuple_fields(fields):
|
def is_tuple_fields(fields):
|
||||||
|
29
tests/debuginfo/path.rs
Normal file
29
tests/debuginfo/path.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//@ ignore-gdb
|
||||||
|
|
||||||
|
//@ compile-flags:-g
|
||||||
|
|
||||||
|
// === LLDB TESTS =================================================================================
|
||||||
|
|
||||||
|
// lldb-command:run
|
||||||
|
|
||||||
|
// lldb-command:print pathbuf
|
||||||
|
// lldb-check:[...] "/some/path" { inner = "/some/path" { inner = { inner = size=10 { [0] = '/' [1] = 's' [2] = 'o' [3] = 'm' [4] = 'e' [5] = '/' [6] = 'p' [7] = 'a' [8] = 't' [9] = 'h' } } } }
|
||||||
|
// lldb-command:po pathbuf
|
||||||
|
// lldb-check:"/some/path"
|
||||||
|
// lldb-command:print path
|
||||||
|
// lldb-check:[...] "/some/path" { data_ptr = [...] length = 10 }
|
||||||
|
// lldb-command:po path
|
||||||
|
// lldb-check:"/some/path"
|
||||||
|
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let path = Path::new("/some/path");
|
||||||
|
let pathbuf = path.to_path_buf();
|
||||||
|
|
||||||
|
zzz(); // #break
|
||||||
|
}
|
||||||
|
|
||||||
|
fn zzz() {
|
||||||
|
()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user