feat: JIT (WIP)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user