d75b207a63
This struct will be responsible for tracking upvalues (and is a convenient place to introduce optimisations for reducing value clones) instead of a plain value vector. The main motivation for this is that the upvalues will have to capture the `with`-stack fully and I want to avoid duplicating the logic for this between the two capturing types. Change-Id: I6654f8739fc2e04ca046e6667d4a015f51724e99 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6485 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
72 lines
1.5 KiB
Rust
72 lines
1.5 KiB
Rust
//! This module implements the runtime representation of functions.
|
|
use std::{
|
|
cell::{Ref, RefCell, RefMut},
|
|
rc::Rc,
|
|
};
|
|
|
|
use crate::{
|
|
chunk::Chunk,
|
|
upvalues::{UpvalueCarrier, Upvalues},
|
|
};
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub struct Lambda {
|
|
// name: Option<NixString>,
|
|
pub(crate) chunk: Chunk,
|
|
pub(crate) upvalue_count: usize,
|
|
}
|
|
|
|
impl Lambda {
|
|
pub fn new_anonymous() -> Self {
|
|
Lambda {
|
|
// name: None,
|
|
chunk: Default::default(),
|
|
upvalue_count: 0,
|
|
}
|
|
}
|
|
|
|
pub fn chunk(&mut self) -> &mut Chunk {
|
|
&mut self.chunk
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub struct InnerClosure {
|
|
pub lambda: Rc<Lambda>,
|
|
upvalues: Upvalues,
|
|
}
|
|
|
|
#[repr(transparent)]
|
|
#[derive(Clone, Debug)]
|
|
pub struct Closure(Rc<RefCell<InnerClosure>>);
|
|
|
|
impl Closure {
|
|
pub fn new(lambda: Rc<Lambda>) -> Self {
|
|
Closure(Rc::new(RefCell::new(InnerClosure {
|
|
upvalues: Upvalues::with_capacity(lambda.upvalue_count),
|
|
lambda,
|
|
})))
|
|
}
|
|
|
|
pub fn chunk(&self) -> Ref<'_, Chunk> {
|
|
Ref::map(self.0.borrow(), |c| &c.lambda.chunk)
|
|
}
|
|
|
|
pub fn lambda(&self) -> Rc<Lambda> {
|
|
self.0.borrow().lambda.clone()
|
|
}
|
|
}
|
|
|
|
impl UpvalueCarrier for Closure {
|
|
fn upvalue_count(&self) -> usize {
|
|
self.0.borrow().lambda.upvalue_count
|
|
}
|
|
|
|
fn upvalues(&self) -> Ref<'_, Upvalues> {
|
|
Ref::map(self.0.borrow(), |c| &c.upvalues)
|
|
}
|
|
|
|
fn upvalues_mut(&self) -> RefMut<'_, Upvalues> {
|
|
RefMut::map(self.0.borrow_mut(), |c| &mut c.upvalues)
|
|
}
|
|
}
|