Include stdlib in executable

This commit is contained in:
Sofia 2025-07-14 22:33:04 +03:00
parent fa4df50a04
commit 3f90b46dc8
2 changed files with 17 additions and 0 deletions

View File

@ -15,6 +15,8 @@ use super::{
Context, FunctionDefinition, Import, Metadata, Module, Context, FunctionDefinition, Import, Metadata, Module,
}; };
pub static STD_SOURCE: &str = include_str!("../lib/std.reid");
#[derive(thiserror::Error, Debug, Clone)] #[derive(thiserror::Error, Debug, Clone)]
pub enum ErrorKind { pub enum ErrorKind {
#[error("Unable to import inner modules, not yet supported: {0}")] #[error("Unable to import inner modules, not yet supported: {0}")]
@ -39,6 +41,19 @@ pub enum ErrorKind {
FunctionIsPrivate(String, String), FunctionIsPrivate(String, String),
} }
fn compile_main() -> super::Module {
let module = compile_module(STD_SOURCE, "standard_library".to_owned(), None, false).unwrap();
let mut mir_context = super::Context::from(vec![module], Default::default());
let mut refs = super::typerefs::TypeRefs::default();
mir_context.pass(&mut super::typeinference::TypeInference { refs: &mut refs });
mir_context.pass(&mut super::typecheck::TypeCheck { refs: &mut refs });
let std_compiled = mir_context.modules.remove(0);
std_compiled
}
/// Struct used to implement a type-checking pass that can be performed on the /// Struct used to implement a type-checking pass that can be performed on the
/// MIR. /// MIR.
pub struct LinkerPass; pub struct LinkerPass;
@ -71,6 +86,8 @@ impl Pass for LinkerPass {
modules.insert(module.name.clone(), Rc::new(RefCell::new(module))); modules.insert(module.name.clone(), Rc::new(RefCell::new(module)));
} }
modules.insert("std".to_owned(), Rc::new(RefCell::new(compile_main())));
let mut modules_to_process: Vec<Rc<RefCell<Module>>> = modules.values().cloned().collect(); let mut modules_to_process: Vec<Rc<RefCell<Module>>> = modules.values().cloned().collect();
while let Some(module) = modules_to_process.pop() { while let Some(module) = modules_to_process.pop() {