use std::{marker::PhantomData, pin::Pin};
#[cfg(feature = "async")]
use self::frame::AsyncGcFrame;
use self::{
frame::{BorrowedFrame, GcFrame, LocalFrame, LocalGcFrame, UnsizedLocalGcFrame},
output::{LocalOutput, Output},
private::TargetPriv,
reusable_slot::{LocalReusableSlot, ReusableSlot},
unrooted::Unrooted,
};
use super::scope::LocalScope;
#[cfg(feature = "multi-rt")]
#[cfg(not(any(feature = "julia-1-6", feature = "julia-1-7", feature = "julia-1-8")))]
use crate::runtime::handle::mt_handle::ActiveHandle;
use crate::{
data::managed::Ref,
prelude::{Managed, ValueData},
runtime::handle::{weak_handle::WeakHandle, with_stack::StackHandle},
};
pub mod frame;
pub mod output;
pub mod reusable_slot;
pub mod unrooted;
pub trait Target<'target>: TargetPriv<'target> {
#[inline]
fn unrooted(&self) -> Unrooted<'target> {
unsafe { Unrooted::new() }
}
#[inline]
fn with_local_scope<T, F, const M: usize>(self, func: F) -> T
where
for<'inner> F: FnOnce(Self, LocalGcFrame<'inner, M>) -> T,
{
unsafe {
let mut local_frame = LocalFrame::new();
let pinned = local_frame.pin();
let res = func(self, LocalGcFrame::new(&pinned));
pinned.pop();
res
}
}
#[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, T, Tgt: Target<'target>> LocalScope<'target, T> 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")]
#[cfg(not(any(feature = "julia-1-6", feature = "julia-1-7", feature = "julia-1-8")))]
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> Target<'target> for Output<'target> {}
impl<'target> Target<'target> for LocalOutput<'target> {}
impl<'target> Target<'target> for &'target mut Output<'_> {}
impl<'target> Target<'target> for &'target mut LocalOutput<'_> {}
impl<'target> Target<'target> for ReusableSlot<'target> {}
impl<'target> Target<'target> for LocalReusableSlot<'target> {}
impl<'target> Target<'target> for &mut LocalReusableSlot<'target> {}
impl<'target> Target<'target> for &mut ReusableSlot<'target> {}
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> TargetType<'target> for Output<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for Output<'target> {}
impl<'target> TargetType<'target> for LocalOutput<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for LocalOutput<'target> {}
impl<'target> TargetType<'target> for &'target mut Output<'_> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for &'target mut Output<'_> {}
impl<'target> TargetType<'target> for &'target mut LocalOutput<'_> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for &'target mut LocalOutput<'_> {}
impl<'target> TargetType<'target> for ReusableSlot<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for ReusableSlot<'target> {}
impl<'target> TargetType<'target> for LocalReusableSlot<'target> {
type Data<'data, T: Managed<'target, 'data>> = T;
}
impl<'target> RootingTarget<'target> for LocalReusableSlot<'target> {}
impl<'target> TargetType<'target> for &mut ReusableSlot<'target> {
type Data<'data, T: Managed<'target, 'data>> = Ref<'target, 'data, T>;
}
impl<'target> TargetType<'target> for &mut LocalReusableSlot<'target> {
type Data<'data, T: Managed<'target, 'data>> = Ref<'target, 'data, T>;
}
impl<'target> TargetType<'target> for Unrooted<'target> {
type Data<'data, T: Managed<'target, 'data>> = Ref<'target, 'data, T>;
}
#[cfg(feature = "multi-rt")]
#[cfg(not(any(feature = "julia-1-6", feature = "julia-1-7", feature = "julia-1-8")))]
impl<'target> TargetType<'target> for ActiveHandle<'target> {
type Data<'data, T: Managed<'target, 'data>> = Ref<'target, 'data, T>;
}
impl<'target> TargetType<'target> for Pin<&'target mut WeakHandle> {
type Data<'data, T: Managed<'target, 'data>> = Ref<'target, 'data, T>;
}
impl<'target> TargetType<'target> for StackHandle<'target> {
type Data<'data, T: Managed<'target, 'data>> = Ref<'target, 'data, T>;
}
impl<'target, U: TargetType<'target>> TargetType<'target> for &U {
type Data<'data, T: Managed<'target, 'data>> = Ref<'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::{
frame::{LocalGcFrame, UnsizedLocalGcFrame},
output::LocalOutput,
reusable_slot::{LocalReusableSlot, ReusableSlot},
unrooted::Unrooted,
GcFrame, Output, TargetException, TargetResult, TargetType,
};
#[cfg(feature = "multi-rt")]
#[cfg(not(any(feature = "julia-1-6", feature = "julia-1-7", feature = "julia-1-8")))]
use crate::runtime::handle::mt_handle::ActiveHandle;
use crate::{
data::managed::{
private::ManagedPriv,
value::{Value, ValueRef},
Managed, Ref,
},
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<Ref<'target, 'data, T>, ValueRef<'target, 'data>>,
_: Private,
) -> TargetResult<'target, 'data, T, Self> {
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> {
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> {
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> {
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> {
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]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
impl<'target> TargetPriv<'target> for &mut UnsizedLocalGcFrame<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
impl<'target> TargetPriv<'target> for GcFrame<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
impl<'target, const N: usize> TargetPriv<'target> for LocalGcFrame<'target, N> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
mut self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
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> {
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> {
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> {
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> {
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> {
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> {
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> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.root(e)),
}
}
}
impl<'target> TargetPriv<'target> for Output<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.consume(e)),
}
}
}
impl<'target> TargetPriv<'target> for LocalOutput<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.consume(e)),
}
}
}
impl<'target> TargetPriv<'target> for &'target mut Output<'_> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.temporary(e)),
}
}
}
impl<'target> TargetPriv<'target> for &'target mut LocalOutput<'_> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.temporary(e)),
}
}
}
impl<'target> TargetPriv<'target> for ReusableSlot<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.consume(e)),
}
}
}
impl<'target> TargetPriv<'target> for LocalReusableSlot<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.consume(e)),
}
}
}
impl<'target> TargetPriv<'target> for &mut ReusableSlot<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
match result {
Ok(t) => Ok(t),
Err(e) => Err(self.temporary(e)),
}
}
}
impl<'target> TargetPriv<'target> for &mut LocalReusableSlot<'target> {
#[inline]
unsafe fn data_from_ptr<'data, T: Managed<'target, 'data>>(
self,
value: NonNull<T::Wraps>,
_: Private,
) -> Self::Data<'data, T> {
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> {
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> {
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> {
Ref::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(Ref::wrap(t)),
Err(e) => Err(Ref::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(Ref::wrap(e)),
}
}
}
#[cfg(feature = "multi-rt")]
#[cfg(not(any(feature = "julia-1-6", feature = "julia-1-7", feature = "julia-1-8")))]
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> {
Ref::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(Ref::wrap(t)),
Err(e) => Err(Ref::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(Ref::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> {
Ref::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(Ref::wrap(t)),
Err(e) => Err(Ref::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(Ref::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> {
Ref::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(Ref::wrap(t)),
Err(e) => Err(Ref::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(Ref::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> {
Ref::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(Ref::wrap(t)),
Err(e) => Err(Ref::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(Ref::wrap(e)),
}
}
}
}