cfsp/parse/attribute/
method_parameters.rs

1use crate::node::access_flag::ParameterAccessFlag;
2#[allow(unused_imports)]
3use bitflags::Flags;
4use byteorder::{BigEndian, ReadBytesExt};
5use std::io::Read;
6
7use crate::node::attribute::{Attribute, MethodParameter, MethodParameters};
8use crate::parse::error::ParseResult;
9
10#[inline]
11pub(super) fn method_parameters<R: Read>(input: &mut R) -> ParseResult<Option<Attribute>> {
12    let parameters_count = input.read_u8()?;
13    let mut parameters = Vec::with_capacity(parameters_count as usize);
14
15    for _ in 0..parameters_count {
16        parameters.push(method_parameter(input)?);
17    }
18
19    Ok(Some(Attribute::MethodParameters(MethodParameters {
20        parameters_count,
21        parameters,
22    })))
23}
24
25#[inline(always)]
26fn method_parameter<R: Read>(input: &mut R) -> ParseResult<MethodParameter> {
27    let name_index = input.read_u16::<BigEndian>()?;
28    let access_flags = ParameterAccessFlag::from_bits_truncate(input.read_u16::<BigEndian>()?);
29
30    Ok(MethodParameter {
31        name_index,
32        access_flags,
33    })
34}