Skip to content

Commit 1b09211

Browse files
authored
Fix nested type indexing in the windows-metadata reader (#3799)
1 parent f304f96 commit 1b09211

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

crates/libs/metadata/src/reader/type_index.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ impl TypeIndex {
3535
}
3636

3737
for map in file.NestedClass() {
38-
let inner = file.usize(map, TypeDef::TABLE, 0);
39-
let outer = file.usize(map, TypeDef::TABLE, 1);
38+
let inner = file.usize(map, NestedClass::TABLE, 0) - 1;
39+
let outer = file.usize(map, NestedClass::TABLE, 1) - 1;
4040
nested.entry((file_pos, outer)).or_default().push(inner);
4141
}
4242
}

crates/tests/libs/metadata/tests/reader.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,44 @@ fn array() {
7272

7373
assert_eq!(field.ty(), Type::ArrayFixed(Box::new(Type::U8), 512));
7474
}
75+
76+
#[test]
77+
fn nested() {
78+
let index =
79+
reader::TypeIndex::read("../../../libs/bindgen/default/Windows.Win32.winmd").unwrap();
80+
81+
let def = index
82+
.types()
83+
.find(|def| def.name() == "D3D10_BUFFER_RTV")
84+
.unwrap();
85+
86+
let fields: Vec<reader::Field> = def.fields().collect();
87+
assert_eq!(fields.len(), 2);
88+
89+
assert_eq!(fields[0].name(), "Anonymous1");
90+
assert_eq!(fields[1].name(), "Anonymous2");
91+
92+
assert_eq!(fields[0].ty(), Type::named("", "_Anonymous1_e__Union"));
93+
assert_eq!(fields[1].ty(), Type::named("", "_Anonymous2_e__Union"));
94+
95+
let types: Vec<reader::TypeDef> = index.nested(def).collect();
96+
assert_eq!(types.len(), 2);
97+
98+
assert_eq!(types[0].namespace(), "");
99+
assert_eq!(types[1].namespace(), "");
100+
101+
assert_eq!(types[0].name(), "_Anonymous1_e__Union");
102+
assert_eq!(types[1].name(), "_Anonymous2_e__Union");
103+
104+
let fields: Vec<reader::Field> = types[0].fields().collect();
105+
assert_eq!(fields.len(), 2);
106+
107+
assert_eq!(fields[0].name(), "FirstElement");
108+
assert_eq!(fields[1].name(), "ElementOffset");
109+
110+
let fields: Vec<reader::Field> = types[1].fields().collect();
111+
assert_eq!(fields.len(), 2);
112+
113+
assert_eq!(fields[0].name(), "NumElements");
114+
assert_eq!(fields[1].name(), "ElementWidth");
115+
}

0 commit comments

Comments
 (0)