Skip to main content

luaur_code_gen/records/
const_prop_state.rs

1use crate::enums::ir_cmd::IrCmd;
2use crate::enums::ir_op_kind::IrOpKind;
3use crate::records::array_value_entry::ArrayValueEntry;
4use crate::records::buffer_access_base::BufferAccessBase;
5use crate::records::buffer_load_store_info::BufferLoadStoreInfo;
6use crate::records::ir_block::IrBlock;
7use crate::records::ir_builder::IrBuilder;
8use crate::records::ir_function::IrFunction;
9use crate::records::ir_inst::IrInst;
10use crate::records::ir_inst_eq::IrInstEq;
11use crate::records::ir_inst_hash::IrInstHash;
12use crate::records::ir_op::IrOp;
13use crate::records::node_slot_state::NodeSlotState;
14use crate::records::numbered_instruction::NumberedInstruction;
15use crate::records::register_info::RegisterInfo;
16use crate::records::register_link::RegisterLink;
17use alloc::vec::Vec;
18use luaur_common::records::dense_hash_map::DenseHashMap;
19use luaur_common::records::dense_hash_set::DenseHashSet;
20
21#[derive(Debug)]
22pub struct ConstPropState {
23    pub build: *mut IrBuilder,
24    pub function: *mut IrFunction,
25    pub regs: [RegisterInfo; 256],
26    pub max_reg: i32,
27    pub inst_pos: u32,
28    pub in_safe_env: bool,
29    pub checked_gc: bool,
30    pub inst_link: DenseHashMap<u32, RegisterLink>,
31    pub inst_tag: DenseHashMap<u32, u8>,
32    pub inst_value: DenseHashMap<u32, IrOp>,
33    pub value_map: DenseHashMap<IrInst, u32, IrInstHash, IrInstEq>,
34    pub upvalue_map: DenseHashMap<u8, u32>,
35    pub hash_value_cache: DenseHashMap<u32, u32>,
36    pub array_value_cache: Vec<ArrayValueEntry>,
37    pub try_num_to_index_cache: Vec<u32>,
38    pub get_slot_node_cache: Vec<NumberedInstruction>,
39    pub check_slot_match_cache: Vec<NodeSlotState>,
40    pub get_arr_addr_cache: Vec<u32>,
41    pub check_array_size_cache: Vec<u32>,
42    pub check_buffer_len_cache: Vec<u32>,
43    pub useradata_tag_cache: Vec<u32>,
44    pub buffer_load_store_info: Vec<BufferLoadStoreInfo>,
45    pub load_env_idx: u32,
46    pub inst_not_readonly: DenseHashSet<u32>,
47    pub inst_no_metatable: DenseHashSet<u32>,
48    pub inst_array_size: DenseHashMap<u32, i32>,
49    pub range_end_temp: Vec<u32>,
50}
51
52impl ConstPropState {
53    pub fn clear(&mut self) {
54        for i in 0..=self.max_reg as usize {
55            self.regs[i] = RegisterInfo::default();
56        }
57        self.max_reg = 0;
58        self.inst_pos = 0;
59        self.in_safe_env = false;
60        self.checked_gc = false;
61        self.inst_link.clear();
62        self.inst_tag.clear();
63        self.inst_value.clear();
64        self.value_map.clear();
65        self.upvalue_map.clear();
66        self.hash_value_cache.clear();
67        self.array_value_cache.clear();
68        self.try_num_to_index_cache.clear();
69        self.get_slot_node_cache.clear();
70        self.check_slot_match_cache.clear();
71        self.get_arr_addr_cache.clear();
72        self.check_array_size_cache.clear();
73        self.check_buffer_len_cache.clear();
74        self.useradata_tag_cache.clear();
75        self.buffer_load_store_info.clear();
76        self.load_env_idx = !0;
77        self.inst_not_readonly.clear();
78        self.inst_no_metatable.clear();
79        self.inst_array_size.clear();
80        self.range_end_temp.clear();
81    }
82}