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 {
|
||||
fn codegen<'ctx>(
|
||||
&'ctx self,
|
||||
@ -186,25 +197,29 @@ impl mir::Module {
|
||||
// somewhat easily sort the type-definitions such that we can process
|
||||
// the ones with no depencencies first, and later the ones that depend
|
||||
// on the earlier ones.
|
||||
let mut typekeys_seen = HashSet::new();
|
||||
let mut typedefs_sorted = Vec::new();
|
||||
let mut typekeys_seen: HashSet<CustomTypeKey> = HashSet::new();
|
||||
let mut typedefs_sorted: Vec<TypeDefinition> = Vec::new();
|
||||
let mut typedefs_left = self.typedefs.clone();
|
||||
typedefs_left.reverse();
|
||||
while let Some(typedef) = typedefs_left.pop() {
|
||||
match &typedef.kind {
|
||||
let is_ok = match &typedef.kind {
|
||||
TypeDefinitionKind::Struct(StructType(fields)) => {
|
||||
let mut is_ok = true;
|
||||
for field in fields {
|
||||
match &field.1 {
|
||||
TypeKind::CustomType(type_key) => {
|
||||
if !typekeys_seen.contains(type_key) {
|
||||
is_ok = false;
|
||||
break;
|
||||
let mut field_iter = fields.iter();
|
||||
loop {
|
||||
if let Some(field) = field_iter.next() {
|
||||
if let Some(key) = get_typekey(&field.1) {
|
||||
if typekeys_seen.contains(&key) {
|
||||
break true;
|
||||
} else {
|
||||
break false;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
} else {
|
||||
break true;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if is_ok {
|
||||
typekeys_seen.insert(CustomTypeKey(typedef.name.clone(), typedef.source_module));
|
||||
typedefs_sorted.push(typedef);
|
||||
@ -212,8 +227,6 @@ impl mir::Module {
|
||||
typedefs_left.insert(0, typedef.clone());
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
for typedef in typedefs_sorted {
|
||||
let type_key = CustomTypeKey(typedef.name.clone(), typedef.source_module);
|
||||
|
@ -686,7 +686,9 @@ fn resolve_types_recursively(
|
||||
return Err(ErrorKind::CyclicalType(type_key.0.clone()));
|
||||
}
|
||||
|
||||
if type_key.1 != resolved_ty.1 {
|
||||
types.insert(type_key.clone(), resolved_ty.1);
|
||||
}
|
||||
seen.insert(resolved_ty.clone());
|
||||
|
||||
let resolved = modules
|
||||
|
Loading…
Reference in New Issue
Block a user