diff options
Diffstat (limited to 'tvix/eval/src/value/thunk.rs')
-rw-r--r-- | tvix/eval/src/value/thunk.rs | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/tvix/eval/src/value/thunk.rs b/tvix/eval/src/value/thunk.rs index 57c38e089460..3b7cb7f5f711 100644 --- a/tvix/eval/src/value/thunk.rs +++ b/tvix/eval/src/value/thunk.rs @@ -18,9 +18,12 @@ //! object, but when forcing a thunk, the runtime *must* mutate the //! memoisable slot. -use std::{cell::RefCell, rc::Rc}; +use std::{ + cell::{Ref, RefCell, RefMut}, + rc::Rc, +}; -use crate::Value; +use crate::{upvalues::UpvalueCarrier, Value}; use super::Lambda; @@ -53,3 +56,27 @@ impl Thunk { }))) } } + +impl UpvalueCarrier for Thunk { + fn upvalue_count(&self) -> usize { + if let ThunkRepr::Suspended { lambda, .. } = &*self.0.borrow() { + return lambda.upvalue_count; + } + + panic!("upvalues() on non-suspended thunk"); + } + + fn upvalues(&self) -> Ref<'_, [Value]> { + Ref::map(self.0.borrow(), |thunk| match thunk { + ThunkRepr::Suspended { upvalues, .. } => upvalues.as_slice(), + _ => panic!("upvalues() on non-suspended thunk"), + }) + } + + fn upvalues_mut(&self) -> RefMut<'_, Vec<Value>> { + RefMut::map(self.0.borrow_mut(), |thunk| match thunk { + ThunkRepr::Suspended { upvalues, .. } => upvalues, + _ => panic!("upvalues() on non-suspended thunk"), + }) + } +} |