MCPcopy Create free account
hub / github.com/cretz/stackparam / parse_attribute

Method parse_attribute

src/bytecode/io/reader.rs:585–737  ·  view source on GitHub ↗
(idx: u16, mut reader: BlockReader, cf: &ClassFragment)

Source from the content-addressed store, hash-verified

583 }
584
585 fn parse_attribute(idx: u16, mut reader: BlockReader, cf: &ClassFragment) -> Attribute {
586 match cf.constant_pool {
587 Some(ref cp) => match cp.get_utf8_string(idx) {
588 Some(ref s) => match s.as_str() {
589 "ConstantValue" => Some(Attribute::ConstantValue(ConstantPoolIndex::new(reader.get_u16() as usize))),
590 "Code" => Some(Attribute::Code {
591 max_stack: reader.get_u16(),
592 max_locals: reader.get_u16(),
593 code: {
594 let n = reader.get_u32() as usize;
595 ClassReader::parse_code(n, &mut BlockReader::new(&mut Cursor::new(reader.get_n(n as usize))))
596 },
597 exception_table: {
598 let n = reader.get_u16();
599 (0..n).map(|_| ExceptionHandler { start_pc: reader.get_u16(), end_pc: reader.get_u16(), handler_pc: reader.get_u16(), catch_type: ConstantPoolIndex::new(reader.get_u16() as usize) }).collect()
600 },
601 attributes: ClassReader::read_attributes(&mut reader, cf).unwrap_or(vec![])
602 }),
603 "StackMapTable" => Some(Attribute::StackMapTable({
604 let n = reader.get_u16();
605 (0..n).map(|_| {
606 let frame_type = reader.get_u8();
607
608 let read_verification_type = |r: &mut BlockReader| match r.get_u8() {
609 0 => VerificationType::Top,
610 1 => VerificationType::Integer,
611 2 => VerificationType::Float,
612 3 => VerificationType::Double,
613 4 => VerificationType::Long,
614 5 => VerificationType::Null,
615 6 => VerificationType::UninitializedThis,
616 7 => VerificationType::Object { cpool_index: ConstantPoolIndex::new(r.get_u16() as usize ) },
617 8 => VerificationType::Uninitialized { offset: r.get_u16() },
618 _ => VerificationType::Top
619 };
620
621 match frame_type {
622 tag@0...63 => StackMapFrame::SameFrame { tag: tag },
623 tag@64...127 => StackMapFrame::SameLocals1StackItemFrame { tag: tag, stack: read_verification_type(&mut reader) },
624 247 => StackMapFrame::SameLocals1StackItemFrameExtended { offset_delta: reader.get_u16(), stack: read_verification_type(&mut reader) },
625 tag@248...250 => StackMapFrame::ChopFrame { tag: tag, offset_delta: reader.get_u16() },
626 251 => StackMapFrame::SameFrameExtended { offset_delta: reader.get_u16() },
627 tag@252...254 => StackMapFrame::AppendFrame { tag: tag, offset_delta: reader.get_u16(), locals: (0..tag - 251).map(|_| read_verification_type(&mut reader)).collect() },
628 255 => StackMapFrame::FullFrame { offset_delta: reader.get_u16(), locals: {
629 let n = reader.get_u16();
630 (0..n).map(|_| read_verification_type(&mut reader)).collect()
631 }, stack: {
632 let n = reader.get_u16();
633 (0..n).map(|_| read_verification_type(&mut reader)).collect()
634 }},
635 tag@_ => StackMapFrame::FutureUse { tag: tag },
636 }
637 }).collect()
638 })),
639 "Exceptions" => Some(Attribute::Exceptions({
640 let n = reader.get_u16();
641 (0..n).map(|_| ConstantPoolIndex::new(reader.get_u16() as usize)).collect()
642 })),

Callers

nothing calls this directly

Calls 9

LineNumberTableClass · 0.85
LocalVariableTableClass · 0.85
get_utf8_stringMethod · 0.80
get_u16Method · 0.80
get_u32Method · 0.80
get_nMethod · 0.80
get_u8Method · 0.80
get_bytesMethod · 0.80

Tested by

no test coverage detected