modify how block is codegenerated
This commit is contained in:
parent
e21f47e34b
commit
7f3a3ac1f8
@ -45,19 +45,26 @@ impl FunctionDefinition {
|
||||
|
||||
let ir_block = IRBlock::new(&ir_function, c"entry");
|
||||
let mut scope = scope.inner(ir_block);
|
||||
block.codegen(&mut scope);
|
||||
if let Some((_, val)) = block.codegen(&mut scope) {
|
||||
scope.block.add_return(Some(val));
|
||||
} else {
|
||||
scope.block.add_return(None);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Block {
|
||||
fn codegen(&self, scope: &mut Scope) {
|
||||
#[must_use]
|
||||
fn codegen(&self, scope: &mut Scope) -> Option<(ReturnType, IRValue)> {
|
||||
for statement in &self.0 {
|
||||
statement.codegen(scope);
|
||||
}
|
||||
|
||||
if let Some((_, return_exp)) = &self.1 {
|
||||
if let Some((ret_type, return_exp)) = &self.1 {
|
||||
let value = return_exp.codegen(scope);
|
||||
scope.block.add_return(Some(value));
|
||||
Some((*ret_type, value))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -109,8 +116,10 @@ impl Expression {
|
||||
scope.block = after;
|
||||
|
||||
let mut inner = scope.inner(then);
|
||||
block.codegen(&mut inner);
|
||||
inner.block.move_into(&mut scope.block);
|
||||
match block.codegen(&mut inner) {
|
||||
Some((ReturnType::Hard, v)) => inner.block.add_return(Some(v)),
|
||||
_ => inner.block.move_into(&mut scope.block),
|
||||
}
|
||||
|
||||
IRValue::from_literal(&crate::ast::Literal::I32(1), scope.block.function.module)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user