fix: Support ?Q…@ productions

I *think* this is when you use a concrete class as an explicit interface,
similar to what `<Type as Trait>` is in Rust, though not quite sure.
This commit is contained in:
Arpad Borsos
2021-05-28 22:21:06 -04:00
committed by Markus Stange
parent f406647e57
commit 1dfb3d53cf
2 changed files with 26 additions and 0 deletions
+21
View File
@@ -257,6 +257,7 @@ pub enum VarStorageKind {
pub enum Name<'a> {
Operator(Operator<'a>),
NonTemplate(&'a [u8]),
AsInterface(&'a [u8]),
Template(Box<Name<'a>>, Params<'a>),
Discriminator(i32),
ParsedName(Box<ParseResult<'a>>),
@@ -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(&params)?;
@@ -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(&params)?;
+5
View File
@@ -181,6 +181,11 @@ fn other_tests() {
"?getFactory@SkImageShader@@UBEP6A?AV?$sk_sp@VSkFlattenable@@@@AAVSkReadBuffer@@@ZXZ",
"public: virtual class sk_sp<class SkFlattenable> (__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]