From f85899123610a11a1cb56d59bc0d27c59c34ab17 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 3 Sep 2022 12:58:01 -0400 Subject: [PATCH] Support __vt, __RTTI, fallback for other builtins --- src/lib.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a856058..822c0d0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -190,7 +190,7 @@ fn demangle_special_function(str: &str, class_name: &str) -> Option { Some(format!( "{}{}", match op { - "dt" => return Some(format!("~{}", class_name)), + "dt" => return Some(format!("~{}{}", class_name, args)), "ct" => class_name, "nw" => "operator new", "nwa" => "operator new[]", @@ -234,7 +234,8 @@ fn demangle_special_function(str: &str, class_name: &str) -> Option { "rf" => "operator->", "cl" => "operator()", "vc" => "operator[]", - _ => return None, + "vt" => "__vtable", + _ => return Some(format!("__{}{}", op, args)), }, args )) @@ -252,7 +253,7 @@ pub fn demangle(mut str: &str) -> Option { str = &str[2..]; } { - let idx = str.find("__")?; + let idx = str.rfind("__")?; let (fn_name_out, rest) = str.split_at(idx); if special { fn_name = fn_name_out.to_string(); @@ -494,5 +495,17 @@ mod tests { demangle("__ct<12CStringTable>__31CObjOwnerDerivedFromIObjUntypedFRCQ24rstl24auto_ptr<12CStringTable>"), Some("CObjOwnerDerivedFromIObjUntyped::CObjOwnerDerivedFromIObjUntyped(const rstl::auto_ptr&)".to_string()) ); + assert_eq!( + demangle("__vt__40TObjOwnerDerivedFromIObj<12CStringTable>"), + Some("TObjOwnerDerivedFromIObj::__vtable".to_string()) + ); + assert_eq!( + demangle("__RTTI__40TObjOwnerDerivedFromIObj<12CStringTable>"), + Some("TObjOwnerDerivedFromIObj::__RTTI".to_string()) + ); + assert_eq!( + demangle("__init__mNull__Q24rstl66basic_string,Q24rstl17rmemory_allocator>"), + Some("rstl::basic_string, rstl::rmemory_allocator>::__init__mNull".to_string()) + ); } }