Fix modules needing to be evaluated in order in codegen

This commit is contained in:
Sofia 2025-08-05 21:55:04 +03:00
parent aad3c93068
commit 015c111b29
6 changed files with 18 additions and 18 deletions

View File

@ -1,4 +1,4 @@
import triple_import_vec2::Vec2;
import triple_import_ship::Ship;
fn main() -> i32 { return 0; }
fn main() -> i32 { return 0; }

View File

@ -1,11 +1,3 @@
import triple_import_vec2::Vec2;
struct Ship { position: Vec2 }
impl Ship {
pub fn new() -> Ship {
Ship {
position: Vec2 {x: 15, y: 16}
}
}
}
struct Ship { position: Vec2 }

View File

@ -1,2 +1,6 @@
struct Vec2 { x: u32, y: u32 }
struct Vec2 { x: f32, y: f32 }
impl Vec2 {
pub fn zero() -> Vec2 { Vec2 { x: 0.0, y: 0.0 } }
}

View File

@ -62,10 +62,12 @@ impl mir::Context {
let mut modules = HashMap::new();
let mut modules_sorted = self.modules.iter().map(|(_, m)| m).collect::<Vec<_>>();
modules_sorted.sort_by(|m1, m2| m2.module_id.cmp(&m1.module_id));
for module in &modules_sorted {
modules.insert(module.module_id, *module);
}
for module in &modules_sorted {
let codegen = module.codegen(context, modules.clone())?;
modules.insert(module.module_id, codegen);
}
Ok(CodegenContext { context })
}
@ -128,7 +130,7 @@ impl mir::Module {
fn codegen<'ctx>(
&'ctx self,
context: &'ctx Context,
modules: HashMap<SourceModuleId, ModuleCodegen<'ctx>>,
modules: HashMap<SourceModuleId, &mir::Module>,
) -> Result<ModuleCodegen<'ctx>, ErrorKind> {
let mut module = context.module(&self.name, self.is_main);
let tokens = &self.tokens;
@ -321,11 +323,12 @@ impl mir::Module {
.collect();
let is_main = self.is_main && function.name == "main";
let module_prefix = if let Some(module) = function.source {
if module == self.module_id {
let module_prefix = if let Some(module_id) = function.source {
if module_id == self.module_id {
format!("reid.{}.", self.name)
} else {
format!("reid.{}.", modules.get(&module).unwrap().name)
dbg!(self.module_id, module_id);
format!("reid.{}.", modules.get(&module_id).unwrap().name)
}
} else {
format!("reid.intrinsic.")

View File

@ -11,6 +11,7 @@ use crate::{
codegen::intrinsics::LLVMIntrinsicKind,
lexer::FullToken,
mir::{
self,
pass::{AssociatedFunctionKey, BinopKey},
CustomTypeKey, FunctionParam, Metadata, SourceModuleId, TypeDefinition, TypeKind,
},
@ -20,7 +21,7 @@ use super::{allocator::Allocator, ErrorKind, IntrinsicFunction, ModuleCodegen};
pub struct Scope<'ctx, 'scope> {
pub(super) context: &'ctx Context,
pub(super) modules: &'scope HashMap<SourceModuleId, ModuleCodegen<'ctx>>,
pub(super) modules: &'scope HashMap<SourceModuleId, &'ctx mir::Module>,
pub(super) tokens: &'ctx Vec<FullToken>,
pub(super) module: &'ctx Module<'ctx>,
pub(super) module_id: SourceModuleId,

View File

@ -124,7 +124,7 @@ impl TypeKind {
type_map: &HashMap<CustomTypeKey, TypeDefinition>,
local_mod: SourceModuleId,
tokens: &Vec<FullToken>,
modules: &HashMap<SourceModuleId, ModuleCodegen>,
modules: &HashMap<SourceModuleId, &mir::Module>,
) -> DebugTypeValue {
if let Some(ty) = debug_types.get(self) {
return *ty;