feat: JIT (WIP)

This commit is contained in:
2025-06-14 16:53:45 +08:00
parent 49255948ff
commit 7b6db44207
4 changed files with 96 additions and 39 deletions

View File

@@ -1,7 +1,7 @@
use derive_more::{IsVariant, TryUnwrap, Unwrap};
use hashbrown::HashMap;
use ecow::EcoString;
use hashbrown::HashMap;
use inkwell::values::{StructValue, FunctionValue};
use itertools::Itertools;
use rnix::ast::HasEntry;
use rnix::ast::{self, Expr};
@@ -91,9 +91,9 @@ macro_rules! ir {
}
impl JITCompile for Ir {
fn compile(self, ctx: &JITContext) {
fn compile<'ctx>(self, ctx: &JITContext<'ctx>, func: FunctionValue<'ctx>) -> StructValue<'ctx>{
match self {
$(Ir::$ty(ir) => ir.compile(ctx),)*
$(Ir::$ty(ir) => ir.compile(ctx, func),)*
}
}
}
@@ -183,7 +183,7 @@ struct Env<'a, 'env> {
env: EnvNode<'a>,
prev: Option<&'env Env<'a, 'env>>,
arg_level: usize,
let_level: usize
let_level: usize,
}
enum EnvNode<'a> {
@@ -208,7 +208,7 @@ impl<'a, 'env> Env<'a, 'env> {
env: EnvNode::Builtins(base),
prev: None,
arg_level: 0,
let_level: 0
let_level: 0,
}
}
@@ -217,7 +217,7 @@ impl<'a, 'env> Env<'a, 'env> {
env: EnvNode::Let(map),
prev: Some(self),
arg_level: self.arg_level,
let_level: self.let_level + 1
let_level: self.let_level + 1,
}
}
@@ -226,7 +226,7 @@ impl<'a, 'env> Env<'a, 'env> {
env: EnvNode::SingleArg(ident),
prev: Some(self),
arg_level: self.arg_level + 1,
let_level: self.let_level
let_level: self.let_level,
}
}
@@ -239,7 +239,7 @@ impl<'a, 'env> Env<'a, 'env> {
env: EnvNode::MultiArg(map, alias),
prev: Some(self),
arg_level: self.arg_level + 1,
let_level: 0
let_level: 0,
}
}
@@ -248,7 +248,7 @@ impl<'a, 'env> Env<'a, 'env> {
env: EnvNode::With,
prev: Some(self),
arg_level: self.arg_level,
let_level: self.let_level
let_level: self.let_level,
}
}
@@ -283,7 +283,9 @@ impl<'a, 'env> Env<'a, 'env> {
}
SingleArg(arg) => {
if arg == ident {
return Ok(LookupResult::SingleArg { level: arg_level - 1 });
return Ok(LookupResult::SingleArg {
level: arg_level - 1,
});
} else {
arg_level -= 1;
}
@@ -295,7 +297,9 @@ impl<'a, 'env> Env<'a, 'env> {
default: default.clone(),
});
} else if alias.as_ref() == Some(ident) {
return Ok(LookupResult::SingleArg { level: arg_level - 1 });
return Ok(LookupResult::SingleArg {
level: arg_level - 1,
});
} else {
arg_level -= 1;
}