Skip to main content

luaur_code_gen/functions/
handle_builtin_effects.rs

1use luaur_common::enums::luau_builtin_function::LuauBuiltinFunction;
2
3use crate::records::const_prop_state::ConstPropState;
4
5pub fn handle_builtin_effects(
6    state: &mut ConstPropState,
7    bfid: LuauBuiltinFunction,
8    first_return_reg: u32,
9    _nresults: i32,
10) {
11    // Switch over all values is used to force new items to be handled
12    match bfid {
13        LuauBuiltinFunction::LBF_NONE
14        | LuauBuiltinFunction::LBF_ASSERT
15        | LuauBuiltinFunction::LBF_MATH_ABS
16        | LuauBuiltinFunction::LBF_MATH_ACOS
17        | LuauBuiltinFunction::LBF_MATH_ASIN
18        | LuauBuiltinFunction::LBF_MATH_ATAN2
19        | LuauBuiltinFunction::LBF_MATH_ATAN
20        | LuauBuiltinFunction::LBF_MATH_CEIL
21        | LuauBuiltinFunction::LBF_MATH_COSH
22        | LuauBuiltinFunction::LBF_MATH_COS
23        | LuauBuiltinFunction::LBF_MATH_DEG
24        | LuauBuiltinFunction::LBF_MATH_EXP
25        | LuauBuiltinFunction::LBF_MATH_FLOOR
26        | LuauBuiltinFunction::LBF_MATH_FMOD
27        | LuauBuiltinFunction::LBF_MATH_FREXP
28        | LuauBuiltinFunction::LBF_MATH_LDEXP
29        | LuauBuiltinFunction::LBF_MATH_LOG10
30        | LuauBuiltinFunction::LBF_MATH_LOG
31        | LuauBuiltinFunction::LBF_MATH_MAX
32        | LuauBuiltinFunction::LBF_MATH_MIN
33        | LuauBuiltinFunction::LBF_MATH_MODF
34        | LuauBuiltinFunction::LBF_MATH_POW
35        | LuauBuiltinFunction::LBF_MATH_RAD
36        | LuauBuiltinFunction::LBF_MATH_SINH
37        | LuauBuiltinFunction::LBF_MATH_SIN
38        | LuauBuiltinFunction::LBF_MATH_SQRT
39        | LuauBuiltinFunction::LBF_MATH_TANH
40        | LuauBuiltinFunction::LBF_MATH_TAN
41        | LuauBuiltinFunction::LBF_BIT32_ARSHIFT
42        | LuauBuiltinFunction::LBF_BIT32_BAND
43        | LuauBuiltinFunction::LBF_BIT32_BNOT
44        | LuauBuiltinFunction::LBF_BIT32_BOR
45        | LuauBuiltinFunction::LBF_BIT32_BXOR
46        | LuauBuiltinFunction::LBF_BIT32_BTEST
47        | LuauBuiltinFunction::LBF_BIT32_EXTRACT
48        | LuauBuiltinFunction::LBF_BIT32_LROTATE
49        | LuauBuiltinFunction::LBF_BIT32_LSHIFT
50        | LuauBuiltinFunction::LBF_BIT32_REPLACE
51        | LuauBuiltinFunction::LBF_BIT32_RROTATE
52        | LuauBuiltinFunction::LBF_BIT32_RSHIFT
53        | LuauBuiltinFunction::LBF_TYPE
54        | LuauBuiltinFunction::LBF_STRING_BYTE
55        | LuauBuiltinFunction::LBF_STRING_CHAR
56        | LuauBuiltinFunction::LBF_STRING_LEN
57        | LuauBuiltinFunction::LBF_TYPEOF
58        | LuauBuiltinFunction::LBF_STRING_SUB
59        | LuauBuiltinFunction::LBF_MATH_CLAMP
60        | LuauBuiltinFunction::LBF_MATH_SIGN
61        | LuauBuiltinFunction::LBF_MATH_ROUND
62        | LuauBuiltinFunction::LBF_RAWGET
63        | LuauBuiltinFunction::LBF_RAWEQUAL
64        | LuauBuiltinFunction::LBF_TABLE_UNPACK
65        | LuauBuiltinFunction::LBF_VECTOR
66        | LuauBuiltinFunction::LBF_BIT32_COUNTLZ
67        | LuauBuiltinFunction::LBF_BIT32_COUNTRZ
68        | LuauBuiltinFunction::LBF_SELECT_VARARG
69        | LuauBuiltinFunction::LBF_RAWLEN
70        | LuauBuiltinFunction::LBF_BIT32_EXTRACTK
71        | LuauBuiltinFunction::LBF_GETMETATABLE
72        | LuauBuiltinFunction::LBF_TONUMBER
73        | LuauBuiltinFunction::LBF_TOSTRING
74        | LuauBuiltinFunction::LBF_BIT32_BYTESWAP
75        | LuauBuiltinFunction::LBF_BUFFER_READI8
76        | LuauBuiltinFunction::LBF_BUFFER_READU8
77        | LuauBuiltinFunction::LBF_BUFFER_READI16
78        | LuauBuiltinFunction::LBF_BUFFER_READU16
79        | LuauBuiltinFunction::LBF_BUFFER_READI32
80        | LuauBuiltinFunction::LBF_BUFFER_READU32
81        | LuauBuiltinFunction::LBF_BUFFER_READF32
82        | LuauBuiltinFunction::LBF_BUFFER_READF64
83        | LuauBuiltinFunction::LBF_BUFFER_READINTEGER
84        | LuauBuiltinFunction::LBF_VECTOR_MAGNITUDE
85        | LuauBuiltinFunction::LBF_VECTOR_NORMALIZE
86        | LuauBuiltinFunction::LBF_VECTOR_CROSS
87        | LuauBuiltinFunction::LBF_VECTOR_DOT
88        | LuauBuiltinFunction::LBF_VECTOR_FLOOR
89        | LuauBuiltinFunction::LBF_VECTOR_CEIL
90        | LuauBuiltinFunction::LBF_VECTOR_ABS
91        | LuauBuiltinFunction::LBF_VECTOR_SIGN
92        | LuauBuiltinFunction::LBF_VECTOR_CLAMP
93        | LuauBuiltinFunction::LBF_VECTOR_MIN
94        | LuauBuiltinFunction::LBF_VECTOR_MAX
95        | LuauBuiltinFunction::LBF_VECTOR_LERP
96        | LuauBuiltinFunction::LBF_MATH_LERP
97        | LuauBuiltinFunction::LBF_MATH_ISNAN
98        | LuauBuiltinFunction::LBF_MATH_ISINF
99        | LuauBuiltinFunction::LBF_MATH_ISFINITE
100        | LuauBuiltinFunction::LBF_INTEGER_ADD
101        | LuauBuiltinFunction::LBF_INTEGER_MUL
102        | LuauBuiltinFunction::LBF_INTEGER_IDIV
103        | LuauBuiltinFunction::LBF_INTEGER_LT
104        | LuauBuiltinFunction::LBF_INTEGER_CREATE
105        | LuauBuiltinFunction::LBF_INTEGER_MOD
106        | LuauBuiltinFunction::LBF_INTEGER_SUB
107        | LuauBuiltinFunction::LBF_INTEGER_LE
108        | LuauBuiltinFunction::LBF_INTEGER_GT
109        | LuauBuiltinFunction::LBF_INTEGER_GE
110        | LuauBuiltinFunction::LBF_INTEGER_ULT
111        | LuauBuiltinFunction::LBF_INTEGER_ULE
112        | LuauBuiltinFunction::LBF_INTEGER_UGT
113        | LuauBuiltinFunction::LBF_INTEGER_UGE
114        | LuauBuiltinFunction::LBF_INTEGER_DIV
115        | LuauBuiltinFunction::LBF_INTEGER_NEG
116        | LuauBuiltinFunction::LBF_INTEGER_BSWAP
117        | LuauBuiltinFunction::LBF_INTEGER_MIN
118        | LuauBuiltinFunction::LBF_INTEGER_MAX
119        | LuauBuiltinFunction::LBF_INTEGER_REM
120        | LuauBuiltinFunction::LBF_INTEGER_UDIV
121        | LuauBuiltinFunction::LBF_INTEGER_UREM
122        | LuauBuiltinFunction::LBF_INTEGER_BAND
123        | LuauBuiltinFunction::LBF_INTEGER_BOR
124        | LuauBuiltinFunction::LBF_INTEGER_BNOT
125        | LuauBuiltinFunction::LBF_INTEGER_BXOR
126        | LuauBuiltinFunction::LBF_INTEGER_BTEST
127        | LuauBuiltinFunction::LBF_INTEGER_COUNTRZ
128        | LuauBuiltinFunction::LBF_INTEGER_COUNTLZ
129        | LuauBuiltinFunction::LBF_INTEGER_LSHIFT
130        | LuauBuiltinFunction::LBF_INTEGER_RSHIFT
131        | LuauBuiltinFunction::LBF_INTEGER_ARSHIFT
132        | LuauBuiltinFunction::LBF_INTEGER_LROTATE
133        | LuauBuiltinFunction::LBF_INTEGER_RROTATE
134        | LuauBuiltinFunction::LBF_INTEGER_CLAMP
135        | LuauBuiltinFunction::LBF_INTEGER_EXTRACT
136        | LuauBuiltinFunction::LBF_INTEGER_TONUMBER => {}
137        LuauBuiltinFunction::LBF_BUFFER_WRITEU8
138        | LuauBuiltinFunction::LBF_BUFFER_WRITEU16
139        | LuauBuiltinFunction::LBF_BUFFER_WRITEU32
140        | LuauBuiltinFunction::LBF_BUFFER_WRITEF32
141        | LuauBuiltinFunction::LBF_BUFFER_WRITEF64
142        | LuauBuiltinFunction::LBF_BUFFER_WRITEINTEGER => {
143            state.invalidate_heap_buffer_data();
144        }
145        LuauBuiltinFunction::LBF_TABLE_INSERT => {
146            state.invalidate_heap();
147            return; // table.insert does not modify result registers.
148        }
149        LuauBuiltinFunction::LBF_RAWSET => {
150            state.invalidate_heap();
151        }
152        LuauBuiltinFunction::LBF_SETMETATABLE => {
153            state.invalidate_heap();
154        }
155    }
156
157    // TODO: classify further using switch above, some fastcalls only modify the value, not the tag
158    // TODO: fastcalls are different from calls and it might be possible to not invalidate all register starting from return
159    state.invalidate_registers_from(first_return_reg as i32);
160}