classfile-parser 0.3.2

A parser for Java Class files written in rust
Documentation
extern crate nom;
extern crate classfile_parser;

use classfile_parser::class_parser;


#[test]
fn test_attribute_stack_map_table() {
    let stack_map_class = include_bytes!("../java-assets/compiled-classes/Factorial.class");
    let res = class_parser(stack_map_class);
    match res {
        Result::Ok((_, c)) => {
            use classfile_parser::attribute_info::code_attribute_parser;
            use classfile_parser::attribute_info::stack_map_table_attribute_parser;

            assert_eq!(c.methods.len(), 2);
            assert_eq!(c.methods.len(), c.methods_count as usize);

            let method = &c.methods[1];
            assert_eq!(method.attributes.len(), 1);
            assert_eq!(method.attributes.len(), method.attributes_count as usize);

            let code = match code_attribute_parser(&method.attributes[0].info) {
                Result::Ok((_, c)) => c,
                _ => panic!("Could not get code attribute"),
            };
            assert_eq!(code.attributes_count, 1);

            let p = stack_map_table_attribute_parser(&code.attributes[0].info);
            match p {
                Result::Ok((_, a)) => {
                    assert_eq!(a.entries.len(), a.number_of_entries as usize);
                    assert_eq!(a.entries.len(), 2);

                    use classfile_parser::attribute_info::StackMapFrame::*;
                    match a.entries[0] {
                        SameFrame { .. } => {},
                        _ => panic!("unexpected frame type for frame 0"),
                    };
                    match a.entries[1] {
                        SameLocals1StackItemFrame { .. } => {},
                        _ => panic!("unexpected frame type for frame 1: {:?}", &a.entries[1]),
                    };
                },
                _ => panic!("failed to parse StackMapTable"),
            };

        },
        _ => panic!("not a class file"),
    };
}