Fix typedef ordering in codegen
This commit is contained in:
parent
a5c7823a29
commit
82b67dfaaa
@ -125,6 +125,17 @@ impl mir::GlobalKind {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_typekey(ty: &TypeKind) -> Option<CustomTypeKey> {
|
||||||
|
match ty {
|
||||||
|
TypeKind::Array(type_kind, _) => get_typekey(type_kind.as_ref()),
|
||||||
|
TypeKind::CustomType(custom_type_key) => Some(custom_type_key.clone()),
|
||||||
|
TypeKind::Borrow(type_kind, _) => get_typekey(type_kind.as_ref()),
|
||||||
|
TypeKind::UserPtr(type_kind) => get_typekey(type_kind.as_ref()),
|
||||||
|
TypeKind::CodegenPtr(type_kind) => get_typekey(type_kind.as_ref()),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl mir::Module {
|
impl mir::Module {
|
||||||
fn codegen<'ctx>(
|
fn codegen<'ctx>(
|
||||||
&'ctx self,
|
&'ctx self,
|
||||||
@ -186,33 +197,35 @@ impl mir::Module {
|
|||||||
// somewhat easily sort the type-definitions such that we can process
|
// somewhat easily sort the type-definitions such that we can process
|
||||||
// the ones with no depencencies first, and later the ones that depend
|
// the ones with no depencencies first, and later the ones that depend
|
||||||
// on the earlier ones.
|
// on the earlier ones.
|
||||||
let mut typekeys_seen = HashSet::new();
|
let mut typekeys_seen: HashSet<CustomTypeKey> = HashSet::new();
|
||||||
let mut typedefs_sorted = Vec::new();
|
let mut typedefs_sorted: Vec<TypeDefinition> = Vec::new();
|
||||||
let mut typedefs_left = self.typedefs.clone();
|
let mut typedefs_left = self.typedefs.clone();
|
||||||
typedefs_left.reverse();
|
|
||||||
while let Some(typedef) = typedefs_left.pop() {
|
while let Some(typedef) = typedefs_left.pop() {
|
||||||
match &typedef.kind {
|
let is_ok = match &typedef.kind {
|
||||||
TypeDefinitionKind::Struct(StructType(fields)) => {
|
TypeDefinitionKind::Struct(StructType(fields)) => {
|
||||||
let mut is_ok = true;
|
let mut field_iter = fields.iter();
|
||||||
for field in fields {
|
loop {
|
||||||
match &field.1 {
|
if let Some(field) = field_iter.next() {
|
||||||
TypeKind::CustomType(type_key) => {
|
if let Some(key) = get_typekey(&field.1) {
|
||||||
if !typekeys_seen.contains(type_key) {
|
if typekeys_seen.contains(&key) {
|
||||||
is_ok = false;
|
break true;
|
||||||
break;
|
} else {
|
||||||
|
break false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
} else {
|
||||||
|
break true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if is_ok {
|
|
||||||
typekeys_seen.insert(CustomTypeKey(typedef.name.clone(), typedef.source_module));
|
|
||||||
typedefs_sorted.push(typedef);
|
|
||||||
} else {
|
|
||||||
typedefs_left.insert(0, typedef.clone());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if is_ok {
|
||||||
|
typekeys_seen.insert(CustomTypeKey(typedef.name.clone(), typedef.source_module));
|
||||||
|
typedefs_sorted.push(typedef);
|
||||||
|
} else {
|
||||||
|
typedefs_left.insert(0, typedef.clone());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for typedef in typedefs_sorted {
|
for typedef in typedefs_sorted {
|
||||||
|
@ -686,7 +686,9 @@ fn resolve_types_recursively(
|
|||||||
return Err(ErrorKind::CyclicalType(type_key.0.clone()));
|
return Err(ErrorKind::CyclicalType(type_key.0.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
types.insert(type_key.clone(), resolved_ty.1);
|
if type_key.1 != resolved_ty.1 {
|
||||||
|
types.insert(type_key.clone(), resolved_ty.1);
|
||||||
|
}
|
||||||
seen.insert(resolved_ty.clone());
|
seen.insert(resolved_ty.clone());
|
||||||
|
|
||||||
let resolved = modules
|
let resolved = modules
|
||||||
|
Loading…
Reference in New Issue
Block a user