devela/lang/prog/script/machine/
call.rs1#[cfg(doc)]
7use crate::ScriptMachine;
8use crate::{ConstInit, InvalidValue, NonMaxU16, WordTry, unwrap};
9
10#[doc = crate::_tags!(lang uid)]
11#[doc = crate::_doc_meta!{
13 location("lang/prog/script/machine"),
14 test_size_of(ScriptCallId = 2|16; niche Option),
15}]
16#[must_use]
17#[repr(transparent)]
18#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
19pub struct ScriptCallId(NonMaxU16);
20
21impl ConstInit for ScriptCallId {
22 const INIT: Self = Self(NonMaxU16::MAX);
26}
27
28impl ScriptCallId {
29 #[must_use]
31 pub const fn new(raw: u16) -> Option<Self> {
32 Some(Self(unwrap![some? NonMaxU16::new(raw)]))
33 }
34 #[must_use]
38 pub const fn raw(self) -> u16 {
39 self.0.get()
40 }
41}
42
43impl WordTry for ScriptCallId {
44 type Repr = u16;
45 type Error = InvalidValue;
46 fn raw(self) -> Self::Repr {
47 ScriptCallId::raw(self)
48 }
49 fn try_from_raw(raw: Self::Repr) -> Result<Self, Self::Error> {
50 unwrap![some_ok_or ScriptCallId::new(raw), InvalidValue]
51 }
52}
53
54#[doc = crate::_tags!(lang runtime)]
55#[doc = crate::_doc_meta!{
57 location("lang/prog/script/machine"),
58 #[cfg(target_pointer_width = "32")]
59 test_size_of(ScriptCall = 12|96; niche Option),
60 #[cfg(target_pointer_width = "64")]
61 test_size_of(ScriptCall = 24|192; niche Option),
62}]
63#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
66pub struct ScriptCall {
67 pub(super) ip: usize,
68 pub(super) stack_len: usize,
69 id: ScriptCallId,
70 arity: u8,
71}
72impl ConstInit for ScriptCall {
73 const INIT: Self = Self {
75 ip: usize::MAX,
76 stack_len: usize::MAX,
77 id: ScriptCallId::INIT,
78 arity: u8::MAX,
79 };
80}
81impl ScriptCall {
82 pub(crate) const fn new(ip: usize, stack_len: usize, id: ScriptCallId, arity: u8) -> Self {
83 Self { ip, stack_len, id, arity }
84 }
85 pub const fn id(self) -> ScriptCallId {
87 self.id
88 }
89 #[must_use]
91 pub const fn arity(self) -> u8 {
92 self.arity
93 }
94 #[must_use]
96 pub const fn ip(self) -> usize {
97 self.ip
98 }
99}