diff --git a/starlark/src/values/owned.rs b/starlark/src/values/owned.rs index 620037f3..42d32c00 100644 --- a/starlark/src/values/owned.rs +++ b/starlark/src/values/owned.rs @@ -226,7 +226,7 @@ impl> Deref for OwnedFrozenValueTyped { } } -impl> OwnedFrozenValueTyped { +impl StarlarkValue<'a>> OwnedFrozenValueTyped { /// Create an [`OwnedFrozenValueTyped`] - generally [`OwnedFrozenValueTyped`]s are obtained /// from downcasting [`OwnedFrozenValue`]. /// @@ -240,7 +240,11 @@ impl> OwnedFrozenValueTyped { /// let value = heap.alloc("test"); /// unsafe { OwnedFrozenValue::new(heap.into_ref(), value) }; /// ``` - pub unsafe fn new(owner: FrozenHeapRef, value: FrozenValueTyped<'static, T>) -> Self { + pub unsafe fn new<'a>(owner: FrozenHeapRef, value: FrozenValueTyped<'a, T>) -> Self { + // SAFETY: The caller has asserted that this heap ref keeps the value alive. + let value = unsafe { + std::mem::transmute::, FrozenValueTyped<'static, T>>(value) + }; Self { owner, value } } @@ -332,9 +336,9 @@ impl> OwnedFrozenValueTyped { /// Operate on the [`FrozenValue`] stored inside. /// Safe provided you don't store the argument [`FrozenValue`] after the closure has returned. /// Using this function is discouraged when possible. - pub fn map>( + pub fn map StarlarkValue<'a>>( &self, - f: impl FnOnce(FrozenValueTyped) -> FrozenValueTyped, + f: impl for<'a> FnOnce(FrozenValueTyped<'a, T>) -> FrozenValueTyped<'a, U>, ) -> OwnedFrozenValueTyped { OwnedFrozenValueTyped { owner: self.owner.dupe(), @@ -343,9 +347,9 @@ impl> OwnedFrozenValueTyped { } /// Same as [`map`](OwnedFrozenValue::map) above but with [`Result`] - pub fn try_map, E>( + pub fn try_map StarlarkValue<'a>, E>( &self, - f: impl FnOnce(FrozenValueTyped) -> Result, E>, + f: impl for<'a> FnOnce(FrozenValueTyped<'a, T>) -> Result, E>, ) -> Result, E> { Ok(OwnedFrozenValueTyped { owner: self.owner.dupe(), @@ -354,9 +358,9 @@ impl> OwnedFrozenValueTyped { } /// Same as [`map`](OwnedFrozenValue::map) above but with [`Option`] - pub fn maybe_map>( + pub fn maybe_map StarlarkValue<'a>>( &self, - f: impl FnOnce(FrozenValueTyped) -> Option>, + f: impl for<'a> FnOnce(FrozenValueTyped<'a, T>) -> Option>, ) -> Option> { Some(OwnedFrozenValueTyped { owner: self.owner.dupe(),