Skip to main content

luaur_compiler/methods/
compiler_compile_expr_side.rs

1use crate::records::compiler::Compiler;
2use crate::records::reg_scope::RegScope;
3use luaur_ast::records::ast_expr::AstExpr;
4use luaur_ast::records::ast_expr_call::AstExprCall;
5use luaur_ast::records::ast_expr_function::AstExprFunction;
6use luaur_ast::records::ast_expr_global::AstExprGlobal;
7use luaur_ast::records::ast_expr_local::AstExprLocal;
8use luaur_ast::records::ast_expr_varargs::AstExprVarargs;
9use luaur_ast::rtti;
10
11impl Compiler {
12    pub fn compile_expr_side(&mut self, node: *mut AstExpr) {
13        unsafe {
14            let ast_node = &*(node as *mut luaur_ast::records::ast_node::AstNode);
15            if rtti::ast_node_is::<AstExprLocal>(ast_node)
16                || rtti::ast_node_is::<AstExprGlobal>(ast_node)
17                || rtti::ast_node_is::<AstExprVarargs>(ast_node)
18                || rtti::ast_node_is::<AstExprFunction>(ast_node)
19                || self.is_constant(node)
20            {
21                return;
22            }
23
24            if rtti::ast_node_as::<AstExprCall>(node as *mut luaur_ast::records::ast_node::AstNode)
25                .is_null()
26            {
27                (*self.bytecode)
28                    .add_debug_remark(format_args!("expression only compiled for side effects"));
29            }
30
31            let mut rsi = self.reg_scope_compiler();
32            self.compile_expr_auto(node, &mut rsi);
33        }
34    }
35}