Skip to main content

luaur_code_gen/functions/
apply_builtin_call.rs

1use crate::records::bytecode_types::{BytecodeTypes, LBC_TYPE_ANY};
2use luaur_common::enums::luau_builtin_function::LuauBuiltinFunction;
3
4pub const LBC_TYPE_NIL: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_NIL.0 as u8;
5pub const LBC_TYPE_BOOLEAN: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_BOOLEAN.0 as u8;
6pub const LBC_TYPE_NUMBER: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_NUMBER.0 as u8;
7pub const LBC_TYPE_VECTOR: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_VECTOR.0 as u8;
8pub const LBC_TYPE_STRING: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_STRING.0 as u8;
9pub const LBC_TYPE_TABLE: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_TABLE.0 as u8;
10pub const LBC_TYPE_BUFFER: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_BUFFER.0 as u8;
11pub const LBC_TYPE_INTEGER: u8 = luaur_common::enums::luau_bytecode_type::LBC_TYPE_INTEGER.0 as u8;
12
13pub fn apply_builtin_call(bfid: LuauBuiltinFunction, types: &mut BytecodeTypes) {
14    match bfid {
15        LuauBuiltinFunction::LBF_NONE | LuauBuiltinFunction::LBF_ASSERT => {
16            types.result = LBC_TYPE_ANY;
17        }
18        LuauBuiltinFunction::LBF_MATH_ABS
19        | LuauBuiltinFunction::LBF_MATH_ACOS
20        | LuauBuiltinFunction::LBF_MATH_ASIN => {
21            types.result = LBC_TYPE_NUMBER;
22            types.a = LBC_TYPE_NUMBER;
23        }
24        LuauBuiltinFunction::LBF_MATH_ATAN2 => {
25            types.result = LBC_TYPE_NUMBER;
26            types.a = LBC_TYPE_NUMBER;
27            types.b = LBC_TYPE_NUMBER;
28        }
29        LuauBuiltinFunction::LBF_MATH_ATAN
30        | LuauBuiltinFunction::LBF_MATH_CEIL
31        | LuauBuiltinFunction::LBF_MATH_COSH
32        | LuauBuiltinFunction::LBF_MATH_COS
33        | LuauBuiltinFunction::LBF_MATH_DEG
34        | LuauBuiltinFunction::LBF_MATH_EXP
35        | LuauBuiltinFunction::LBF_MATH_FLOOR => {
36            types.result = LBC_TYPE_NUMBER;
37            types.a = LBC_TYPE_NUMBER;
38        }
39        LuauBuiltinFunction::LBF_MATH_FMOD => {
40            types.result = LBC_TYPE_NUMBER;
41            types.a = LBC_TYPE_NUMBER;
42            types.b = LBC_TYPE_NUMBER;
43        }
44        LuauBuiltinFunction::LBF_MATH_FREXP => {
45            types.result = LBC_TYPE_NUMBER;
46            types.a = LBC_TYPE_NUMBER;
47        }
48        LuauBuiltinFunction::LBF_MATH_LDEXP => {
49            types.result = LBC_TYPE_NUMBER;
50            types.a = LBC_TYPE_NUMBER;
51            types.b = LBC_TYPE_NUMBER;
52        }
53        LuauBuiltinFunction::LBF_MATH_LOG10 => {
54            types.result = LBC_TYPE_NUMBER;
55            types.a = LBC_TYPE_NUMBER;
56        }
57        LuauBuiltinFunction::LBF_MATH_LOG => {
58            types.result = LBC_TYPE_NUMBER;
59            types.a = LBC_TYPE_NUMBER;
60            types.b = LBC_TYPE_NUMBER; // We can mark optional arguments
61        }
62        LuauBuiltinFunction::LBF_MATH_MAX | LuauBuiltinFunction::LBF_MATH_MIN => {
63            types.result = LBC_TYPE_NUMBER;
64            types.a = LBC_TYPE_NUMBER;
65            types.b = LBC_TYPE_NUMBER;
66            types.c = LBC_TYPE_NUMBER; // We can mark optional arguments
67        }
68        LuauBuiltinFunction::LBF_MATH_MODF => {
69            types.result = LBC_TYPE_NUMBER;
70            types.a = LBC_TYPE_NUMBER;
71        }
72        LuauBuiltinFunction::LBF_MATH_POW => {
73            types.result = LBC_TYPE_NUMBER;
74            types.a = LBC_TYPE_NUMBER;
75            types.b = LBC_TYPE_NUMBER;
76        }
77        LuauBuiltinFunction::LBF_MATH_RAD
78        | LuauBuiltinFunction::LBF_MATH_SINH
79        | LuauBuiltinFunction::LBF_MATH_SIN
80        | LuauBuiltinFunction::LBF_MATH_SQRT
81        | LuauBuiltinFunction::LBF_MATH_TANH
82        | LuauBuiltinFunction::LBF_MATH_TAN => {
83            types.result = LBC_TYPE_NUMBER;
84            types.a = LBC_TYPE_NUMBER;
85        }
86        LuauBuiltinFunction::LBF_BIT32_ARSHIFT => {
87            types.result = LBC_TYPE_NUMBER;
88            types.a = LBC_TYPE_NUMBER;
89            types.b = LBC_TYPE_NUMBER;
90        }
91        LuauBuiltinFunction::LBF_BIT32_BAND => {
92            types.result = LBC_TYPE_NUMBER;
93            types.a = LBC_TYPE_NUMBER;
94            types.b = LBC_TYPE_NUMBER;
95            types.c = LBC_TYPE_NUMBER; // We can mark optional arguments
96        }
97        LuauBuiltinFunction::LBF_BIT32_BNOT => {
98            types.result = LBC_TYPE_NUMBER;
99            types.a = LBC_TYPE_NUMBER;
100        }
101        LuauBuiltinFunction::LBF_BIT32_BOR
102        | LuauBuiltinFunction::LBF_BIT32_BXOR
103        | LuauBuiltinFunction::LBF_BIT32_BTEST
104        | LuauBuiltinFunction::LBF_BIT32_EXTRACT => {
105            types.result = LBC_TYPE_NUMBER;
106            types.a = LBC_TYPE_NUMBER;
107            types.b = LBC_TYPE_NUMBER;
108            types.c = LBC_TYPE_NUMBER; // We can mark optional arguments
109        }
110        LuauBuiltinFunction::LBF_BIT32_LROTATE | LuauBuiltinFunction::LBF_BIT32_LSHIFT => {
111            types.result = LBC_TYPE_NUMBER;
112            types.a = LBC_TYPE_NUMBER;
113            types.b = LBC_TYPE_NUMBER;
114        }
115        LuauBuiltinFunction::LBF_BIT32_REPLACE => {
116            types.result = LBC_TYPE_NUMBER;
117            types.a = LBC_TYPE_NUMBER;
118            types.b = LBC_TYPE_NUMBER;
119            types.c = LBC_TYPE_NUMBER; // We can mark optional arguments
120        }
121        LuauBuiltinFunction::LBF_BIT32_RROTATE | LuauBuiltinFunction::LBF_BIT32_RSHIFT => {
122            types.result = LBC_TYPE_NUMBER;
123            types.a = LBC_TYPE_NUMBER;
124            types.b = LBC_TYPE_NUMBER;
125        }
126        LuauBuiltinFunction::LBF_TYPE => {
127            types.result = LBC_TYPE_STRING;
128        }
129        LuauBuiltinFunction::LBF_STRING_BYTE => {
130            types.result = LBC_TYPE_NUMBER;
131            types.a = LBC_TYPE_STRING;
132            types.b = LBC_TYPE_NUMBER;
133        }
134        LuauBuiltinFunction::LBF_STRING_CHAR => {
135            types.result = LBC_TYPE_STRING;
136            // We can mark optional arguments
137            types.a = LBC_TYPE_NUMBER;
138            types.b = LBC_TYPE_NUMBER;
139            types.c = LBC_TYPE_NUMBER;
140        }
141        LuauBuiltinFunction::LBF_STRING_LEN => {
142            types.result = LBC_TYPE_NUMBER;
143            types.a = LBC_TYPE_STRING;
144        }
145        LuauBuiltinFunction::LBF_TYPEOF => {
146            types.result = LBC_TYPE_STRING;
147        }
148        LuauBuiltinFunction::LBF_STRING_SUB => {
149            types.result = LBC_TYPE_STRING;
150            types.a = LBC_TYPE_STRING;
151            types.b = LBC_TYPE_NUMBER;
152            types.c = LBC_TYPE_NUMBER;
153        }
154        LuauBuiltinFunction::LBF_MATH_CLAMP => {
155            types.result = LBC_TYPE_NUMBER;
156            types.a = LBC_TYPE_NUMBER;
157            types.b = LBC_TYPE_NUMBER;
158            types.c = LBC_TYPE_NUMBER;
159        }
160        LuauBuiltinFunction::LBF_MATH_SIGN => {
161            types.result = LBC_TYPE_NUMBER;
162            types.a = LBC_TYPE_NUMBER;
163        }
164        LuauBuiltinFunction::LBF_MATH_ROUND => {
165            types.result = LBC_TYPE_NUMBER;
166            types.a = LBC_TYPE_NUMBER;
167        }
168        LuauBuiltinFunction::LBF_RAWGET => {
169            types.result = LBC_TYPE_ANY;
170            types.a = LBC_TYPE_TABLE;
171        }
172        LuauBuiltinFunction::LBF_RAWEQUAL => {
173            types.result = LBC_TYPE_BOOLEAN;
174        }
175        LuauBuiltinFunction::LBF_TABLE_UNPACK => {
176            types.result = LBC_TYPE_ANY;
177            types.a = LBC_TYPE_TABLE;
178            types.b = LBC_TYPE_NUMBER; // We can mark optional arguments
179        }
180        LuauBuiltinFunction::LBF_VECTOR => {
181            types.result = LBC_TYPE_VECTOR;
182            types.a = LBC_TYPE_NUMBER;
183            types.b = LBC_TYPE_NUMBER;
184            types.c = LBC_TYPE_NUMBER;
185        }
186        LuauBuiltinFunction::LBF_BIT32_COUNTLZ | LuauBuiltinFunction::LBF_BIT32_COUNTRZ => {
187            types.result = LBC_TYPE_NUMBER;
188            types.a = LBC_TYPE_NUMBER;
189        }
190        LuauBuiltinFunction::LBF_SELECT_VARARG => {
191            types.result = LBC_TYPE_ANY;
192        }
193        LuauBuiltinFunction::LBF_RAWLEN => {
194            types.result = LBC_TYPE_NUMBER;
195        }
196        LuauBuiltinFunction::LBF_BIT32_EXTRACTK => {
197            types.result = LBC_TYPE_NUMBER;
198            types.a = LBC_TYPE_NUMBER;
199            types.b = LBC_TYPE_NUMBER;
200        }
201        LuauBuiltinFunction::LBF_GETMETATABLE => {
202            types.result = LBC_TYPE_TABLE;
203        }
204        LuauBuiltinFunction::LBF_TONUMBER => {
205            types.result = LBC_TYPE_NUMBER;
206        }
207        LuauBuiltinFunction::LBF_TOSTRING => {
208            types.result = LBC_TYPE_STRING;
209        }
210        LuauBuiltinFunction::LBF_BIT32_BYTESWAP => {
211            types.result = LBC_TYPE_NUMBER;
212            types.a = LBC_TYPE_NUMBER;
213        }
214        LuauBuiltinFunction::LBF_BUFFER_READI8 | LuauBuiltinFunction::LBF_BUFFER_READU8 => {
215            types.result = LBC_TYPE_NUMBER;
216            types.a = LBC_TYPE_BUFFER;
217            types.b = LBC_TYPE_NUMBER;
218        }
219        LuauBuiltinFunction::LBF_BUFFER_WRITEU8 => {
220            types.result = LBC_TYPE_NIL;
221            types.a = LBC_TYPE_BUFFER;
222            types.b = LBC_TYPE_NUMBER;
223            types.c = LBC_TYPE_NUMBER;
224        }
225        LuauBuiltinFunction::LBF_BUFFER_READI16 | LuauBuiltinFunction::LBF_BUFFER_READU16 => {
226            types.result = LBC_TYPE_NUMBER;
227            types.a = LBC_TYPE_BUFFER;
228            types.b = LBC_TYPE_NUMBER;
229        }
230        LuauBuiltinFunction::LBF_BUFFER_WRITEU16 => {
231            types.result = LBC_TYPE_NIL;
232            types.a = LBC_TYPE_BUFFER;
233            types.b = LBC_TYPE_NUMBER;
234            types.c = LBC_TYPE_NUMBER;
235        }
236        LuauBuiltinFunction::LBF_BUFFER_READI32 | LuauBuiltinFunction::LBF_BUFFER_READU32 => {
237            types.result = LBC_TYPE_NUMBER;
238            types.a = LBC_TYPE_BUFFER;
239            types.b = LBC_TYPE_NUMBER;
240        }
241        LuauBuiltinFunction::LBF_BUFFER_WRITEU32 => {
242            types.result = LBC_TYPE_NIL;
243            types.a = LBC_TYPE_BUFFER;
244            types.b = LBC_TYPE_NUMBER;
245            types.c = LBC_TYPE_NUMBER;
246        }
247        LuauBuiltinFunction::LBF_BUFFER_READF32 => {
248            types.result = LBC_TYPE_NUMBER;
249            types.a = LBC_TYPE_BUFFER;
250            types.b = LBC_TYPE_NUMBER;
251        }
252        LuauBuiltinFunction::LBF_BUFFER_WRITEF32 => {
253            types.result = LBC_TYPE_NIL;
254            types.a = LBC_TYPE_BUFFER;
255            types.b = LBC_TYPE_NUMBER;
256            types.c = LBC_TYPE_NUMBER;
257        }
258        LuauBuiltinFunction::LBF_BUFFER_READF64 => {
259            types.result = LBC_TYPE_NUMBER;
260            types.a = LBC_TYPE_BUFFER;
261            types.b = LBC_TYPE_NUMBER;
262        }
263        LuauBuiltinFunction::LBF_BUFFER_WRITEF64 => {
264            types.result = LBC_TYPE_NIL;
265            types.a = LBC_TYPE_BUFFER;
266            types.b = LBC_TYPE_NUMBER;
267            types.c = LBC_TYPE_NUMBER;
268        }
269        LuauBuiltinFunction::LBF_BUFFER_READINTEGER => {
270            types.result = LBC_TYPE_INTEGER;
271            types.a = LBC_TYPE_BUFFER;
272            types.b = LBC_TYPE_NUMBER;
273        }
274        LuauBuiltinFunction::LBF_BUFFER_WRITEINTEGER => {
275            types.result = LBC_TYPE_NIL;
276            types.a = LBC_TYPE_BUFFER;
277            types.b = LBC_TYPE_NUMBER;
278            types.c = LBC_TYPE_INTEGER;
279        }
280        LuauBuiltinFunction::LBF_TABLE_INSERT => {
281            types.result = LBC_TYPE_NIL;
282            types.a = LBC_TYPE_TABLE;
283        }
284        LuauBuiltinFunction::LBF_RAWSET => {
285            types.result = LBC_TYPE_ANY;
286            types.a = LBC_TYPE_TABLE;
287        }
288        LuauBuiltinFunction::LBF_SETMETATABLE => {
289            types.result = LBC_TYPE_TABLE;
290            types.a = LBC_TYPE_TABLE;
291            types.b = LBC_TYPE_TABLE;
292        }
293        LuauBuiltinFunction::LBF_VECTOR_MAGNITUDE => {
294            types.result = LBC_TYPE_NUMBER;
295            types.a = LBC_TYPE_VECTOR;
296        }
297        LuauBuiltinFunction::LBF_VECTOR_NORMALIZE => {
298            types.result = LBC_TYPE_VECTOR;
299            types.a = LBC_TYPE_VECTOR;
300        }
301        LuauBuiltinFunction::LBF_VECTOR_CROSS => {
302            types.result = LBC_TYPE_VECTOR;
303            types.a = LBC_TYPE_VECTOR;
304            types.b = LBC_TYPE_VECTOR;
305        }
306        LuauBuiltinFunction::LBF_VECTOR_DOT => {
307            types.result = LBC_TYPE_NUMBER;
308            types.a = LBC_TYPE_VECTOR;
309            types.b = LBC_TYPE_VECTOR;
310        }
311        LuauBuiltinFunction::LBF_VECTOR_FLOOR
312        | LuauBuiltinFunction::LBF_VECTOR_CEIL
313        | LuauBuiltinFunction::LBF_VECTOR_ABS
314        | LuauBuiltinFunction::LBF_VECTOR_SIGN
315        | LuauBuiltinFunction::LBF_VECTOR_CLAMP => {
316            types.result = LBC_TYPE_VECTOR;
317            types.a = LBC_TYPE_VECTOR;
318            types.b = LBC_TYPE_VECTOR;
319        }
320        LuauBuiltinFunction::LBF_VECTOR_MIN | LuauBuiltinFunction::LBF_VECTOR_MAX => {
321            types.result = LBC_TYPE_VECTOR;
322            types.a = LBC_TYPE_VECTOR;
323            types.b = LBC_TYPE_VECTOR;
324            types.c = LBC_TYPE_VECTOR; // We can mark optional arguments
325        }
326        LuauBuiltinFunction::LBF_VECTOR_LERP => {
327            types.result = LBC_TYPE_VECTOR;
328            types.a = LBC_TYPE_VECTOR;
329            types.b = LBC_TYPE_VECTOR;
330            types.c = LBC_TYPE_NUMBER;
331        }
332        LuauBuiltinFunction::LBF_MATH_LERP => {
333            types.result = LBC_TYPE_NUMBER;
334            types.a = LBC_TYPE_NUMBER;
335            types.b = LBC_TYPE_NUMBER;
336            types.c = LBC_TYPE_NUMBER;
337        }
338        LuauBuiltinFunction::LBF_MATH_ISNAN => {
339            types.result = LBC_TYPE_BOOLEAN;
340            types.a = LBC_TYPE_NUMBER;
341        }
342        LuauBuiltinFunction::LBF_MATH_ISINF => {
343            types.result = LBC_TYPE_BOOLEAN;
344            types.a = LBC_TYPE_NUMBER;
345        }
346        LuauBuiltinFunction::LBF_MATH_ISFINITE => {
347            types.result = LBC_TYPE_BOOLEAN;
348            types.a = LBC_TYPE_NUMBER;
349        }
350        LuauBuiltinFunction::LBF_INTEGER_NEG
351        | LuauBuiltinFunction::LBF_INTEGER_BSWAP
352        | LuauBuiltinFunction::LBF_INTEGER_BNOT
353        | LuauBuiltinFunction::LBF_INTEGER_COUNTLZ
354        | LuauBuiltinFunction::LBF_INTEGER_COUNTRZ => {
355            types.result = LBC_TYPE_INTEGER;
356            types.a = LBC_TYPE_INTEGER;
357        }
358        LuauBuiltinFunction::LBF_INTEGER_MIN
359        | LuauBuiltinFunction::LBF_INTEGER_MAX
360        | LuauBuiltinFunction::LBF_INTEGER_BAND
361        | LuauBuiltinFunction::LBF_INTEGER_BOR
362        | LuauBuiltinFunction::LBF_INTEGER_BXOR => {
363            types.a = LBC_TYPE_INTEGER;
364            types.b = LBC_TYPE_INTEGER;
365            types.c = LBC_TYPE_INTEGER; // We can mark optional arguments
366            types.result = LBC_TYPE_INTEGER;
367        }
368        LuauBuiltinFunction::LBF_INTEGER_ADD
369        | LuauBuiltinFunction::LBF_INTEGER_SUB
370        | LuauBuiltinFunction::LBF_INTEGER_MUL
371        | LuauBuiltinFunction::LBF_INTEGER_DIV
372        | LuauBuiltinFunction::LBF_INTEGER_IDIV
373        | LuauBuiltinFunction::LBF_INTEGER_REM
374        | LuauBuiltinFunction::LBF_INTEGER_UDIV
375        | LuauBuiltinFunction::LBF_INTEGER_UREM
376        | LuauBuiltinFunction::LBF_INTEGER_MOD
377        | LuauBuiltinFunction::LBF_INTEGER_LSHIFT
378        | LuauBuiltinFunction::LBF_INTEGER_LROTATE
379        | LuauBuiltinFunction::LBF_INTEGER_RROTATE
380        | LuauBuiltinFunction::LBF_INTEGER_RSHIFT
381        | LuauBuiltinFunction::LBF_INTEGER_ARSHIFT => {
382            types.a = LBC_TYPE_INTEGER;
383            types.b = LBC_TYPE_INTEGER;
384            types.result = LBC_TYPE_INTEGER;
385        }
386        LuauBuiltinFunction::LBF_INTEGER_CLAMP | LuauBuiltinFunction::LBF_INTEGER_EXTRACT => {
387            types.a = LBC_TYPE_INTEGER;
388            types.b = LBC_TYPE_INTEGER;
389            types.c = LBC_TYPE_INTEGER;
390            types.result = LBC_TYPE_INTEGER;
391        }
392        LuauBuiltinFunction::LBF_INTEGER_BTEST => {
393            types.a = LBC_TYPE_INTEGER;
394            types.b = LBC_TYPE_INTEGER;
395            types.c = LBC_TYPE_INTEGER; // We can mark optional arguments
396            types.result = LBC_TYPE_BOOLEAN;
397        }
398        LuauBuiltinFunction::LBF_INTEGER_LT
399        | LuauBuiltinFunction::LBF_INTEGER_LE
400        | LuauBuiltinFunction::LBF_INTEGER_GT
401        | LuauBuiltinFunction::LBF_INTEGER_GE
402        | LuauBuiltinFunction::LBF_INTEGER_ULT
403        | LuauBuiltinFunction::LBF_INTEGER_ULE
404        | LuauBuiltinFunction::LBF_INTEGER_UGT
405        | LuauBuiltinFunction::LBF_INTEGER_UGE => {
406            types.a = LBC_TYPE_INTEGER;
407            types.b = LBC_TYPE_INTEGER;
408            types.result = LBC_TYPE_BOOLEAN;
409        }
410        LuauBuiltinFunction::LBF_INTEGER_TONUMBER => {
411            types.a = LBC_TYPE_INTEGER;
412            types.result = LBC_TYPE_NUMBER;
413        }
414        LuauBuiltinFunction::LBF_INTEGER_CREATE => {
415            types.a = LBC_TYPE_NUMBER;
416            types.result = LBC_TYPE_INTEGER;
417        }
418    }
419}