(idx: u16, mut reader: BlockReader, cf: &ClassFragment)
| 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 | })), |
nothing calls this directly
no test coverage detected