From bacdf3a7ba3ca8d1641015bde272a2bb6ba04d0a Mon Sep 17 00:00:00 2001 From: Nathan Froyd Date: Thu, 17 May 2018 21:00:59 -0400 Subject: [PATCH] demangle references to function types This case is exactly the same as the P6 special case in `read_var_type`, but for references this time. Fixes #20. --- src/lib.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index d059dac..740f714 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -773,6 +773,11 @@ impl<'a> ParserState<'a> { return Ok(Type::Enum(name, sc)); } + if self.consume(b"A6") { + let func_type = self.read_func_type()?; + return Ok(Type::Ref(Box::new(func_type), sc)); + } + if self.consume(b"P6") { let func_type = self.read_func_type()?; return Ok(Type::Ptr(Box::new(func_type), sc)); @@ -1689,6 +1694,14 @@ mod tests { "??B?$function@$$A6AXXZ@std@@QBE_NXZ", "public: __thiscall std::function::operator bool(void)const", ); + expect( + "??$?RA6AXXZ$$V@SkOnce@@QAEXA6AXXZ@Z", + "public: void __thiscall SkOnce::operator()(void __cdecl (&)(void))", + ); + expect_undname_failure( + "??$?RA6AXXZ$$V@SkOnce@@QAEXA6AXXZ@Z", + "public: void __thiscall SkOnce::operator()(void (__cdecl&)(void))", + ); } #[test]