Skip to main content

luaur_analysis/methods/
cfg_builder_lower_control_flow_graph_alt_d.rs

1use crate::records::assign::Assign;
2use crate::records::cfg_builder::CfgBuilder;
3use luaur_ast::records::ast_stat_assign::AstStatAssign;
4use luaur_common::macros::luau_assert::LUAU_ASSERT;
5
6impl CfgBuilder {
7    pub fn lower_ast_stat_assign(&mut self, assn: *mut AstStatAssign) {
8        unsafe {
9            for i in 0..(*assn).values.size {
10                let expr = *(*assn).values.data.add(i as usize);
11                self.lower_expr_ast_expr(expr);
12            }
13
14            for i in 0..(*assn).vars.size {
15                let target = *(*assn).vars.data.add(i as usize);
16
17                // C++:
18                //   if (auto sym = extractLValueSymbol(target)) {
19                //       DefId def = newDefinition(*sym);
20                //       emit<Assign>(currentBlock, def, assn);
21                //       currentBlock->setReachingDefinition(*sym, def);
22                //   } else LUAU_ASSERT(!"Unhandled lvalue type");
23                if let Some(sym) =
24                    crate::functions::extract_l_value_symbol::extract_l_value_symbol(&*target)
25                {
26                    let def = self.new_definition(sym.clone());
27                    let current_block = self.current_block;
28                    self.emit::<Assign, _>(current_block, (def, assn));
29                    (*current_block).set_reaching_definition(sym, def);
30                } else {
31                    LUAU_ASSERT!(false);
32                }
33            }
34        }
35    }
36}