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 ir_block = IRBlock::new(&ir_function, c"entry");
|
||||||
let mut scope = scope.inner(ir_block);
|
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 {
|
impl Block {
|
||||||
fn codegen(&self, scope: &mut Scope) {
|
#[must_use]
|
||||||
|
fn codegen(&self, scope: &mut Scope) -> Option<(ReturnType, IRValue)> {
|
||||||
for statement in &self.0 {
|
for statement in &self.0 {
|
||||||
statement.codegen(scope);
|
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);
|
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;
|
scope.block = after;
|
||||||
|
|
||||||
let mut inner = scope.inner(then);
|
let mut inner = scope.inner(then);
|
||||||
block.codegen(&mut inner);
|
match block.codegen(&mut inner) {
|
||||||
inner.block.move_into(&mut scope.block);
|
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)
|
IRValue::from_literal(&crate::ast::Literal::I32(1), scope.block.function.module)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user