1
1
//! This crate can parse a C++ “mangled” linker symbol name into a Rust value
2
2
//! 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.
6
6
//!
7
7
//! C++ requires the compiler to choose names for linker symbols consistently
8
8
//! across compilation units, so that two compilation units that have seen the
22
22
//!
23
23
//! The Itanium C++ ABI specifies that the linker symbol for that function must
24
24
//! 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
27
26
//! string `space::foo(int, int)`, which is more meaningful to the C++
28
27
//! developer.
29
28
@@ -151,7 +150,6 @@ where
151
150
///
152
151
/// ```
153
152
/// use cpp_demangle::Symbol;
154
- /// use std::string::ToString;
155
153
///
156
154
/// // First, something easy :)
157
155
///
@@ -160,7 +158,7 @@ where
160
158
/// let sym = Symbol::new(&mangled[..])
161
159
/// .expect("Could not parse mangled symbol!");
162
160
///
163
- /// let demangled = sym.to_string ();
161
+ /// let demangled = sym.demangle().unwrap ();
164
162
/// assert_eq!(demangled, "space::foo(int, bool, char)");
165
163
///
166
164
/// // Now let's try something a little more complicated!
@@ -171,7 +169,7 @@ where
171
169
/// let sym = Symbol::new(&mangled[..])
172
170
/// .expect("Could not parse mangled symbol!");
173
171
///
174
- /// let demangled = sym.to_string ();
172
+ /// let demangled = sym.demangle().unwrap ();
175
173
/// assert_eq!(
176
174
/// demangled,
177
175
/// "JS_GetPropertyDescriptorById(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, JS::MutableHandle<JS::PropertyDescriptor>)"
@@ -186,7 +184,6 @@ where
186
184
///
187
185
/// ```
188
186
/// use cpp_demangle::{ParseOptions, Symbol};
189
- /// use std::string::ToString;
190
187
///
191
188
/// // First, something easy :)
192
189
///
@@ -198,7 +195,7 @@ where
198
195
/// let sym = Symbol::new_with_options(&mangled[..], &parse_options)
199
196
/// .expect("Could not parse mangled symbol!");
200
197
///
201
- /// let demangled = sym.to_string ();
198
+ /// let demangled = sym.demangle().unwrap ();
202
199
/// assert_eq!(demangled, "space::foo(int, bool, char)");
203
200
///
204
201
/// // Now let's try something a little more complicated!
@@ -209,7 +206,7 @@ where
209
206
/// let sym = Symbol::new(&mangled[..])
210
207
/// .expect("Could not parse mangled symbol!");
211
208
///
212
- /// let demangled = sym.to_string ();
209
+ /// let demangled = sym.demangle().unwrap ();
213
210
/// assert_eq!(
214
211
/// demangled,
215
212
/// "JS_GetPropertyDescriptorById(JSContext*, JS::Handle<JSObject*>, JS::Handle<jsid>, JS::MutableHandle<JS::PropertyDescriptor>)"
@@ -252,27 +249,40 @@ substitutions = {:#?}",
252
249
Ok ( symbol)
253
250
}
254
251
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};
256
256
///
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.
259
271
///
260
272
/// ```
261
273
/// use cpp_demangle::{DemangleOptions, Symbol};
262
- /// use std::string::ToString;
263
274
///
264
275
/// let mangled = b"_ZN5space3fooEibc";
265
276
///
266
277
/// let sym = Symbol::new(&mangled[..])
267
278
/// .expect("Could not parse mangled symbol!");
268
279
///
269
- /// let demangled = sym.to_string();
270
280
/// 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)" );
273
283
/// ```
274
284
#[ allow( clippy:: trivially_copy_pass_by_ref) ]
275
- pub fn demangle (
285
+ pub fn demangle_with_options (
276
286
& self ,
277
287
options : & DemangleOptions ,
278
288
) -> :: core:: result:: Result < String , fmt:: Error > {
@@ -361,7 +371,6 @@ where
361
371
///
362
372
/// ```
363
373
/// use cpp_demangle::BorrowedSymbol;
364
- /// use std::string::ToString;
365
374
///
366
375
/// let mangled = b"_ZN5space3fooEibc and some trailing junk";
367
376
///
@@ -370,7 +379,7 @@ where
370
379
///
371
380
/// assert_eq!(tail, b" and some trailing junk");
372
381
///
373
- /// let demangled = sym.to_string ();
382
+ /// let demangled = sym.demangle().unwrap ();
374
383
/// assert_eq!(demangled, "space::foo(int, bool, char)");
375
384
/// ```
376
385
#[ inline]
@@ -387,7 +396,6 @@ where
387
396
///
388
397
/// ```
389
398
/// use cpp_demangle::{BorrowedSymbol, ParseOptions};
390
- /// use std::string::ToString;
391
399
///
392
400
/// let mangled = b"_ZN5space3fooEibc and some trailing junk";
393
401
///
@@ -399,7 +407,7 @@ where
399
407
///
400
408
/// assert_eq!(tail, b" and some trailing junk");
401
409
///
402
- /// let demangled = sym.to_string ();
410
+ /// let demangled = sym.demangle().unwrap ();
403
411
/// assert_eq!(demangled, "space::foo(int, bool, char)");
404
412
/// ```
405
413
pub fn with_tail_and_options (
@@ -433,26 +441,3 @@ substitutions = {:#?}",
433
441
Ok ( ( symbol, tail. into ( ) ) )
434
442
}
435
443
}
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