11//! This crate can parse a C++ “mangled” linker symbol name into a Rust value
22//! describing what the name refers to: a variable, a function, a virtual table,
3- //! etc. The description type implements `Display`, producing human-readable
4- //! text describing the mangled name. Debuggers and profilers can use this crate
5- //! to provide more meaningful output.
3+ //! etc. The description type implements functions such as `demangle()`,
4+ //! producing human-readable text describing the mangled name. Debuggers and
5+ //! profilers can use this crate to provide more meaningful output.
66//!
77//! C++ requires the compiler to choose names for linker symbols consistently
88//! across compilation units, so that two compilation units that have seen the
2222//!
2323//! The Itanium C++ ABI specifies that the linker symbol for that function must
2424//! be named `_ZN5space3fooEii`. This crate can parse that name into a Rust
25- //! value representing its structure. Formatting the value with the `format!`
26- //! macro or the `std::string::ToString::to_string` trait method yields the
25+ //! value representing its structure. That Rust value can be `demangle()`d to the
2726//! string `space::foo(int, int)`, which is more meaningful to the C++
2827//! developer.
2928
@@ -151,7 +150,6 @@ where
151150 ///
152151 /// ```
153152 /// use cpp_demangle::Symbol;
154- /// use std::string::ToString;
155153 ///
156154 /// // First, something easy :)
157155 ///
@@ -160,7 +158,7 @@ where
160158 /// let sym = Symbol::new(&mangled[..])
161159 /// .expect("Could not parse mangled symbol!");
162160 ///
163- /// let demangled = sym.to_string ();
161+ /// let demangled = sym.demangle().unwrap ();
164162 /// assert_eq!(demangled, "space::foo(int, bool, char)");
165163 ///
166164 /// // Now let's try something a little more complicated!
@@ -171,7 +169,7 @@ where
171169 /// let sym = Symbol::new(&mangled[..])
172170 /// .expect("Could not parse mangled symbol!");
173171 ///
174- /// let demangled = sym.to_string ();
172+ /// let demangled = sym.demangle().unwrap ();
175173 /// assert_eq!(
176174 /// demangled,
177175 /// "JS_GetPropertyDescriptorById(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, JS::MutableHandle<JS::PropertyDescriptor>)"
@@ -186,7 +184,6 @@ where
186184 ///
187185 /// ```
188186 /// use cpp_demangle::{ParseOptions, Symbol};
189- /// use std::string::ToString;
190187 ///
191188 /// // First, something easy :)
192189 ///
@@ -198,7 +195,7 @@ where
198195 /// let sym = Symbol::new_with_options(&mangled[..], &parse_options)
199196 /// .expect("Could not parse mangled symbol!");
200197 ///
201- /// let demangled = sym.to_string ();
198+ /// let demangled = sym.demangle().unwrap ();
202199 /// assert_eq!(demangled, "space::foo(int, bool, char)");
203200 ///
204201 /// // Now let's try something a little more complicated!
@@ -209,7 +206,7 @@ where
209206 /// let sym = Symbol::new(&mangled[..])
210207 /// .expect("Could not parse mangled symbol!");
211208 ///
212- /// let demangled = sym.to_string ();
209+ /// let demangled = sym.demangle().unwrap ();
213210 /// assert_eq!(
214211 /// demangled,
215212 /// "JS_GetPropertyDescriptorById(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, JS::MutableHandle<JS::PropertyDescriptor>)"
@@ -252,27 +249,40 @@ substitutions = {:#?}",
252249 Ok ( symbol)
253250 }
254251
255- /// Demangle the symbol and return it as a String.
252+ /// Demangle the symbol and return it as a String, with the default options.
253+ ///
254+ /// ```
255+ /// use cpp_demangle::{DemangleOptions, Symbol};
256256 ///
257- /// Unlike the `ToString` implementation, this function allows options to
258- /// be specified.
257+ /// let mangled = b"_ZN5space3fooEibc";
258+ ///
259+ /// let sym = Symbol::new(&mangled[..])
260+ /// .expect("Could not parse mangled symbol!");
261+ ///
262+ /// let demangled = sym.demangle().unwrap();
263+ /// assert_eq!(demangled, "space::foo(int, bool, char)");
264+ /// ```
265+ #[ inline]
266+ pub fn demangle ( & self ) -> :: core:: result:: Result < String , fmt:: Error > {
267+ self . demangle_with_options ( & Default :: default ( ) )
268+ }
269+
270+ /// Demangle the symbol and return it as a String.
259271 ///
260272 /// ```
261273 /// use cpp_demangle::{DemangleOptions, Symbol};
262- /// use std::string::ToString;
263274 ///
264275 /// let mangled = b"_ZN5space3fooEibc";
265276 ///
266277 /// let sym = Symbol::new(&mangled[..])
267278 /// .expect("Could not parse mangled symbol!");
268279 ///
269- /// let demangled = sym.to_string();
270280 /// let options = DemangleOptions::default();
271- /// let demangled_again = sym.demangle (&options).unwrap();
272- /// assert_eq!(demangled_again, demangled );
281+ /// let demangled = sym.demangle_with_options (&options).unwrap();
282+ /// assert_eq!(demangled, "space::foo(int, bool, char)" );
273283 /// ```
274284 #[ allow( clippy:: trivially_copy_pass_by_ref) ]
275- pub fn demangle (
285+ pub fn demangle_with_options (
276286 & self ,
277287 options : & DemangleOptions ,
278288 ) -> :: core:: result:: Result < String , fmt:: Error > {
@@ -361,7 +371,6 @@ where
361371 ///
362372 /// ```
363373 /// use cpp_demangle::BorrowedSymbol;
364- /// use std::string::ToString;
365374 ///
366375 /// let mangled = b"_ZN5space3fooEibc and some trailing junk";
367376 ///
@@ -370,7 +379,7 @@ where
370379 ///
371380 /// assert_eq!(tail, b" and some trailing junk");
372381 ///
373- /// let demangled = sym.to_string ();
382+ /// let demangled = sym.demangle().unwrap ();
374383 /// assert_eq!(demangled, "space::foo(int, bool, char)");
375384 /// ```
376385 #[ inline]
@@ -387,7 +396,6 @@ where
387396 ///
388397 /// ```
389398 /// use cpp_demangle::{BorrowedSymbol, ParseOptions};
390- /// use std::string::ToString;
391399 ///
392400 /// let mangled = b"_ZN5space3fooEibc and some trailing junk";
393401 ///
@@ -399,7 +407,7 @@ where
399407 ///
400408 /// assert_eq!(tail, b" and some trailing junk");
401409 ///
402- /// let demangled = sym.to_string ();
410+ /// let demangled = sym.demangle().unwrap ();
403411 /// assert_eq!(demangled, "space::foo(int, bool, char)");
404412 /// ```
405413 pub fn with_tail_and_options (
@@ -433,26 +441,3 @@ substitutions = {:#?}",
433441 Ok ( ( symbol, tail. into ( ) ) )
434442 }
435443}
436-
437- impl < T > fmt:: Display for Symbol < T >
438- where
439- T : AsRef < [ u8 ] > ,
440- {
441- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
442- let mut out = String :: new ( ) ;
443- {
444- let options = DemangleOptions :: default ( ) ;
445- let mut ctx = ast:: DemangleContext :: new (
446- & self . substitutions ,
447- self . raw . as_ref ( ) ,
448- options,
449- & mut out,
450- ) ;
451- self . parsed . demangle ( & mut ctx, None ) . map_err ( |err| {
452- log ! ( "Demangling error: {:#?}" , err) ;
453- fmt:: Error
454- } ) ?;
455- }
456- write ! ( f, "{}" , & out)
457- }
458- }
0 commit comments