custom MIR: add support for tail calls
This commit is contained in:
parent
83e9b93c90
commit
212417b87f
5 changed files with 54 additions and 0 deletions
|
@ -75,6 +75,9 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
@call(mir_call, args) => {
|
||||
self.parse_call(args)
|
||||
},
|
||||
@call(mir_tail_call, args) => {
|
||||
self.parse_tail_call(args)
|
||||
},
|
||||
ExprKind::Match { scrutinee, arms, .. } => {
|
||||
let discr = self.parse_operand(*scrutinee)?;
|
||||
self.parse_match(arms, expr.span).map(|t| TerminatorKind::SwitchInt { discr, targets: t })
|
||||
|
@ -187,6 +190,25 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
)
|
||||
}
|
||||
|
||||
fn parse_tail_call(&self, args: &[ExprId]) -> PResult<TerminatorKind<'tcx>> {
|
||||
parse_by_kind!(self, args[0], _, "tail call",
|
||||
ExprKind::Call { fun, args, fn_span, .. } => {
|
||||
let fun = self.parse_operand(*fun)?;
|
||||
let args = args
|
||||
.iter()
|
||||
.map(|arg|
|
||||
Ok(Spanned { node: self.parse_operand(*arg)?, span: self.thir.exprs[*arg].span } )
|
||||
)
|
||||
.collect::<PResult<Box<[_]>>>()?;
|
||||
Ok(TerminatorKind::TailCall {
|
||||
func: fun,
|
||||
args,
|
||||
fn_span: *fn_span,
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn parse_rvalue(&self, expr_id: ExprId) -> PResult<Rvalue<'tcx>> {
|
||||
parse_by_kind!(self, expr_id, expr, "rvalue",
|
||||
@call(mir_discriminant, args) => self.parse_place(args[0]).map(Rvalue::Discriminant),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue