chore: cargo clippy
This commit is contained in:
@@ -716,7 +716,7 @@ fn downgrade_attr(attr: ast::Attr, ctx: &mut DowngradeContext) -> Result<Attr> {
|
|||||||
Ident(ident) => Ok(Attr::Str(ctx.new_sym(ident.to_string()))),
|
Ident(ident) => Ok(Attr::Str(ctx.new_sym(ident.to_string()))),
|
||||||
Str(string) => {
|
Str(string) => {
|
||||||
let parts = string.normalized_parts();
|
let parts = string.normalized_parts();
|
||||||
if parts.len() == 0 {
|
if parts.is_empty() {
|
||||||
Ok(Attr::Str(ctx.new_sym("")))
|
Ok(Attr::Str(ctx.new_sym("")))
|
||||||
} else if parts.len() == 1 {
|
} else if parts.len() == 1 {
|
||||||
match parts.into_iter().next().unwrap() {
|
match parts.into_iter().next().unwrap() {
|
||||||
|
|||||||
@@ -324,7 +324,7 @@ extern "C" fn helper_or(lhs: JITValue, rhs: JITValue) -> JITValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[unsafe(no_mangle)]
|
#[unsafe(no_mangle)]
|
||||||
extern "C" fn helper_call<'jit, 'vm>(
|
extern "C" fn helper_call<'jit>(
|
||||||
func: JITValue,
|
func: JITValue,
|
||||||
args: *mut JITValue,
|
args: *mut JITValue,
|
||||||
arity: usize,
|
arity: usize,
|
||||||
@@ -354,7 +354,7 @@ extern "C" fn helper_lookup<'jit, 'vm>(sym: usize, env: *const LetEnv<'jit, 'vm>
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[unsafe(no_mangle)]
|
#[unsafe(no_mangle)]
|
||||||
extern "C" fn helper_force<'jit, 'vm>(thunk: JITValue, vm: *const VM<'jit>) -> JITValue {
|
extern "C" fn helper_force<'jit>(thunk: JITValue, vm: *const VM<'jit>) -> JITValue {
|
||||||
let mut val = Value::from(thunk);
|
let mut val = Value::from(thunk);
|
||||||
val.force(unsafe { vm.as_ref() }.unwrap()).unwrap();
|
val.force(unsafe { vm.as_ref() }.unwrap()).unwrap();
|
||||||
val.into()
|
val.into()
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use inkwell::OptimizationLevel;
|
use inkwell::OptimizationLevel;
|
||||||
use inkwell::basic_block::BasicBlock;
|
|
||||||
use inkwell::builder::Builder;
|
use inkwell::builder::Builder;
|
||||||
use inkwell::context::Context;
|
use inkwell::context::Context;
|
||||||
use inkwell::execution_engine::{ExecutionEngine, JitFunction};
|
use inkwell::execution_engine::{ExecutionEngine, JitFunction};
|
||||||
@@ -144,13 +143,13 @@ impl<'vm, 'ctx: 'vm> JITContext<'ctx> {
|
|||||||
.add_function("nixjit_function", self.helpers.func_type, None);
|
.add_function("nixjit_function", self.helpers.func_type, None);
|
||||||
let env = func_.get_nth_param(1).unwrap().into_pointer_value();
|
let env = func_.get_nth_param(1).unwrap().into_pointer_value();
|
||||||
let entry = self.context.append_basic_block(func_, "entry");
|
let entry = self.context.append_basic_block(func_, "entry");
|
||||||
|
self.builder.position_at_end(entry);
|
||||||
self.build_expr(
|
self.build_expr(
|
||||||
&mut iter,
|
&mut iter,
|
||||||
vm,
|
vm,
|
||||||
env,
|
env,
|
||||||
&mut stack,
|
&mut stack,
|
||||||
func_,
|
func_,
|
||||||
entry,
|
|
||||||
func.opcodes.len(),
|
func.opcodes.len(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
@@ -178,10 +177,8 @@ impl<'vm, 'ctx: 'vm> JITContext<'ctx> {
|
|||||||
env: PointerValue<'ctx>,
|
env: PointerValue<'ctx>,
|
||||||
stack: &mut Stack<BasicValueEnum<'ctx>, CAP>,
|
stack: &mut Stack<BasicValueEnum<'ctx>, CAP>,
|
||||||
func: FunctionValue<'ctx>,
|
func: FunctionValue<'ctx>,
|
||||||
bb: BasicBlock<'ctx>,
|
|
||||||
mut length: usize,
|
mut length: usize,
|
||||||
) -> Result<usize> {
|
) -> Result<usize> {
|
||||||
self.builder.position_at_end(bb);
|
|
||||||
while length > 1 {
|
while length > 1 {
|
||||||
let opcode = iter.next().unwrap();
|
let opcode = iter.next().unwrap();
|
||||||
let br = self.single_op(opcode, vm, env, stack)?;
|
let br = self.single_op(opcode, vm, env, stack)?;
|
||||||
@@ -215,12 +212,14 @@ impl<'vm, 'ctx: 'vm> JITContext<'ctx> {
|
|||||||
)?;
|
)?;
|
||||||
|
|
||||||
length -= br;
|
length -= br;
|
||||||
let br = self.build_expr(iter, vm, env, stack, func, consq, br)?;
|
self.builder.position_at_end(consq);
|
||||||
|
let br = self.build_expr(iter, vm, env, stack, func, br)?;
|
||||||
self.builder.build_store(result, stack.pop())?;
|
self.builder.build_store(result, stack.pop())?;
|
||||||
self.builder.build_unconditional_branch(cont)?;
|
self.builder.build_unconditional_branch(cont)?;
|
||||||
|
|
||||||
length -= br;
|
length -= br;
|
||||||
self.build_expr(iter, vm, env, stack, func, alter, br)?;
|
self.builder.position_at_end(alter);
|
||||||
|
self.build_expr(iter, vm, env, stack, func, br)?;
|
||||||
self.builder.build_store(result, stack.pop())?;
|
self.builder.build_store(result, stack.pop())?;
|
||||||
self.builder.build_unconditional_branch(cont)?;
|
self.builder.build_unconditional_branch(cont)?;
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ impl<T, const CAP: usize> Stack<T, CAP> {
|
|||||||
.get_mut(self.top)
|
.get_mut(self.top)
|
||||||
.map_or_else(
|
.map_or_else(
|
||||||
|| Err(Error::EvalError("stack overflow".to_string())),
|
|| Err(Error::EvalError("stack overflow".to_string())),
|
||||||
|ok| Ok(ok),
|
Ok,
|
||||||
)?
|
)?
|
||||||
.write(item);
|
.write(item);
|
||||||
self.top += 1;
|
self.top += 1;
|
||||||
|
|||||||
@@ -53,17 +53,14 @@ impl<'jit: 'vm, 'vm> AttrSet<'jit, 'vm> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn capture(&mut self, env: &Rc<LetEnv<'jit, 'vm>>) {
|
pub fn capture(&mut self, env: &Rc<LetEnv<'jit, 'vm>>) {
|
||||||
self.data.iter().for_each(|(_, v)| match v.clone() {
|
self.data.iter().for_each(|(_, v)| if let Value::Thunk(ref thunk) = v.clone() {
|
||||||
Value::Thunk(ref thunk) => {
|
thunk.capture(env.clone());
|
||||||
thunk.capture(env.clone());
|
|
||||||
}
|
|
||||||
_ => (),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self, other: &AttrSet<'jit, 'vm>) {
|
pub fn update(&mut self, other: &AttrSet<'jit, 'vm>) {
|
||||||
for (k, v) in other.data.iter() {
|
for (k, v) in other.data.iter() {
|
||||||
self.push_attr_force(k.clone(), v.clone())
|
self.push_attr_force(*k, v.clone())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +76,7 @@ impl<'jit: 'vm, 'vm> AttrSet<'jit, 'vm> {
|
|||||||
let mut map: Vec<_> = self
|
let mut map: Vec<_> = self
|
||||||
.data
|
.data
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(k, v)| (k.clone(), v.clone()))
|
.map(|(k, v)| (*k, v.clone()))
|
||||||
.collect();
|
.collect();
|
||||||
for (_, v) in map.iter_mut() {
|
for (_, v) in map.iter_mut() {
|
||||||
v.force_deep(vm)?;
|
v.force_deep(vm)?;
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ impl<'vm, 'jit: 'vm> Func<'jit, 'vm> {
|
|||||||
use Param::*;
|
use Param::*;
|
||||||
|
|
||||||
let env = match self.func.param.clone() {
|
let env = match self.func.param.clone() {
|
||||||
Ident(ident) => self.env.clone().enter_arg(ident.into(), arg),
|
Ident(ident) => self.env.clone().enter_arg(ident, arg),
|
||||||
Formals {
|
Formals {
|
||||||
formals,
|
formals,
|
||||||
ellipsis,
|
ellipsis,
|
||||||
@@ -75,7 +75,6 @@ impl<'vm, 'jit: 'vm> Func<'jit, 'vm> {
|
|||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
for (formal, default) in formals {
|
for (formal, default) in formals {
|
||||||
let formal = formal.clone().into();
|
|
||||||
let arg = arg
|
let arg = arg
|
||||||
.select(formal)
|
.select(formal)
|
||||||
.or_else(|| {
|
.or_else(|| {
|
||||||
@@ -85,12 +84,11 @@ impl<'vm, 'jit: 'vm> Func<'jit, 'vm> {
|
|||||||
new.insert(formal, arg);
|
new.insert(formal, arg);
|
||||||
}
|
}
|
||||||
if let Some(alias) = alias {
|
if let Some(alias) = alias {
|
||||||
new.insert(alias.clone().into(), Value::AttrSet(arg));
|
new.insert(alias, Value::AttrSet(arg));
|
||||||
}
|
}
|
||||||
self.env.clone().enter_attrs(AttrSet::new(new).into())
|
self.env.clone().enter_attrs(AttrSet::new(new).into())
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
.into();
|
|
||||||
|
|
||||||
let count = self.count.get();
|
let count = self.count.get();
|
||||||
self.count.replace(count + 1);
|
self.count.replace(count + 1);
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ impl<'jit, 'vm> Value<'jit, 'vm> {
|
|||||||
AttrSet(attrs) => attrs.to_public(vm, seen),
|
AttrSet(attrs) => attrs.to_public(vm, seen),
|
||||||
List(list) => list.to_public(vm, seen),
|
List(list) => list.to_public(vm, seen),
|
||||||
Catchable(catchable) => Value::Catchable(catchable.clone()),
|
Catchable(catchable) => Value::Catchable(catchable.clone()),
|
||||||
Const(cnst) => Value::Const(cnst.clone().into()),
|
Const(cnst) => Value::Const(cnst.clone()),
|
||||||
Thunk(_) => Value::Thunk,
|
Thunk(_) => Value::Thunk,
|
||||||
ThunkRef(_) => Value::Thunk,
|
ThunkRef(_) => Value::Thunk,
|
||||||
PrimOp(primop) => Value::PrimOp(primop.name),
|
PrimOp(primop) => Value::PrimOp(primop.name),
|
||||||
@@ -514,7 +514,7 @@ impl<'jit, 'vm> Thunk<'jit, 'vm> {
|
|||||||
let value = vm.eval(opcodes.iter().copied(), env.get().unwrap().clone())?;
|
let value = vm.eval(opcodes.iter().copied(), env.get().unwrap().clone())?;
|
||||||
let _ = std::mem::replace(
|
let _ = std::mem::replace(
|
||||||
&mut *self.thunk.borrow_mut(),
|
&mut *self.thunk.borrow_mut(),
|
||||||
_Thunk::Value(value.clone().into()),
|
_Thunk::Value(value.clone()),
|
||||||
);
|
);
|
||||||
Ok(value)
|
Ok(value)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ impl<'jit: 'vm, 'vm> PartialPrimOp<'jit, 'vm> {
|
|||||||
if self_mut.arity > 0 {
|
if self_mut.arity > 0 {
|
||||||
Value::PartialPrimOp(self_clone).ok()
|
Value::PartialPrimOp(self_clone).ok()
|
||||||
} else if self_mut.arity == 0 {
|
} else if self_mut.arity == 0 {
|
||||||
let args = std::mem::replace(&mut self_mut.args, Vec::new());
|
let args = std::mem::take(&mut self_mut.args);
|
||||||
(self.func)(vm, args)
|
(self.func)(vm, args)
|
||||||
} else {
|
} else {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ impl<'jit, 'vm> LetEnv<'jit, 'vm> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.last.as_ref().map(|env| env.lookup(symbol)).flatten()
|
self.last.as_ref().and_then(|env| env.lookup(symbol))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enter_arg(self: Rc<Self>, ident: usize, val: Value<'jit, 'vm>) -> Rc<Self> {
|
pub fn enter_arg(self: Rc<Self>, ident: usize, val: Value<'jit, 'vm>) -> Rc<Self> {
|
||||||
@@ -82,7 +82,7 @@ impl<'jit, 'vm> LetEnv<'jit, 'vm> {
|
|||||||
})
|
})
|
||||||
.collect::<HashMap<_, _>>();
|
.collect::<HashMap<_, _>>();
|
||||||
let map = Env::Let(AttrSet::new(map).into());
|
let map = Env::Let(AttrSet::new(map).into());
|
||||||
let last = Some(self.into());
|
let last = Some(self);
|
||||||
LetEnv { last, map }.into()
|
LetEnv { last, map }.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ impl<'jit, 'vm> WithEnv<'jit, 'vm> {
|
|||||||
if let Some(val) = self.map.select(symbol) {
|
if let Some(val) = self.map.select(symbol) {
|
||||||
return Some(val);
|
return Some(val);
|
||||||
}
|
}
|
||||||
self.last.as_ref().map(|env| env.lookup(symbol)).flatten()
|
self.last.as_ref().and_then(|env| env.lookup(symbol))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enter_with(self, new: Rc<AttrSet<'jit, 'vm>>) -> Self {
|
pub fn enter_with(self, new: Rc<AttrSet<'jit, 'vm>>) -> Self {
|
||||||
|
|||||||
@@ -227,9 +227,10 @@ fn test_fib() {
|
|||||||
#[bench]
|
#[bench]
|
||||||
fn bench_fib(b: &mut Bencher) {
|
fn bench_fib(b: &mut Bencher) {
|
||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
black_box(test_expr(
|
test_expr(
|
||||||
"let fib = n: if n == 1 || n == 2 then 1 else (fib (n - 1)) + (fib (n - 2)); in fib 20",
|
"let fib = n: if n == 1 || n == 2 then 1 else (fib (n - 1)) + (fib (n - 2)); in fib 20",
|
||||||
int!(6765),
|
int!(6765),
|
||||||
))
|
);
|
||||||
|
black_box(())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user