luaur_compiler/functions/
get_builtin_function_id.rs1use 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}