feat(tvix/eval): wrap Closure::upvalues in Rc
See cl/7372; Nix equality semantics require the ability to track pointer equality of upvalue-sets. Signed-off-by: Adam Joseph <adam@westernsemico.com> Change-Id: I82ba517499cf370189a80355e4e46a5caaab7153 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7373 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
5eabadf06c
commit
0616976f7c
3 changed files with 11 additions and 6 deletions
|
@ -65,7 +65,7 @@ impl Lambda {
|
|||
#[derive(Clone, Debug)]
|
||||
pub struct Closure {
|
||||
pub lambda: Rc<Lambda>,
|
||||
pub upvalues: Upvalues,
|
||||
pub upvalues: Rc<Upvalues>,
|
||||
/// true if all upvalues have been realised
|
||||
#[cfg(debug_assertions)]
|
||||
pub is_finalised: bool,
|
||||
|
@ -73,10 +73,13 @@ pub struct Closure {
|
|||
|
||||
impl Closure {
|
||||
pub fn new(lambda: Rc<Lambda>) -> Self {
|
||||
Self::new_with_upvalues(Upvalues::with_capacity(lambda.upvalue_count), lambda)
|
||||
Self::new_with_upvalues(
|
||||
Rc::new(Upvalues::with_capacity(lambda.upvalue_count)),
|
||||
lambda,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn new_with_upvalues(upvalues: Upvalues, lambda: Rc<Lambda>) -> Self {
|
||||
pub fn new_with_upvalues(upvalues: Rc<Upvalues>, lambda: Rc<Lambda>) -> Self {
|
||||
Closure {
|
||||
upvalues,
|
||||
lambda,
|
||||
|
|
|
@ -70,7 +70,7 @@ impl Thunk {
|
|||
pub fn new_closure(lambda: Rc<Lambda>) -> Self {
|
||||
Thunk(Rc::new(RefCell::new(ThunkRepr::Evaluated(Value::Closure(
|
||||
Closure {
|
||||
upvalues: Upvalues::with_capacity(lambda.upvalue_count),
|
||||
upvalues: Rc::new(Upvalues::with_capacity(lambda.upvalue_count)),
|
||||
lambda: lambda.clone(),
|
||||
#[cfg(debug_assertions)]
|
||||
is_finalised: false,
|
||||
|
@ -184,7 +184,8 @@ impl Thunk {
|
|||
if *is_finalised {
|
||||
panic!("Thunk::upvalues_mut() called on a finalised closure");
|
||||
}
|
||||
upvalues
|
||||
Rc::get_mut(upvalues)
|
||||
.expect("upvalues_mut() was called on a thunk which already had multiple references to it")
|
||||
}
|
||||
thunk => panic!("upvalues() on non-suspended thunk: {thunk:?}"),
|
||||
})
|
||||
|
|
|
@ -694,7 +694,8 @@ impl<'o> VM<'o> {
|
|||
let mut upvalues = Upvalues::with_capacity(blueprint.upvalue_count);
|
||||
self.populate_upvalues(upvalue_count, &mut upvalues)?;
|
||||
self.push(Value::Closure(Closure::new_with_upvalues(
|
||||
upvalues, blueprint,
|
||||
Rc::new(upvalues),
|
||||
blueprint,
|
||||
)));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue