pub struct Thread { /* private fields */ }
Expand description
Representation of the virtual machine
Implementations§
source§impl Thread
impl Thread
sourcepub fn new_thread(&self) -> Result<RootedThread>
pub fn new_thread(&self) -> Result<RootedThread>
Spawns a new gluon thread with its own stack and heap but while still sharing the same global environment
sourcepub fn root_thread(&self) -> RootedThread
pub fn root_thread(&self) -> RootedThread
Roots self
, extending the lifetime of this thread until at least the returned
RootedThread
is droppped
pub fn spawner(&self) -> Option<&(dyn Spawn + Send + Sync)>
sourcepub fn get_global<'vm, T>(&'vm self, name: &str) -> Result<T>
pub fn get_global<'vm, T>(&'vm self, name: &str) -> Result<T>
Retrieves the global called name
.
Examples
Bind the (+)
function in gluon’s prelude standard library
to an add
function in rust
let vm = new_vm_async().await;
vm.run_expr_async::<OpaqueValue<&Thread, Hole>>("example", r#" import! std.int "#)
.await
.unwrap_or_else(|err| panic!("{}", err));
let mut add: FunctionRef<fn(i32, i32) -> i32> =
vm.get_global("std.int.num.(+)").unwrap();
let result = add.call_async(1, 2).await;
assert_eq!(result, Ok(3));
Errors
if the global does not exist or it does not have the correct type.
pub fn get_global_type(&self, name: &str) -> Result<ArcType>
sourcepub fn find_type_info(&self, name: &str) -> Result<Alias<Symbol, ArcType>>
pub fn find_type_info(&self, name: &str) -> Result<Alias<Symbol, ArcType>>
Retrieves type information about the type name
. Types inside records can be accessed
using dot notation (std.prelude.Option)
sourcepub fn get_type<T: ?Sized + Any>(&self) -> Option<ArcType>
pub fn get_type<T: ?Sized + Any>(&self) -> Option<ArcType>
Returns the gluon type that was bound to T
sourcepub fn register_type<T: ?Sized + Any>(
&self,
name: &str,
args: &[&str]
) -> Result<ArcType>
pub fn register_type<T: ?Sized + Any>( &self, name: &str, args: &[&str] ) -> Result<ArcType>
Registers the type T
as being a gluon type called name
with generic arguments args
pub fn register_type_as( &self, name: Symbol, alias: Alias<Symbol, ArcType>, id: TypeId ) -> Result<ArcType>
pub fn get_cache_alias(&self, name: &str) -> Option<ArcType>
pub fn cache_alias(&self, alias: Alias<Symbol, ArcType>) -> ArcType
sourcepub fn get_env<'b>(&'b self) -> VmEnvInstance<'b>
pub fn get_env<'b>(&'b self) -> VmEnvInstance<'b>
Locks and retrieves the global environment of the vm
sourcepub fn get_macros(&self) -> &MacroEnv
pub fn get_macros(&self) -> &MacroEnv
Retrieves the macros defined for this vm
sourcepub fn push<'vm, T>(&'vm self, v: T) -> Result<()>where
T: Pushable<'vm>,
pub fn push<'vm, T>(&'vm self, v: T) -> Result<()>where
T: Pushable<'vm>,
Pushes a value to the top of the stack
pub fn allocated_memory(&self) -> usize
pub fn set_memory_limit(&self, memory_limit: usize)
pub fn interrupt(&self)
pub fn interrupted(&self) -> bool
pub fn current_context(&self) -> ActiveThread<'_>
Trait Implementations§
source§impl<'de, 'gc> DeserializeState<'de, DeSeed<'gc>> for Thread
impl<'de, 'gc> DeserializeState<'de, DeSeed<'gc>> for Thread
source§fn deserialize_state<__D>(
__seed: &mut DeSeed<'gc>,
__deserializer: __D
) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize_state<__D>(
__seed: &mut DeSeed<'gc>,
__deserializer: __D
) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Self
using seed
and the deserializer
source§impl PartialEq for Thread
impl PartialEq for Thread
source§impl PostDeserialize for Thread
impl PostDeserialize for Thread
source§impl SerializeState<SeSeed> for Thread
impl SerializeState<SeSeed> for Thread
source§fn serialize_state<__S>(
&self,
__serializer: __S,
__seed: &SeSeed
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
fn serialize_state<__S>(
&self,
__serializer: __S,
__seed: &SeSeed
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
self
source§impl SerializeState<Thread> for JsonString
impl SerializeState<Thread> for JsonString
source§fn serialize_state<__S>(
&self,
__serializer: __S,
__seed: &Thread
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
fn serialize_state<__S>(
&self,
__serializer: __S,
__seed: &Thread
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
self
source§impl SerializeState<Thread> for JsonValue
impl SerializeState<Thread> for JsonValue
source§fn serialize_state<S>(
&self,
serializer: S,
vm: &Thread
) -> StdResult<S::Ok, S::Error>where
S: Serializer,
fn serialize_state<S>(
&self,
serializer: S,
vm: &Thread
) -> StdResult<S::Ok, S::Error>where
S: Serializer,
self
source§impl<T> SerializeState<Thread> for Opaque<T, str>where
T: AsValueRef,
impl<T> SerializeState<Thread> for Opaque<T, str>where
T: AsValueRef,
source§fn serialize_state<S>(
&self,
serializer: S,
_thread: &Thread
) -> StdResult<S::Ok, S::Error>where
S: Serializer,
fn serialize_state<S>(
&self,
serializer: S,
_thread: &Thread
) -> StdResult<S::Ok, S::Error>where
S: Serializer,
self
source§impl SerializeState<Thread> for Value
impl SerializeState<Thread> for Value
source§fn serialize_state<__S>(
&self,
__serializer: __S,
__seed: &Thread
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
fn serialize_state<__S>(
&self,
__serializer: __S,
__seed: &Thread
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
self
source§impl ThreadInternal for Thread
impl ThreadInternal for Thread
source§fn root_value<'vm, T>(&'vm self, value: Variants<'_>) -> RootedValue<T>where
T: VmRoot<'vm>,
fn root_value<'vm, T>(&'vm self, value: Variants<'_>) -> RootedValue<T>where
T: VmRoot<'vm>,
Roots a value
source§fn execute_io<'life0, 'life1, 'async_trait>(
&'life0 self,
value: Variants<'life1>
) -> Pin<Box<dyn Future<Output = Result<RootedValue<RootedThread>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn execute_io<'life0, 'life1, 'async_trait>(
&'life0 self,
value: Variants<'life1>
) -> Pin<Box<dyn Future<Output = Result<RootedValue<RootedThread>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Calls a module, allowed to to run IO expressions
source§fn call_function<'b>(
&'b self,
cx: &mut Context<'_>,
context: OwnedContext<'b>,
args: VmIndex
) -> Poll<Result<Option<OwnedContext<'b>>>>
fn call_function<'b>( &'b self, cx: &mut Context<'_>, context: OwnedContext<'b>, args: VmIndex ) -> Poll<Result<Option<OwnedContext<'b>>>>
Calls a function on the stack.
When this function is called it is expected that the function exists at
stack.len() - args - 1
and that the arguments are of the correct type
source§fn context(&self) -> OwnedContext<'_>
fn context(&self) -> OwnedContext<'_>
source§fn call_thunk<'life0, 'life1, 'async_trait>(
&'life0 self,
closure: &'life1 GcPtr<ClosureData>
) -> Pin<Box<dyn Future<Output = Result<RootedValue<RootedThread>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn call_thunk<'life0, 'life1, 'async_trait>(
&'life0 self,
closure: &'life1 GcPtr<ClosureData>
) -> Pin<Box<dyn Future<Output = Result<RootedValue<RootedThread>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn resume(&self, cx: &mut Context<'_>) -> Poll<Result<OwnedContext<'_>>>
fn deep_clone_value( &self, owner: &Thread, value: &Value ) -> Result<RootedValue<&Thread>>
fn call_thunk_top<'life0, 'life1, 'async_trait>( &'life0 self, closure: &'life1 GcPtr<ClosureData> ) -> Pin<Box<dyn Future<Output = Result<RootedValue<RootedThread>>> + Send + 'async_trait>>
fn execute_io_top<'life0, 'life1, 'async_trait>( &'life0 self, value: Variants<'life1> ) -> Pin<Box<dyn Future<Output = Result<RootedValue<RootedThread>>> + Send + 'async_trait>>
source§impl<'a> VmRootInternal for &'a Thread
impl<'a> VmRootInternal for &'a Thread
source§impl VmType for Thread
impl VmType for Thread
fn make_forall_type(vm: &Thread) -> ArcType
source§const EXTRA_ARGS: VmIndex = 0u32
const EXTRA_ARGS: VmIndex = 0u32
Auto Trait Implementations§
impl !RefUnwindSafe for Thread
impl Send for Thread
impl Sync for Thread
impl Unpin for Thread
impl !UnwindSafe for Thread
Blanket Implementations§
source§impl<'vm, T> AsyncPushable<'vm> for Twhere
T: Pushable<'vm>,
impl<'vm, T> AsyncPushable<'vm> for Twhere
T: Pushable<'vm>,
source§fn async_push(
self,
context: &mut ActiveThread<'vm>,
lock: Lock,
_: u32
) -> Poll<Result<(), Error>>
fn async_push( self, context: &mut ActiveThread<'vm>, lock: Lock, _: u32 ) -> Poll<Result<(), Error>>
self
to stack
. If the call is successful a single element should have been added
to the stack and Ok(())
should be returned. If the call is unsuccessful Status:Error
should be returned and the stack should be left intact. Read morefn async_status_push(
self,
context: &mut ActiveThread<'vm>,
lock: Lock,
frame_index: VmIndex
) -> Statuswhere
Self: Sized,
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.source§impl<T> DowncastArc for T
impl<T> DowncastArc for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
source§impl<'vm, T> Pushable<'vm> for Twhere
T: Userdata,
impl<'vm, T> Pushable<'vm> for Twhere
T: Userdata,
source§fn vm_push(self, context: &mut ActiveThread<'vm>) -> Result<(), Error>
fn vm_push(self, context: &mut ActiveThread<'vm>) -> Result<(), Error>
self
to stack
. If the call is successful a single element should have been added
to the stack and Ok(())
should be returned. If the call is unsuccessful Status:Error
should be returned and the stack should be left intact