1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
use crate::*; pub fn parse_directive_data( state: &mut asm::parser::State, elem_size: Option<usize>, tk_hash: &syntax::Token) -> Result<(), ()> { let mut is_first = true; loop { let expr = expr::Expr::parse(&mut state.parser)?; let span = if is_first { expr.span().join(&tk_hash.span) } else { expr.span() }; let mut invokation = asm::Invokation { ctx: state.asm_state.get_ctx(&state), size_guess: 0, span, kind: asm::InvokationKind::Data(asm::DataInvokation { expr, elem_size, }) }; let resolved = state.asm_state.resolve_data_invokation( state.report.clone(), &invokation, state.fileserver, false); match elem_size { Some(elem_size) => invokation.size_guess = elem_size, None => { invokation.size_guess = match resolved { Ok(expr::Value::Integer(bigint)) => { match bigint.size { Some(size) => size, None => 0, } } _ => 0 }; } } let bankdata = state.asm_state.get_bankdata(state.asm_state.cur_bank); bankdata.check_writable(&state.asm_state, state.report.clone(), &invokation.span)?; let bankdata = state.asm_state.get_bankdata_mut(state.asm_state.cur_bank); bankdata.push_invokation(invokation); if state.parser.maybe_expect(syntax::TokenKind::Comma).is_none() { break; } if state.parser.next_is_linebreak() { break; } is_first = false; } Ok(()) }