From 922bf7aca9f4d4f4834ba5de7841ff58015c8791 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Mon, 28 Nov 2022 00:18:04 -0800 Subject: feat(tvix/eval): remove `derive(Copy)` from Upvalues Change-Id: I0fa069fbeff6718a765ece948c2c1bce285496f7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7449 Reviewed-by: grfn Tested-by: BuildkiteCI --- tvix/eval/src/value/function.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'tvix/eval/src/value/function.rs') diff --git a/tvix/eval/src/value/function.rs b/tvix/eval/src/value/function.rs index 4c2f3514f018..e31bb92b7931 100644 --- a/tvix/eval/src/value/function.rs +++ b/tvix/eval/src/value/function.rs @@ -39,7 +39,14 @@ impl Formals { /// OpThunkSuspended referencing it. At runtime `Lambda` is usually wrapped /// in `Rc` to avoid copying the `Chunk` it holds (which can be /// quite large). -#[derive(Debug, Default)] +/// +/// In order to correctly reproduce cppnix's "pointer equality" +/// semantics it is important that we never clone a Lambda -- +/// use Rc::clone() instead. This struct deliberately +/// does not `derive(Clone)` in order to prevent this from being +/// done accidentally. +/// +#[derive(/* do not add Clone here */ Debug, Default)] pub struct Lambda { pub(crate) chunk: Chunk, @@ -62,7 +69,14 @@ impl Lambda { } } -#[derive(Clone, Debug)] +/// +/// In order to correctly reproduce cppnix's "pointer equality" +/// semantics it is important that we never clone a Lambda -- +/// use Rc::clone() instead. This struct deliberately +/// does not `derive(Clone)` in order to prevent this from being +/// done accidentally. +/// +#[derive(/* do not add Clone here */ Debug)] pub struct Closure { pub lambda: Rc, pub upvalues: Rc, @@ -88,7 +102,7 @@ impl Closure { self.lambda.clone() } - pub fn upvalues(&self) -> &Upvalues { - &self.upvalues + pub fn upvalues(&self) -> Rc { + self.upvalues.clone() } } -- cgit 1.4.1