Skip to main content

luaur_analysis/methods/
cfg_builder_lower_control_flow_graph_alt_c.rs

1use crate::records::cfg_builder::CfgBuilder;
2use crate::records::declare::Declare;
3use crate::records::symbol::Symbol;
4use crate::type_aliases::def_id_control_flow_graph::DefId;
5use luaur_ast::records::ast_stat_local::AstStatLocal;
6
7impl CfgBuilder {
8    pub fn lower_ast_stat_local(&mut self, local: *mut AstStatLocal) {
9        unsafe {
10            let local_ref = &*local;
11            let vars_size = local_ref.vars.size;
12            let values_size = local_ref.values.size;
13
14            for i in 0..vars_size {
15                let loc = *local_ref.vars.data.add(i);
16                let expr = if i < values_size {
17                    *local_ref.values.data.add(i)
18                } else {
19                    core::ptr::null_mut()
20                };
21
22                if !expr.is_null() {
23                    self.lower_expr_ast_expr(expr);
24                }
25
26                // C++:
27                //   Symbol sym(loc);
28                //   DefId def = newDefinition(sym);
29                //   emit<Declare>(currentBlock, def, local);
30                //   currentBlock->setReachingDefinition(sym, def);
31                let sym = Symbol::from_local(loc);
32                let def: DefId = self.new_definition(sym.clone());
33                let current_block = self.current_block;
34                self.emit::<Declare, _>(current_block, (def, local));
35                (*current_block).set_reaching_definition(sym, def);
36            }
37        }
38    }
39}