normalising BlockTrailingExpr where it returns into Block with a Ret expr
This commit is contained in:
parent
e002a6ddc9
commit
f6b956deee
|
@ -2591,6 +2591,35 @@ pub mod ast_gen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// folds more AST-patterns into structures that are easier to build the IR with
|
||||||
|
pub fn fold_more_patterns(&mut self) {
|
||||||
|
use visitor::AstExt;
|
||||||
|
self.ast.visitor_mut().visit_post(|ast, _, i, tag, data| {
|
||||||
|
match tag {
|
||||||
|
// normalise functions with block-with-trailing-expr into block
|
||||||
|
Tag::FunctionDecl => {
|
||||||
|
let (_, block) = data.as_two_indices();
|
||||||
|
|
||||||
|
let (block_tag, block_data) =
|
||||||
|
ast.get_node_tag_and_data(block);
|
||||||
|
if block_tag == Tag::BlockTrailingExpr {
|
||||||
|
let (_, end) = block_data.as_extra_range();
|
||||||
|
let end = end - 1;
|
||||||
|
let expr = Index::new(ast.extra[end]);
|
||||||
|
let loc = ast.get_loc(expr);
|
||||||
|
let ret = ast.push_ret(Some(expr), loc);
|
||||||
|
// modify last element in place to be a return instruction
|
||||||
|
ast.extra[end] = *ret.as_u32();
|
||||||
|
ast.tags[block.index()] = Tag::Block;
|
||||||
|
eprintln!("folding ({block}): {block_tag:?} into Tag::Block");
|
||||||
|
eprintln!("expr: {expr:?}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pub fn intern_types(&mut self) {
|
pub fn intern_types(&mut self) {
|
||||||
self.ast.visitor_mut().visit_post(|ast, _, i, tag, data| {
|
self.ast.visitor_mut().visit_post(|ast, _, i, tag, data| {
|
||||||
match tag {
|
match tag {
|
||||||
|
@ -4397,6 +4426,7 @@ pub mod ast_gen {
|
||||||
self.create_comptime_folding_graph(intern::AMD64_POINTER_BITS);
|
self.create_comptime_folding_graph(intern::AMD64_POINTER_BITS);
|
||||||
eprintln!("interning types:");
|
eprintln!("interning types:");
|
||||||
self.intern_types();
|
self.intern_types();
|
||||||
|
self.fold_more_patterns();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_scope(&mut self, ast: Index, name: intern::Index) {
|
fn push_scope(&mut self, ast: Index, name: intern::Index) {
|
||||||
|
|
Loading…
Reference in a new issue