Parse a jump table literal. jump-table-lit ::= "[" block(args) {"," block(args) } "]" | "[]"
(
&mut self,
ctx: &mut Context,
def: ir::BlockCall,
)
| 1803 | // jump-table-lit ::= "[" block(args) {"," block(args) } "]" |
| 1804 | // | "[]" |
| 1805 | fn parse_jump_table( |
| 1806 | &mut self, |
| 1807 | ctx: &mut Context, |
| 1808 | def: ir::BlockCall, |
| 1809 | ) -> ParseResult<ir::JumpTable> { |
| 1810 | self.match_token(Token::LBracket, "expected '[' before jump table contents")?; |
| 1811 | |
| 1812 | let mut data = Vec::new(); |
| 1813 | |
| 1814 | match self.token() { |
| 1815 | Some(Token::Block(dest)) => { |
| 1816 | self.consume(); |
| 1817 | let args = self.parse_opt_block_call_args()?; |
| 1818 | data.push(ctx.function.dfg.block_call(dest, &args)); |
| 1819 | |
| 1820 | loop { |
| 1821 | match self.token() { |
| 1822 | Some(Token::Comma) => { |
| 1823 | self.consume(); |
| 1824 | if let Some(Token::Block(dest)) = self.token() { |
| 1825 | self.consume(); |
| 1826 | let args = self.parse_opt_block_call_args()?; |
| 1827 | data.push(ctx.function.dfg.block_call(dest, &args)); |
| 1828 | } else { |
| 1829 | return err!(self.loc, "expected jump_table entry"); |
| 1830 | } |
| 1831 | } |
| 1832 | Some(Token::RBracket) => break, |
| 1833 | _ => return err!(self.loc, "expected ']' after jump table contents"), |
| 1834 | } |
| 1835 | } |
| 1836 | } |
| 1837 | Some(Token::RBracket) => (), |
| 1838 | _ => return err!(self.loc, "expected jump_table entry"), |
| 1839 | } |
| 1840 | |
| 1841 | self.consume(); |
| 1842 | |
| 1843 | Ok(ctx |
| 1844 | .function |
| 1845 | .dfg |
| 1846 | .jump_tables |
| 1847 | .push(JumpTableData::new(def, &data))) |
| 1848 | } |
| 1849 | |
| 1850 | // Parse an exception-table decl. |
| 1851 | // |
no test coverage detected