From 1dfb3d53cf2fa70481ed129e144e9b30703e1e64 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Wed, 9 Sep 2020 14:54:05 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Support=20`=3FQ=E2=80=A6@`=20productions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I *think* this is when you use a concrete class as an explicit interface, similar to what `` is in Rust, though not quite sure. --- src/lib.rs | 21 +++++++++++++++++++++ tests/test_basics.rs | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 375ae9d..ac8dfeb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -257,6 +257,7 @@ pub enum VarStorageKind { pub enum Name<'a> { Operator(Operator<'a>), NonTemplate(&'a [u8]), + AsInterface(&'a [u8]), Template(Box>, Params<'a>), Discriminator(i32), ParsedName(Box>), @@ -271,6 +272,10 @@ impl<'a> fmt::Debug for Name<'a> { .debug_tuple("NonTemplate") .field(&String::from_utf8_lossy(s)) .finish(), + Name::AsInterface(s) => f + .debug_tuple("AsInterface") + .field(&String::from_utf8_lossy(s)) + .finish(), Name::Template(ref name, ref params) => { f.debug_tuple("Template").field(name).field(params).finish() } @@ -875,6 +880,12 @@ impl<'a> ParserState<'a> { self.memorize_name(&name); } name + } else if self.consume(b"Q") { + let name = self.read_string()?; + self.expect(b"@")?; + let name = Name::AsInterface(name); + self.memorize_name(&name); + name } else { let discriminator = self.read_number()?; Name::Discriminator(discriminator) @@ -2176,6 +2187,11 @@ impl<'a> Serializer<'a> { Name::NonTemplate(ref name) => { self.w.write_all(name)?; } + Name::AsInterface(ref name) => { + write!(self.w, "[")?; + self.w.write_all(name)?; + write!(self.w, "]")?; + } Name::Template(ref name, ref params) => { self.write_one_name(name)?; self.write_tmpl_params(¶ms)?; @@ -2273,6 +2289,11 @@ impl<'a> Serializer<'a> { Name::NonTemplate(ref name) => { self.w.write_all(name)?; } + Name::AsInterface(ref name) => { + write!(self.w, "[")?; + self.w.write_all(name)?; + write!(self.w, "]")?; + } Name::Template(ref name, ref params) => { self.write_one_name(name)?; self.write_tmpl_params(¶ms)?; diff --git a/tests/test_basics.rs b/tests/test_basics.rs index 086a142..4ca129f 100644 --- a/tests/test_basics.rs +++ b/tests/test_basics.rs @@ -181,6 +181,11 @@ fn other_tests() { "?getFactory@SkImageShader@@UBEP6A?AV?$sk_sp@VSkFlattenable@@@@AAVSkReadBuffer@@@ZXZ", "public: virtual class sk_sp (__cdecl * __thiscall SkImageShader::getFactory(void) const)(class SkReadBuffer &)" ); + + expect( + "?Present1@?QIDXGISwapChain4@@CDXGISwapChain@@UAGJIIPBUDXGI_PRESENT_PARAMETERS@@@Z", + "public: virtual long __stdcall CDXGISwapChain::[IDXGISwapChain4]::Present1(unsigned int,unsigned int,struct DXGI_PRESENT_PARAMETERS const *)" + ); } #[test]