Skip to main content

luaur_bytecode/records/
bc_get_var_args.rs

1use core::marker::PhantomData;
2
3use luaur_common::enums::luau_opcode::LuauOpcode;
4
5use crate::methods::bc_function_as::BcInstType;
6use crate::methods::bc_inst_helper_create::BcInstHelperCreate;
7use crate::records::bc_function::{BcFunction, VmConst};
8use crate::records::bc_inst::BcInst;
9use crate::records::bc_inst_helper::BcInstHelper;
10use crate::records::bc_ref::BcRef;
11use crate::type_aliases::reg::Reg;
12
13#[derive(Debug)]
14pub struct BcGetVarArgs<'a, T = VmConst> {
15    pub(crate) base: BcInstHelper<'a>,
16    _marker: PhantomData<T>,
17}
18
19impl<'a, T> BcGetVarArgs<'a, T> {
20    pub const K_START_REG_INPUT: u32 = 0;
21
22    pub fn from(graph: *mut BcFunction, inst: BcRef<'a, BcInst>) -> Self {
23        Self {
24            base: BcInstHelper::new(unsafe { &mut *graph }, inst),
25            _marker: PhantomData,
26        }
27    }
28
29    pub fn values_count(&mut self) -> i32 {
30        self.base.int_imm_input(1)
31    }
32
33    pub fn set_values_count(&mut self, value: u32) {
34        self.base.set_imm_input(1, value as i32);
35    }
36
37    pub fn start_reg(&self) -> Reg {
38        self.base.operator_deref().ops[Self::K_START_REG_INPUT as usize].index as Reg
39    }
40}
41
42impl<T> BcInstType for BcGetVarArgs<'_, T> {
43    const OPCODE: i32 = LuauOpcode::LOP_GETVARARGS as i32;
44}
45
46impl<T> BcInstHelperCreate for BcGetVarArgs<'_, T> {
47    const OPCODE: LuauOpcode = LuauOpcode::LOP_GETVARARGS;
48}