use std::{marker::PhantomData, pin::Pin};
use slot_ref::SlotRef;
#[cfg(feature = "async")]
use self::frame::AsyncGcFrame;
use self::{
frame::{BorrowedFrame, GcFrame, LocalGcFrame, UnsizedLocalGcFrame},
output::Output,
private::TargetPriv,
reusable_slot::ReusableSlot,
unrooted::Unrooted,
};
use super::scope::{LocalScope, LocalScopeExt};
#[cfg(feature = "multi-rt")]
use crate::runtime::handle::mt_handle::ActiveHandle;
use crate::{
data::managed::Weak,
memory::scope::private::LocalScopePriv,
prelude::{Managed, ValueData},
runtime::{
RuntimeSettings,
handle::{weak_handle::WeakHandle, with_stack::StackHandle},
},
};
pub mod frame;
pub mod output;
pub mod reusable_slot;
pub mod slot_ref;
pub mod unrooted;
pub trait Target<'target>: TargetPriv<'target> {
#[inline]
fn unrooted(&self) -> Unrooted<'target> {
unsafe { Unrooted::new() }
}
fn runtime_settings(&self) -> RuntimeSettings<&Self> {
RuntimeSettings::new(self)
}
#[inline]
fn into_extended_target<'borrow, 'current>(
self,
frame: &'borrow mut GcFrame<'current>,
) -> ExtendedTarget<'target, 'current, 'borrow, Self> {
ExtendedTarget {
target: self,
frame,
_target_marker: PhantomData,
}
}
#[cfg(feature = "async")]
#[inline]
fn into_extended_async_target<'borrow, 'current>(
self,
frame: &'borrow mut AsyncGcFrame<'current>,
) -> ExtendedAsyncTarget<'target, 'current, 'borrow, Self> {
ExtendedAsyncTarget {
target: self,
frame,
_target_marker: PhantomData,
}
}
}
impl<'target, Tgt: Target<'target>> LocalScopePriv for Tgt {}
unsafe impl<'target, Tgt: Target<'target>> LocalScope for Tgt {}
unsafe impl<'target, Tgt: Target<'target>> LocalScopeExt<'target> for Tgt {}
pub struct ExtendedTarget<'target, 'current, 'borrow, Tgt>
where
Tgt: Target<'target>,
{
pub(crate) target: Tgt,
pub(crate) frame: &'borrow mut GcFrame<'current>,
pub(crate) _target_marker: PhantomData<&'target ()>,
}
impl<'target, 'current, 'borrow, Tgt> ExtendedTarget<'target, 'current, 'borrow, Tgt>
where
Tgt: Target<'target>,
{
#[inline]
pub fn split(self) -> (Tgt, BorrowedFrame<'borrow, 'current, GcFrame<'current>>) {
(self.target, BorrowedFrame(self.frame, PhantomData))
}
}
#[cfg(feature = "async")]
pub struct ExtendedAsyncTarget<'target, 'current, 'borrow, Tgt>
where
Tgt: Target<'target>,
{
pub(crate) target: Tgt,
pub(crate) frame: &'borrow mut AsyncGcFrame<'current>,
pub(crate) _target_marker: PhantomData<&'target ()>,
}
#[cfg(feature = "async")]
impl<'target, 'current, 'borrow, Tgt> ExtendedAsyncTarget<'target, 'current, 'borrow, Tgt>
where
Tgt: Target<'target>,
{
#[inline]
pub fn split(
self,
) -> (
Tgt,
BorrowedFrame<'borrow, 'current, AsyncGcFrame<'current>>,
) {
(self.target, BorrowedFrame(self.frame, PhantomData))
}
}
impl<'target> Target<'target> for GcFrame<'target> {}
impl<'target, const N: usize> Target<'target> for LocalGcFrame<'target, N> {}
impl<'target> Target<'target> for UnsizedLocalGcFrame<'target> {}
impl<'target> Target<'target> for &mut GcFrame<'target> {}
impl<'target, const N: usize> Target<'target> for &mut LocalGcFrame<'target, N> {}
impl<'target> Target<'target> for &mut UnsizedLocalGcFrame<'target> {}
#[cfg(feature = "async")]
impl<'target> Target<'target> for AsyncGcFrame<'target> {}
#[cfg(feature = "async")]
impl<'target> Target<'target> for &mut AsyncGcFrame<'target> {}
impl<'target> Target<'target> for Unrooted<'target> {}
#[cfg(feature = "multi-rt")]
impl<'target> Target<'target> for ActiveHandle<'target> {}
impl<'target> Target<'target> for Pin<&'target mut WeakHandle> {}
impl<'target> Target<'target> for StackHandle<'target> {}
impl<'target, S: SlotRef> Target<'target> for Output<'target, S> {}
impl<'target, S: SlotRef> Target<'target> for &'target mut Output<'_, S> {}
impl<'target, S: SlotRef> Target<'target> for ReusableSlot<'target, S> {}
impl<'target, S: SlotRef> Target<'target> for &mut ReusableSlot<'target, S> {}
impl<'target, 'data, Tgt> Target<'target> for &Tgt where Tgt: Target<'target> {}
pub trait TargetType<'target>: Sized {
type Data<'data, T: Managed<'target, 'data>>;
}
pub type TargetResult<'scope, 'data, T, Tgt> =
Result<<Tgt as TargetType<'scope>>::Data<'data, T>, ValueData<'scope, 'data, Tgt>>;
pub type TargetException<'scope, 'data, T, Tgt> = Result<T, ValueData<'scope, 'data, Tgt>>;
pub trait RootingTarget<'target>: TargetType<'target> + Target<'target> {
fn into_concrete_type<'data, M: Managed<'target, 'data>>(t: Self::Data<'data, M>) -> M {
unsafe { std::mem::transmute_copy(&t) }
}
fn into_generic_type<'data, M: Managed<'target, 'data>>(t: M) -> Self::Data<'data, M> {
unsafe { std::mem::transmute_copy(&t) }
}
}
impl<'target> TargetType<'target> for &mut GcFrame<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for &mut GcFrame<'target> {}
impl<'target, const N: usize> TargetType<'target> for &mut LocalGcFrame<'target, N> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target, const N: usize> RootingTarget<'target> for &mut LocalGcFrame<'target, N> {}
impl<'target> TargetType<'target> for &mut UnsizedLocalGcFrame<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for &mut UnsizedLocalGcFrame<'target> {}
impl<'target> TargetType<'target> for GcFrame<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for GcFrame<'target> {}
impl<'target, const N: usize> TargetType<'target> for LocalGcFrame<'target, N> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target, const N: usize> RootingTarget<'target> for LocalGcFrame<'target, N> {}
impl<'target> TargetType<'target> for UnsizedLocalGcFrame<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for UnsizedLocalGcFrame<'target> {}
#[cfg(feature = "async")]
impl<'target> TargetType<'target> for &mut AsyncGcFrame<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
#[cfg(feature = "async")]
impl<'target> TargetType<'target> for AsyncGcFrame<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
#[cfg(feature = "async")]
impl<'target> RootingTarget<'target> for &mut AsyncGcFrame<'target> {}
#[cfg(feature = "async")]
impl<'target> RootingTarget<'target> for AsyncGcFrame<'target> {}
impl<'target, S: SlotRef> TargetType<'target> for Output<'target, S> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target, S: SlotRef> RootingTarget<'target> for Output<'target, S> {}
impl<'target, S: SlotRef> TargetType<'target> for &'target mut Output<'_, S> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target, S: SlotRef> RootingTarget<'target> for &'target mut Output<'_, S> {}
impl<'target, S: SlotRef> TargetType<'target> for ReusableSlot<'target, S> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target, S: SlotRef> RootingTarget<'target> for ReusableSlot<'target, S> {}
impl<'target, S: SlotRef> TargetType<'target> for &mut ReusableSlot<'target, S> {
type Data<'data, T: Managed<'target, 'data>> = Weak<'target, 'data, T>;
}
impl<'target> TargetType<'target> for Unrooted<'target> {
type Data<'data, T: Managed<'target, 'data>> = Weak<'target, 'data, T>;
}
#[cfg(feature = "multi-rt")]
impl<'target> TargetType<'target> for ActiveHandle<'target> {
type Data<'data, T: Managed<'target, 'data>> = Weak<'target, 'data, T>;
}
impl<'target> TargetType<'target> for Pin<&'target mut WeakHandle> {
type Data<'data, T: Managed<'target, 'data>> = Weak<'target, 'data, T>;
}
impl<'target> TargetType<'target> for StackHandle<'target> {
type Data<'data, T: Managed<'target, 'data>> = Weak<'target, 'data, T>;
}
impl<'target, U: TargetType<'target>> TargetType<'target> for &U {
type Data<'data, T: Managed<'target, 'data>> = Weak<'target, 'data, T>;
}
pub(crate) mod private {
use std::{pin::Pin, ptr::NonNull};
use jl_sys::jl_value_t;
#[cfg(feature = "async")]
use super::AsyncGcFrame;
use super::{
GcFrame, Output, TargetException, TargetResult, TargetType,
frame::{LocalGcFrame, UnsizedLocalGcFrame},
reusable_slot::ReusableSlot,
slot_ref::SlotRef,
unrooted::Unrooted,
};
#[cfg(feature = "multi-rt")]
use crate::runtime::handle::mt_handle::ActiveHandle;
use crate::{
data::managed::{
Managed, Weak,
private::ManagedPriv,
value::{Value, WeakValue},
},
private::Private,
runtime::handle::{weak_handle::WeakHandle, with_stack::StackHandle},
};
pub trait TargetPriv<'target>: TargetType<'target> {
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T>;
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self>;
#[inline]
unsafe fn result_from_unrooted<'data, T: Managed<'target, 'data>>(
self,
result: Result<Weak<'target, 'data, T>, WeakValue<'target, 'data>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
let result = match result {
Ok(v) => Ok(v.ptr()),
Err(e) => Err(e.ptr()),
};
self.result_from_ptr(result, Private)
}
}
#[inline]
unsafe fn result_from_rooted<'data, T: Managed<'target, 'data>>(
self,
result: Result<T, Value<'target, 'data>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
let result = match result {
Ok(v) => Ok(v.unwrap_non_null(Private)),
Err(e) => Err(e.unwrap_non_null(Private)),
};
self.result_from_ptr(result, Private)
}
}
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self>;
}
impl<'target> TargetPriv<'target> for &mut GcFrame<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
impl<'target, const N: usize> TargetPriv<'target> for &mut LocalGcFrame<'target, N> {
#[inline]
#[track_caller]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
#[track_caller]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
#[track_caller]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
impl<'target> TargetPriv<'target> for &mut UnsizedLocalGcFrame<'target> {
#[inline]
#[track_caller]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
#[track_caller]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
#[track_caller]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
impl<'target> TargetPriv<'target> for GcFrame<'target> {
#[inline]
#[track_caller]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
#[track_caller]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
#[track_caller]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
impl<'target, const N: usize> TargetPriv<'target> for LocalGcFrame<'target, N> {
#[inline]
#[track_caller]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
mut self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
#[track_caller]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
mut self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
#[track_caller]
unsafe fn exception_from_ptr<'data, T>(
mut self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
impl<'target> TargetPriv<'target> for UnsizedLocalGcFrame<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
mut self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
mut self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
mut self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
#[cfg(feature = "async")]
impl<'target> TargetPriv<'target> for &mut AsyncGcFrame<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
#[cfg(feature = "async")]
impl<'target> TargetPriv<'target> for AsyncGcFrame<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.root(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.root(t)),
Err(e) => Err(self.root(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
}
impl<'target, S: SlotRef> TargetPriv<'target> for Output<'target, S> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.consume(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.consume(t)),
Err(e) => Err(self.consume(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.consume(e)),
}
}
}
}
impl<'target, S: SlotRef> TargetPriv<'target> for &'target mut Output<'_, S> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.temporary(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.temporary(t)),
Err(e) => Err(self.temporary(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.temporary(e)),
}
}
}
}
impl<'target, S: SlotRef> TargetPriv<'target> for ReusableSlot<'target, S> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.consume(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.consume(t)),
Err(e) => Err(self.consume(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.consume(e)),
}
}
}
}
impl<'target, S: SlotRef> TargetPriv<'target> for &mut ReusableSlot<'target, S> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
unsafe { self.temporary(value) }
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(self.temporary(t)),
Err(e) => Err(self.temporary(e)),
}
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
unsafe {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.temporary(e)),
}
}
}
}
impl<'target> TargetPriv<'target> for Unrooted<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
Weak::wrap(value)
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(Weak::wrap(t)),
Err(e) => Err(Weak::wrap(e)),
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(Weak::wrap(e)),
}
}
}
#[cfg(feature = "multi-rt")]
impl<'target> TargetPriv<'target> for ActiveHandle<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
Weak::wrap(value)
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(Weak::wrap(t)),
Err(e) => Err(Weak::wrap(e)),
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(Weak::wrap(e)),
}
}
}
impl<'target> TargetPriv<'target> for Pin<&'target mut WeakHandle> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
Weak::wrap(value)
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(Weak::wrap(t)),
Err(e) => Err(Weak::wrap(e)),
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(Weak::wrap(e)),
}
}
}
impl<'target> TargetPriv<'target> for StackHandle<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
Weak::wrap(value)
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(Weak::wrap(t)),
Err(e) => Err(Weak::wrap(e)),
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(Weak::wrap(e)),
}
}
}
impl<'target, U: TargetPriv<'target>> TargetPriv<'target> for &U {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
Weak::wrap(value)
}
#[inline]
unsafe fn result_from_ptr<'data, T: Managed<'target, 'data>>(
self,
result: Result<NonNull<T::Wraps>, NonNull<jl_value_t>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(Weak::wrap(t)),
Err(e) => Err(Weak::wrap(e)),
}
}
#[inline]
unsafe fn exception_from_ptr<'data, T>(
self,
result: Result<T, NonNull<jl_value_t>>,
_: Private,
) -> TargetException<'target, 'data, T, Self> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(Weak::wrap(e)),
}
}
}
}