luaur_code_gen/records/
const_prop_state.rs1use 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}