diff --git a/node-graph/libraries/core-types/src/context.rs b/node-graph/libraries/core-types/src/context.rs index 88bb398239..5518601730 100644 --- a/node-graph/libraries/core-types/src/context.rs +++ b/node-graph/libraries/core-types/src/context.rs @@ -816,6 +816,9 @@ pub struct EvalScope<'a> { pointer_position: Option, generations: &'a [(SourceId, u64)], arena: &'a Arena, + /// The region no evaluation resets, borrowed for the whole evaluation so + /// the flush's `&mut` cannot land while a value promoted into it is live. + persistent: &'a Arena, hash: u64, } @@ -827,12 +830,19 @@ impl<'a> EvalScope<'a> { pointer_position, generations, arena, + persistent: arena, hash: 0, }; scope.hash = scope.compute_hash(|_| true); scope } + /// Names the region memo levels are promoted into. A scope that names none + /// promotes into its own arena, so its memos live exactly one generation. + pub fn with_persistent(&self, persistent: &'a Arena) -> EvalScope<'a> { + EvalScope { persistent, ..*self } + } + pub fn with_real_time(&self, real_time: Option) -> EvalScope<'a> { let mut scope = EvalScope { real_time, ..*self }; scope.hash = scope.compute_hash(|_| true); @@ -892,6 +902,10 @@ impl<'a> EvalScope<'a> { pub fn arena(&self) -> &'a Arena { self.arena } + + pub fn persistent(&self) -> &'a Arena { + self.persistent + } } pub trait ExtractArena {