cfsp 1.0.1

A JVM Bytecode Manipulation Framework inspired by ASM.
Documentation
use byteorder::{BigEndian, ReadBytesExt};
use std::io::Read;

use crate::node::attribute::{Attribute, LocalVariable, LocalVariableTable};
use crate::parse::error::ParseResult;

#[inline]
pub(super) fn local_variable_table<R: Read>(input: &mut R) -> ParseResult<Option<Attribute>> {
    let local_variable_table_length = input.read_u16::<BigEndian>()?;
    let mut local_variable_table = Vec::with_capacity(local_variable_table_length as usize);

    for _ in 0..local_variable_table_length {
        local_variable_table.push(local_variable(input)?);
    }

    Ok(Some(Attribute::LocalVariableTable(LocalVariableTable {
        local_variable_table_length,
        local_variable_table,
    })))
}

#[inline(always)]
fn local_variable<R: Read>(input: &mut R) -> ParseResult<LocalVariable> {
    let start_pc = input.read_u16::<BigEndian>()?;
    let length = input.read_u16::<BigEndian>()?;
    let name_index = input.read_u16::<BigEndian>()?;
    let descriptor_index = input.read_u16::<BigEndian>()?;
    let index = input.read_u16::<BigEndian>()?;

    Ok(LocalVariable {
        start_pc,
        length,
        name_index,
        descriptor_index,
        index,
    })
}