luaur_compiler/methods/
compiler_is_expr_mult_ret.rs1use crate::functions::get_builtin_info::get_builtin_info;
2use crate::records::compiler::Compiler;
3use luaur_ast::records::ast_expr::AstExpr;
4use luaur_ast::records::ast_expr_call::AstExprCall;
5use luaur_ast::records::ast_expr_varargs::AstExprVarargs;
6use luaur_ast::records::ast_node::AstNode;
7use luaur_common::enums::luau_builtin_function::LuauBuiltinFunction;
8
9impl Compiler {
10 pub fn is_expr_mult_ret(&mut self, node: *mut AstExpr) -> bool {
11 unsafe {
12 let expr = luaur_ast::rtti::ast_node_as::<AstExprCall>(node as *mut AstNode);
13 if expr.is_null() {
14 return luaur_ast::rtti::ast_node_as::<AstExprVarargs>(node as *mut AstNode)
15 .is_null()
16 == false;
17 }
18
19 if self.options.optimization_level <= 1 {
20 return true;
21 }
22
23 if self.is_constant(expr as *mut AstExpr) {
24 return false;
25 }
26
27 if self.options.optimization_level >= 2 {
28 if let Some(bfid) = self.builtins.find(&expr) {
29 if *bfid != LuauBuiltinFunction::LBF_NONE as i32 {
30 return get_builtin_info(*bfid).results != 1;
31 }
32 }
33 }
34
35 let func = self.get_function_expr((*expr).func);
36 let fi = if func.is_null() {
37 None
38 } else {
39 self.functions.find(&func)
40 };
41
42 if fi.map_or(false, |fi| fi.returns_one) {
43 return false;
44 }
45
46 true
47 }
48 }
49}