Trait JsLifetime

Source
pub unsafe trait JsLifetime<'js> {
    type Changed<'to>: 'to;
}
Expand description

The trait which signifies a type using the rquickjs 'js lifetime trick for maintaining safety around Javascript values.

§Safety

This trait can only be implemented for types which derive a 'js lifetime from a Javascript value, directly or indirectly.

All of the base Javascript types used in rquickjs like Value have a 'js lifetime. If a type wants to contains one of those types it must define a lifetime generic. This trait is for indicating that that lifetime is one derived from a Javascript value. Rquickjs needs to know about this lifetime so that it is able to ensure safe use of types.

This trait can be derived with #[derive(JsLifetime)] in most cases, however sometimes a manual implementation is required.

This trait must be implemented correctly, failing to do so will make it possible to create unsound behavior. Correct implementions have the 'js lifetime in JsLifetime<'js> be the same as the lifetime on the container, furthermore the associated type Changed<'to> is defined as the exact same type with the only difference being that the 'js lifetime is now 'to.

The following is a correct implementation of the JsLifetime trait.

struct Container<'js>(rquickjs::Object<'js>);

unsafe impl<'js> JsLifetime<'js> for Container<'js>{
    type Changed<'to> = Container<'to>;
}

If a type does not have any lifetimes associated with it or all the lifetimes are 'static then if is always save to implement JsLifetime.

See correct example for a static type below.

struct Bytes(Vec<u8>);

unsafe impl<'js> JsLifetime<'js> for Bytes{
    type Changed<'to> = Bytes;
}

§Incorrect examples

For example the following is unsound!

struct Container<'js>(rquickjs::Object<'js>);

unsafe impl<'a,'js> JsLifetime<'js> for Container<'a>{ // WRONG LIFETIME!
    type Changed<'to> = Container<'to>;
}

Container here is defined as having a 'a lifetime where it should be 'js.

The following is also incorrect

// Her 'a is not derived from an Javascript value type, but instead the lifetime of a reference.
struct Container<'a,'js>(&'a rquickjs::Object<'js>);

// Non 'js lifetime marked as a 'js lifetime. Unsound!
unsafe impl<'js> JsLifetime<'js> for Container<'js, 'js>{
    type Changed<'to> = Container<'to,'to>;
}

The lifetime marked must be from an rquickjs type with a defined <'js> lifetime, it cannot be a the lifetime of reference!

Required Associated Types§

Source

type Changed<'to>: 'to

The target which has the same type as a Self but with another lifetime 't

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'js> JsLifetime<'js> for char

Source§

type Changed<'to> = char

Source§

impl<'js> JsLifetime<'js> for i8

Source§

type Changed<'to> = i8

Source§

impl<'js> JsLifetime<'js> for i16

Source§

type Changed<'to> = i16

Source§

impl<'js> JsLifetime<'js> for i32

Source§

type Changed<'to> = i32

Source§

impl<'js> JsLifetime<'js> for i64

Source§

type Changed<'to> = i64

Source§

impl<'js> JsLifetime<'js> for i128

Source§

type Changed<'to> = i128

Source§

impl<'js> JsLifetime<'js> for isize

Source§

impl<'js> JsLifetime<'js> for u8

Source§

type Changed<'to> = u8

Source§

impl<'js> JsLifetime<'js> for u16

Source§

type Changed<'to> = u16

Source§

impl<'js> JsLifetime<'js> for u32

Source§

type Changed<'to> = u32

Source§

impl<'js> JsLifetime<'js> for u64

Source§

type Changed<'to> = u64

Source§

impl<'js> JsLifetime<'js> for u128

Source§

type Changed<'to> = u128

Source§

impl<'js> JsLifetime<'js> for ()

Source§

type Changed<'to> = ()

Source§

impl<'js> JsLifetime<'js> for usize

Source§

impl<'js> JsLifetime<'js> for CString

Source§

impl<'js> JsLifetime<'js> for String

Source§

impl<'js> JsLifetime<'js> for RangeFull

Source§

impl<'js> JsLifetime<'js> for Backtrace

Source§

impl<'js> JsLifetime<'js> for OsString

Source§

impl<'js> JsLifetime<'js> for PathBuf

Source§

impl<'js> JsLifetime<'js> for Child

Source§

impl<'js> JsLifetime<'js> for Command

Source§

impl<'js> JsLifetime<'js> for ExitCode

Source§

impl<'js> JsLifetime<'js> for ExitStatus

Source§

impl<'js> JsLifetime<'js> for Output

Source§

impl<'js> JsLifetime<'js> for Stdio

Source§

impl<'js, B, C> JsLifetime<'js> for ControlFlow<B, C>
where B: JsLifetime<'js>, C: JsLifetime<'js>,

Source§

type Changed<'to> = ControlFlow<<B as JsLifetime<'js>>::Changed<'to>, <C as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, K> JsLifetime<'js> for BinaryHeap<K>
where K: JsLifetime<'js>,

Source§

type Changed<'to> = BinaryHeap<<K as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, K> JsLifetime<'js> for BTreeSet<K>
where K: JsLifetime<'js>,

Source§

type Changed<'to> = BTreeSet<<K as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, K> JsLifetime<'js> for HashSet<K>
where K: JsLifetime<'js>,

Source§

type Changed<'to> = HashSet<<K as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, K, V> JsLifetime<'js> for BTreeMap<K, V>
where K: JsLifetime<'js>, V: JsLifetime<'js>,

Source§

type Changed<'to> = BTreeMap<<K as JsLifetime<'js>>::Changed<'to>, <V as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, K, V> JsLifetime<'js> for HashMap<K, V>
where K: JsLifetime<'js>, V: JsLifetime<'js>,

Source§

type Changed<'to> = HashMap<<K as JsLifetime<'js>>::Changed<'to>, <V as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Bound<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Bound<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Option<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Option<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Box<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Box<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for LinkedList<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = LinkedList<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for VecDeque<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = VecDeque<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Rc<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Rc<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Arc<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Arc<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Vec<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Vec<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Cell<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Cell<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for RefCell<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = RefCell<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for UnsafeCell<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = UnsafeCell<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Range<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Range<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for RangeFrom<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = RangeFrom<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for RangeInclusive<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = RangeInclusive<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for RangeTo<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = RangeTo<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for RangeToInclusive<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = RangeToInclusive<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for Mutex<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = Mutex<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T> JsLifetime<'js> for RwLock<T>
where T: JsLifetime<'js>,

Source§

type Changed<'to> = RwLock<<T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T, E> JsLifetime<'js> for Result<T, E>
where T: JsLifetime<'js>, E: JsLifetime<'js>,

Source§

type Changed<'to> = Result<<T as JsLifetime<'js>>::Changed<'to>, <E as JsLifetime<'js>>::Changed<'to>>

Implementors§

Source§

impl<'js> JsLifetime<'js> for PredefinedAtom

Source§

impl<'js> JsLifetime<'js> for Constructor<'js>

Source§

type Changed<'to> = Constructor<'to>

Source§

impl<'js> JsLifetime<'js> for RustFunction<'js>

Source§

type Changed<'to> = RustFunction<'to>

Source§

impl<'js> JsLifetime<'js> for Array<'js>

Source§

type Changed<'to> = Array<'to>

Source§

impl<'js> JsLifetime<'js> for ArrayBuffer<'js>

Source§

type Changed<'to> = ArrayBuffer<'to>

Source§

impl<'js> JsLifetime<'js> for Atom<'js>

Source§

type Changed<'to> = Atom<'to>

Source§

impl<'js> JsLifetime<'js> for BigInt<'js>

Source§

type Changed<'to> = BigInt<'to>

Source§

impl<'js> JsLifetime<'js> for rquickjs_core::CString<'js>

Source§

type Changed<'to> = CString<'to>

Source§

impl<'js> JsLifetime<'js> for Exception<'js>

Source§

type Changed<'to> = Exception<'to>

Source§

impl<'js> JsLifetime<'js> for Function<'js>

Source§

type Changed<'to> = Function<'to>

Source§

impl<'js> JsLifetime<'js> for Object<'js>

Source§

type Changed<'to> = Object<'to>

Source§

impl<'js> JsLifetime<'js> for Promise<'js>

Source§

type Changed<'to> = Promise<'to>

Source§

impl<'js> JsLifetime<'js> for rquickjs_core::String<'js>

Source§

type Changed<'to> = String<'to>

Source§

impl<'js> JsLifetime<'js> for Symbol<'js>

Source§

type Changed<'to> = Symbol<'to>

Source§

impl<'js> JsLifetime<'js> for Value<'js>

Source§

type Changed<'to> = Value<'to>

Source§

impl<'js, C> JsLifetime<'js> for Class<'js, C>
where C: JsClass<'js> + JsLifetime<'js>, for<'to> C::Changed<'to>: JsClass<'to>,

Source§

type Changed<'to> = Class<'to, <C as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T: JsLifetime<'js>> JsLifetime<'js> for Module<'js, T>

Source§

type Changed<'to> = Module<'to, <T as JsLifetime<'js>>::Changed<'to>>

Source§

impl<'js, T: JsLifetime<'js>> JsLifetime<'js> for TypedArray<'js, T>

Source§

type Changed<'to> = TypedArray<'to, <T as JsLifetime<'js>>::Changed<'to>>