Skip to main content

luaur_compiler/functions/
get_builtin_function_id.rs

1use crate::records::builtin::Builtin;
2use crate::records::compile_options::CompileOptions;
3use luaur_common::FFlag;
4
5pub fn get_builtin_function_id(builtin: &Builtin, options: &CompileOptions) -> i32 {
6    use luaur_common::enums::luau_builtin_function::LuauBuiltinFunction::*;
7
8    if builtin.is_global("assert") {
9        return LBF_ASSERT as i32;
10    }
11
12    if builtin.is_global("type") {
13        return LBF_TYPE as i32;
14    }
15
16    if builtin.is_global("typeof") {
17        return LBF_TYPEOF as i32;
18    }
19
20    if builtin.is_global("rawset") {
21        return LBF_RAWSET as i32;
22    }
23    if builtin.is_global("rawget") {
24        return LBF_RAWGET as i32;
25    }
26    if builtin.is_global("rawequal") {
27        return LBF_RAWEQUAL as i32;
28    }
29    if builtin.is_global("rawlen") {
30        return LBF_RAWLEN as i32;
31    }
32
33    if builtin.is_global("unpack") {
34        return LBF_TABLE_UNPACK as i32;
35    }
36
37    if builtin.is_global("select") {
38        return LBF_SELECT_VARARG as i32;
39    }
40
41    if builtin.is_global("getmetatable") {
42        return LBF_GETMETATABLE as i32;
43    }
44    if builtin.is_global("setmetatable") {
45        return LBF_SETMETATABLE as i32;
46    }
47
48    if builtin.is_global("tonumber") {
49        return LBF_TONUMBER as i32;
50    }
51    if builtin.is_global("tostring") {
52        return LBF_TOSTRING as i32;
53    }
54
55    if builtin.object.operator_eq_c_char(c"math".as_ptr()) {
56        if builtin.method.operator_eq_c_char(c"abs".as_ptr()) {
57            return LBF_MATH_ABS as i32;
58        }
59        if builtin.method.operator_eq_c_char(c"acos".as_ptr()) {
60            return LBF_MATH_ACOS as i32;
61        }
62        if builtin.method.operator_eq_c_char(c"asin".as_ptr()) {
63            return LBF_MATH_ASIN as i32;
64        }
65        if builtin.method.operator_eq_c_char(c"atan2".as_ptr()) {
66            return LBF_MATH_ATAN2 as i32;
67        }
68        if builtin.method.operator_eq_c_char(c"atan".as_ptr()) {
69            return LBF_MATH_ATAN as i32;
70        }
71        if builtin.method.operator_eq_c_char(c"ceil".as_ptr()) {
72            return LBF_MATH_CEIL as i32;
73        }
74        if builtin.method.operator_eq_c_char(c"cosh".as_ptr()) {
75            return LBF_MATH_COSH as i32;
76        }
77        if builtin.method.operator_eq_c_char(c"cos".as_ptr()) {
78            return LBF_MATH_COS as i32;
79        }
80        if builtin.method.operator_eq_c_char(c"deg".as_ptr()) {
81            return LBF_MATH_DEG as i32;
82        }
83        if builtin.method.operator_eq_c_char(c"exp".as_ptr()) {
84            return LBF_MATH_EXP as i32;
85        }
86        if builtin.method.operator_eq_c_char(c"floor".as_ptr()) {
87            return LBF_MATH_FLOOR as i32;
88        }
89        if builtin.method.operator_eq_c_char(c"fmod".as_ptr()) {
90            return LBF_MATH_FMOD as i32;
91        }
92        if builtin.method.operator_eq_c_char(c"frexp".as_ptr()) {
93            return LBF_MATH_FREXP as i32;
94        }
95        if builtin.method.operator_eq_c_char(c"ldexp".as_ptr()) {
96            return LBF_MATH_LDEXP as i32;
97        }
98        if builtin.method.operator_eq_c_char(c"log10".as_ptr()) {
99            return LBF_MATH_LOG10 as i32;
100        }
101        if builtin.method.operator_eq_c_char(c"log".as_ptr()) {
102            return LBF_MATH_LOG as i32;
103        }
104        if builtin.method.operator_eq_c_char(c"max".as_ptr()) {
105            return LBF_MATH_MAX as i32;
106        }
107        if builtin.method.operator_eq_c_char(c"min".as_ptr()) {
108            return LBF_MATH_MIN as i32;
109        }
110        if builtin.method.operator_eq_c_char(c"modf".as_ptr()) {
111            return LBF_MATH_MODF as i32;
112        }
113        if builtin.method.operator_eq_c_char(c"pow".as_ptr()) {
114            return LBF_MATH_POW as i32;
115        }
116        if builtin.method.operator_eq_c_char(c"rad".as_ptr()) {
117            return LBF_MATH_RAD as i32;
118        }
119        if builtin.method.operator_eq_c_char(c"sinh".as_ptr()) {
120            return LBF_MATH_SINH as i32;
121        }
122        if builtin.method.operator_eq_c_char(c"sin".as_ptr()) {
123            return LBF_MATH_SIN as i32;
124        }
125        if builtin.method.operator_eq_c_char(c"sqrt".as_ptr()) {
126            return LBF_MATH_SQRT as i32;
127        }
128        if builtin.method.operator_eq_c_char(c"tanh".as_ptr()) {
129            return LBF_MATH_TANH as i32;
130        }
131        if builtin.method.operator_eq_c_char(c"tan".as_ptr()) {
132            return LBF_MATH_TAN as i32;
133        }
134        if builtin.method.operator_eq_c_char(c"clamp".as_ptr()) {
135            return LBF_MATH_CLAMP as i32;
136        }
137        if builtin.method.operator_eq_c_char(c"sign".as_ptr()) {
138            return LBF_MATH_SIGN as i32;
139        }
140        if builtin.method.operator_eq_c_char(c"round".as_ptr()) {
141            return LBF_MATH_ROUND as i32;
142        }
143        if builtin.method.operator_eq_c_char(c"lerp".as_ptr()) {
144            return LBF_MATH_LERP as i32;
145        }
146        if builtin.method.operator_eq_c_char(c"isnan".as_ptr()) {
147            return LBF_MATH_ISNAN as i32;
148        }
149        if builtin.method.operator_eq_c_char(c"isinf".as_ptr()) {
150            return LBF_MATH_ISINF as i32;
151        }
152        if builtin.method.operator_eq_c_char(c"isfinite".as_ptr()) {
153            return LBF_MATH_ISFINITE as i32;
154        }
155    }
156
157    if builtin.object.operator_eq_c_char(c"bit32".as_ptr()) {
158        if builtin.method.operator_eq_c_char(c"arshift".as_ptr()) {
159            return LBF_BIT32_ARSHIFT as i32;
160        }
161        if builtin.method.operator_eq_c_char(c"band".as_ptr()) {
162            return LBF_BIT32_BAND as i32;
163        }
164        if builtin.method.operator_eq_c_char(c"bnot".as_ptr()) {
165            return LBF_BIT32_BNOT as i32;
166        }
167        if builtin.method.operator_eq_c_char(c"bor".as_ptr()) {
168            return LBF_BIT32_BOR as i32;
169        }
170        if builtin.method.operator_eq_c_char(c"bxor".as_ptr()) {
171            return LBF_BIT32_BXOR as i32;
172        }
173        if builtin.method.operator_eq_c_char(c"btest".as_ptr()) {
174            return LBF_BIT32_BTEST as i32;
175        }
176        if builtin.method.operator_eq_c_char(c"extract".as_ptr()) {
177            return LBF_BIT32_EXTRACT as i32;
178        }
179        if builtin.method.operator_eq_c_char(c"lrotate".as_ptr()) {
180            return LBF_BIT32_LROTATE as i32;
181        }
182        if builtin.method.operator_eq_c_char(c"lshift".as_ptr()) {
183            return LBF_BIT32_LSHIFT as i32;
184        }
185        if builtin.method.operator_eq_c_char(c"replace".as_ptr()) {
186            return LBF_BIT32_REPLACE as i32;
187        }
188        if builtin.method.operator_eq_c_char(c"rrotate".as_ptr()) {
189            return LBF_BIT32_RROTATE as i32;
190        }
191        if builtin.method.operator_eq_c_char(c"rshift".as_ptr()) {
192            return LBF_BIT32_RSHIFT as i32;
193        }
194        if builtin.method.operator_eq_c_char(c"countlz".as_ptr()) {
195            return LBF_BIT32_COUNTLZ as i32;
196        }
197        if builtin.method.operator_eq_c_char(c"countrz".as_ptr()) {
198            return LBF_BIT32_COUNTRZ as i32;
199        }
200        if builtin.method.operator_eq_c_char(c"byteswap".as_ptr()) {
201            return LBF_BIT32_BYTESWAP as i32;
202        }
203    }
204
205    if builtin.object.operator_eq_c_char(c"string".as_ptr()) {
206        if builtin.method.operator_eq_c_char(c"byte".as_ptr()) {
207            return LBF_STRING_BYTE as i32;
208        }
209        if builtin.method.operator_eq_c_char(c"char".as_ptr()) {
210            return LBF_STRING_CHAR as i32;
211        }
212        if builtin.method.operator_eq_c_char(c"len".as_ptr()) {
213            return LBF_STRING_LEN as i32;
214        }
215        if builtin.method.operator_eq_c_char(c"sub".as_ptr()) {
216            return LBF_STRING_SUB as i32;
217        }
218    }
219
220    if builtin.object.operator_eq_c_char(c"table".as_ptr()) {
221        if builtin.method.operator_eq_c_char(c"insert".as_ptr()) {
222            return LBF_TABLE_INSERT as i32;
223        }
224        if builtin.method.operator_eq_c_char(c"unpack".as_ptr()) {
225            return LBF_TABLE_UNPACK as i32;
226        }
227    }
228
229    if builtin.object.operator_eq_c_char(c"buffer".as_ptr()) {
230        if builtin.method.operator_eq_c_char(c"readi8".as_ptr()) {
231            return LBF_BUFFER_READI8 as i32;
232        }
233        if builtin.method.operator_eq_c_char(c"readu8".as_ptr()) {
234            return LBF_BUFFER_READU8 as i32;
235        }
236        if builtin.method.operator_eq_c_char(c"writei8".as_ptr())
237            || builtin.method.operator_eq_c_char(c"writeu8".as_ptr())
238        {
239            return LBF_BUFFER_WRITEU8 as i32;
240        }
241        if builtin.method.operator_eq_c_char(c"readi16".as_ptr()) {
242            return LBF_BUFFER_READI16 as i32;
243        }
244        if builtin.method.operator_eq_c_char(c"readu16".as_ptr()) {
245            return LBF_BUFFER_READU16 as i32;
246        }
247        if builtin.method.operator_eq_c_char(c"writei16".as_ptr())
248            || builtin.method.operator_eq_c_char(c"writeu16".as_ptr())
249        {
250            return LBF_BUFFER_WRITEU16 as i32;
251        }
252        if builtin.method.operator_eq_c_char(c"readi32".as_ptr()) {
253            return LBF_BUFFER_READI32 as i32;
254        }
255        if builtin.method.operator_eq_c_char(c"readu32".as_ptr()) {
256            return LBF_BUFFER_READU32 as i32;
257        }
258        if builtin.method.operator_eq_c_char(c"writei32".as_ptr())
259            || builtin.method.operator_eq_c_char(c"writeu32".as_ptr())
260        {
261            return LBF_BUFFER_WRITEU32 as i32;
262        }
263        if builtin.method.operator_eq_c_char(c"readf32".as_ptr()) {
264            return LBF_BUFFER_READF32 as i32;
265        }
266        if builtin.method.operator_eq_c_char(c"writef32".as_ptr()) {
267            return LBF_BUFFER_WRITEF32 as i32;
268        }
269        if builtin.method.operator_eq_c_char(c"readf64".as_ptr()) {
270            return LBF_BUFFER_READF64 as i32;
271        }
272        if builtin.method.operator_eq_c_char(c"writef64".as_ptr()) {
273            return LBF_BUFFER_WRITEF64 as i32;
274        }
275        if FFlag::LuauIntegerFastcalls.get()
276            && builtin.method.operator_eq_c_char(c"readinteger".as_ptr())
277        {
278            return LBF_BUFFER_READINTEGER as i32;
279        }
280        if FFlag::LuauIntegerFastcalls.get()
281            && builtin.method.operator_eq_c_char(c"writeinteger".as_ptr())
282        {
283            return LBF_BUFFER_WRITEINTEGER as i32;
284        }
285    }
286
287    if builtin.object.operator_eq_c_char(c"vector".as_ptr()) {
288        if builtin.method.operator_eq_c_char(c"create".as_ptr()) {
289            return LBF_VECTOR as i32;
290        }
291        if builtin.method.operator_eq_c_char(c"magnitude".as_ptr()) {
292            return LBF_VECTOR_MAGNITUDE as i32;
293        }
294        if builtin.method.operator_eq_c_char(c"normalize".as_ptr()) {
295            return LBF_VECTOR_NORMALIZE as i32;
296        }
297        if builtin.method.operator_eq_c_char(c"cross".as_ptr()) {
298            return LBF_VECTOR_CROSS as i32;
299        }
300        if builtin.method.operator_eq_c_char(c"dot".as_ptr()) {
301            return LBF_VECTOR_DOT as i32;
302        }
303        if builtin.method.operator_eq_c_char(c"floor".as_ptr()) {
304            return LBF_VECTOR_FLOOR as i32;
305        }
306        if builtin.method.operator_eq_c_char(c"ceil".as_ptr()) {
307            return LBF_VECTOR_CEIL as i32;
308        }
309        if builtin.method.operator_eq_c_char(c"abs".as_ptr()) {
310            return LBF_VECTOR_ABS as i32;
311        }
312        if builtin.method.operator_eq_c_char(c"sign".as_ptr()) {
313            return LBF_VECTOR_SIGN as i32;
314        }
315        if builtin.method.operator_eq_c_char(c"clamp".as_ptr()) {
316            return LBF_VECTOR_CLAMP as i32;
317        }
318        if builtin.method.operator_eq_c_char(c"min".as_ptr()) {
319            return LBF_VECTOR_MIN as i32;
320        }
321        if builtin.method.operator_eq_c_char(c"max".as_ptr()) {
322            return LBF_VECTOR_MAX as i32;
323        }
324        if builtin.method.operator_eq_c_char(c"lerp".as_ptr()) {
325            return LBF_VECTOR_LERP as i32;
326        }
327    }
328
329    if FFlag::LuauIntegerFastcalls.get() && builtin.object.operator_eq_c_char(c"integer".as_ptr()) {
330        if builtin.method.operator_eq_c_char(c"add".as_ptr()) {
331            return LBF_INTEGER_ADD as i32;
332        }
333        if builtin.method.operator_eq_c_char(c"sub".as_ptr()) {
334            return LBF_INTEGER_SUB as i32;
335        }
336        if builtin.method.operator_eq_c_char(c"mod".as_ptr()) {
337            return LBF_INTEGER_MOD as i32;
338        }
339        if builtin.method.operator_eq_c_char(c"mul".as_ptr()) {
340            return LBF_INTEGER_MUL as i32;
341        }
342        if builtin.method.operator_eq_c_char(c"div".as_ptr()) {
343            return LBF_INTEGER_DIV as i32;
344        }
345        if builtin.method.operator_eq_c_char(c"idiv".as_ptr()) {
346            return LBF_INTEGER_IDIV as i32;
347        }
348        if builtin.method.operator_eq_c_char(c"udiv".as_ptr()) {
349            return LBF_INTEGER_UDIV as i32;
350        }
351        if builtin.method.operator_eq_c_char(c"rem".as_ptr()) {
352            return LBF_INTEGER_REM as i32;
353        }
354        if builtin.method.operator_eq_c_char(c"urem".as_ptr()) {
355            return LBF_INTEGER_UREM as i32;
356        }
357        if builtin.method.operator_eq_c_char(c"min".as_ptr()) {
358            return LBF_INTEGER_MIN as i32;
359        }
360        if builtin.method.operator_eq_c_char(c"max".as_ptr()) {
361            return LBF_INTEGER_MAX as i32;
362        }
363        if builtin.method.operator_eq_c_char(c"neg".as_ptr()) {
364            return LBF_INTEGER_NEG as i32;
365        }
366        if builtin.method.operator_eq_c_char(c"create".as_ptr()) {
367            return LBF_INTEGER_CREATE as i32;
368        }
369        if builtin.method.operator_eq_c_char(c"clamp".as_ptr()) {
370            return LBF_INTEGER_CLAMP as i32;
371        }
372        if builtin.method.operator_eq_c_char(c"band".as_ptr()) {
373            return LBF_INTEGER_BAND as i32;
374        }
375        if builtin.method.operator_eq_c_char(c"bor".as_ptr()) {
376            return LBF_INTEGER_BOR as i32;
377        }
378        if builtin.method.operator_eq_c_char(c"bxor".as_ptr()) {
379            return LBF_INTEGER_BXOR as i32;
380        }
381        if builtin.method.operator_eq_c_char(c"bnot".as_ptr()) {
382            return LBF_INTEGER_BNOT as i32;
383        }
384        if builtin.method.operator_eq_c_char(c"btest".as_ptr()) {
385            return LBF_INTEGER_BTEST as i32;
386        }
387        if builtin.method.operator_eq_c_char(c"bswap".as_ptr()) {
388            return LBF_INTEGER_BSWAP as i32;
389        }
390        if builtin.method.operator_eq_c_char(c"lt".as_ptr()) {
391            return LBF_INTEGER_LT as i32;
392        }
393        if builtin.method.operator_eq_c_char(c"le".as_ptr()) {
394            return LBF_INTEGER_LE as i32;
395        }
396        if builtin.method.operator_eq_c_char(c"ult".as_ptr()) {
397            return LBF_INTEGER_ULT as i32;
398        }
399        if builtin.method.operator_eq_c_char(c"ule".as_ptr()) {
400            return LBF_INTEGER_ULE as i32;
401        }
402        if builtin.method.operator_eq_c_char(c"gt".as_ptr()) {
403            return LBF_INTEGER_GT as i32;
404        }
405        if builtin.method.operator_eq_c_char(c"ge".as_ptr()) {
406            return LBF_INTEGER_GE as i32;
407        }
408        if builtin.method.operator_eq_c_char(c"ugt".as_ptr()) {
409            return LBF_INTEGER_UGT as i32;
410        }
411        if builtin.method.operator_eq_c_char(c"uge".as_ptr()) {
412            return LBF_INTEGER_UGE as i32;
413        }
414        if builtin.method.operator_eq_c_char(c"lshift".as_ptr()) {
415            return LBF_INTEGER_LSHIFT as i32;
416        }
417        if builtin.method.operator_eq_c_char(c"rshift".as_ptr()) {
418            return LBF_INTEGER_RSHIFT as i32;
419        }
420        if builtin.method.operator_eq_c_char(c"arshift".as_ptr()) {
421            return LBF_INTEGER_ARSHIFT as i32;
422        }
423        if builtin.method.operator_eq_c_char(c"lrotate".as_ptr()) {
424            return LBF_INTEGER_LROTATE as i32;
425        }
426        if builtin.method.operator_eq_c_char(c"rrotate".as_ptr()) {
427            return LBF_INTEGER_RROTATE as i32;
428        }
429        if builtin.method.operator_eq_c_char(c"countrz".as_ptr()) {
430            return LBF_INTEGER_COUNTRZ as i32;
431        }
432        if builtin.method.operator_eq_c_char(c"countlz".as_ptr()) {
433            return LBF_INTEGER_COUNTLZ as i32;
434        }
435        if builtin.method.operator_eq_c_char(c"extract".as_ptr()) {
436            return LBF_INTEGER_EXTRACT as i32;
437        }
438        if builtin.method.operator_eq_c_char(c"tonumber".as_ptr()) {
439            return LBF_INTEGER_TONUMBER as i32;
440        }
441    }
442
443    if !options.vector_ctor.is_null() {
444        let vector_ctor =
445            unsafe { core::ffi::CStr::from_ptr(options.vector_ctor).to_string_lossy() };
446        if !options.vector_lib.is_null() {
447            let vector_lib =
448                unsafe { core::ffi::CStr::from_ptr(options.vector_lib).to_string_lossy() };
449            if builtin.is_method(&vector_lib, &vector_ctor) {
450                return LBF_VECTOR as i32;
451            }
452        } else {
453            if builtin.is_global(&vector_ctor) {
454                return LBF_VECTOR as i32;
455            }
456        }
457    }
458
459    -1
460}