luaur_code_gen/functions/
apply_builtin_call.rs1use 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; }
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; }
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; }
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; }
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; }
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 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; }
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; }
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; 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; 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}