about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorgentoo90 <gentoo90@gmail.com>2017-06-02 16:18:00 +0300
committergentoo90 <gentoo90@gmail.com>2017-06-02 16:18:00 +0300
commitc1f687b73fc76808d8f4555d6f77b7f64e554fa9 (patch)
tree86175ea36005e296752f269b6a58e9f35960bd09 /src
parentc7ef85ca0eb09acad16d2f969e69737308290309 (diff)
downloadrust-c1f687b73fc76808d8f4555d6f77b7f64e554fa9.tar.gz
rust-c1f687b73fc76808d8f4555d6f77b7f64e554fa9.zip
Add GDB pretty-printer for OsString
Diffstat (limited to 'src')
-rw-r--r--src/etc/debugger_pretty_printers_common.py9
-rwxr-xr-xsrc/etc/gdb_rust_pretty_printing.py18
-rw-r--r--src/test/debuginfo/pretty-std.rs12
3 files changed, 37 insertions, 2 deletions
diff --git a/src/etc/debugger_pretty_printers_common.py b/src/etc/debugger_pretty_printers_common.py
index 5e3ff5246a9..7eb008a05f6 100644
--- a/src/etc/debugger_pretty_printers_common.py
+++ b/src/etc/debugger_pretty_printers_common.py
@@ -46,6 +46,7 @@ TYPE_KIND_CSTYLE_ENUM       = 14
 TYPE_KIND_PTR               = 15
 TYPE_KIND_FIXED_SIZE_VEC    = 16
 TYPE_KIND_REGULAR_UNION     = 17
+TYPE_KIND_OS_STRING         = 18
 
 ENCODED_ENUM_PREFIX = "RUST$ENCODED$ENUM$"
 ENUM_DISR_FIELD_NAME = "RUST$ENUM$DISR"
@@ -64,6 +65,9 @@ STD_VEC_FIELD_NAMES = [STD_VEC_FIELD_NAME_BUF,
 # std::String related constants
 STD_STRING_FIELD_NAMES = ["vec"]
 
+# std::ffi::OsString related constants
+OS_STRING_FIELD_NAMES = ["inner"]
+
 
 class Type(object):
     """
@@ -162,6 +166,11 @@ class Type(object):
             self.__conforms_to_field_layout(STD_STRING_FIELD_NAMES)):
             return TYPE_KIND_STD_STRING
 
+        # OS STRING
+        if (unqualified_type_name == "OsString" and
+            self.__conforms_to_field_layout(OS_STRING_FIELD_NAMES)):
+            return TYPE_KIND_OS_STRING
+
         # ENUM VARIANTS
         if fields[0].name == ENUM_DISR_FIELD_NAME:
             if field_count == 1:
diff --git a/src/etc/gdb_rust_pretty_printing.py b/src/etc/gdb_rust_pretty_printing.py
index aa1d00eaaab..d2bc7dd53df 100755
--- a/src/etc/gdb_rust_pretty_printing.py
+++ b/src/etc/gdb_rust_pretty_printing.py
@@ -125,6 +125,9 @@ def rust_pretty_printer_lookup_function(gdb_val):
     if type_kind == rustpp.TYPE_KIND_STD_STRING:
         return RustStdStringPrinter(val)
 
+    if type_kind == rustpp.TYPE_KIND_OS_STRING:
+        return RustOsStringPrinter(val)
+
     if type_kind == rustpp.TYPE_KIND_TUPLE:
         return RustStructPrinter(val,
                                  omit_first_field = False,
@@ -269,6 +272,21 @@ class RustStdStringPrinter(object):
                                                             length=length)
 
 
+class RustOsStringPrinter(object):
+    def __init__(self, val):
+        self.__val = val
+
+    def to_string(self):
+        buf = self.__val.get_child_at_index(0)
+        vec = buf.get_child_at_index(0)
+        if vec.type.get_unqualified_type_name() == "Wtf8Buf":
+            vec = vec.get_child_at_index(0)
+
+        (length, data_ptr, cap) = rustpp.extract_length_ptr_and_cap_from_std_vec(
+            vec)
+        return '"%s"' % data_ptr.get_wrapped_value().string(length=length)
+
+
 class RustCStyleVariantPrinter(object):
     def __init__(self, val):
         assert val.type.get_dwarf_type_kind() == rustpp.DWARF_TYPE_CODE_ENUM
diff --git a/src/test/debuginfo/pretty-std.rs b/src/test/debuginfo/pretty-std.rs
index a1a2cd67bb3..88a3c76b858 100644
--- a/src/test/debuginfo/pretty-std.rs
+++ b/src/test/debuginfo/pretty-std.rs
@@ -38,8 +38,11 @@
 // gdbg-check:$6 = None
 // gdbr-check:$6 = core::option::Option::None
 
-// gdb-command: print some_string
-// gdbr-check:$7 = Some = {"IAMA optional string!"}
+// gdbr-command: print os_string
+// gdbr-check:$7 = "IAMA OS string 😃"
+
+// gdbr-command: print some_string
+// gdbr-check:$8 = Some = {"IAMA optional string!"}
 
 
 // === LLDB TESTS ==================================================================================
@@ -66,6 +69,8 @@
 
 
 #![allow(unused_variables)]
+use std::ffi::OsString;
+
 
 fn main() {
 
@@ -81,6 +86,9 @@ fn main() {
     // String
     let string = "IAMA string!".to_string();
 
+    // OsString
+    let os_string = OsString::from("IAMA OS string \u{1F603}");
+
     // Option
     let some = Some(8i16);
     let none: Option<i64> = None;