| 90 | } |
| 91 | |
| 92 | fn read_constant(reader: &mut BlockReader) -> Result<Constant, Error> { |
| 93 | let tag = reader.read_u8(); |
| 94 | |
| 95 | match tag { |
| 96 | Ok(1) => match reader.read_u16() { |
| 97 | Ok(str_len) => match reader.read_n(str_len as usize) { |
| 98 | Ok(bytes) => { |
| 99 | Ok(Constant::Utf8(bytes)) |
| 100 | }, |
| 101 | Err(err) => Err(err) |
| 102 | }, |
| 103 | Err(err) => Err(err) |
| 104 | }, |
| 105 | Ok(3) => reader.read_u32().map(|value| Constant::Integer(value)), |
| 106 | Ok(4) => reader.read_u32().map(|value| Constant::Float(value)), |
| 107 | Ok(5) => reader.read_u64().map(|value| Constant::Long(value)), |
| 108 | Ok(6) => reader.read_u64().map(|value| Constant::Double(value)), |
| 109 | Ok(7) => reader.read_u16().map(|idx| Constant::Class(ConstantPoolIndex::new(idx as usize))), |
| 110 | Ok(8) => reader.read_u16().map(|idx| Constant::String(ConstantPoolIndex::new(idx as usize))), |
| 111 | Ok(9) => ClassReader::require_n(reader, 4, |mut r| Constant::FieldRef { |
| 112 | class_index: ConstantPoolIndex::new(r.get_u16() as usize), |
| 113 | name_and_type_index: ConstantPoolIndex::new(r.get_u16() as usize) |
| 114 | }), |
| 115 | Ok(10) => ClassReader::require_n(reader, 4, |mut r| Constant::MethodRef { |
| 116 | class_index: ConstantPoolIndex::new(r.get_u16() as usize), |
| 117 | name_and_type_index: ConstantPoolIndex::new(r.get_u16() as usize) |
| 118 | }), |
| 119 | Ok(11) => ClassReader::require_n(reader, 4, |mut r| Constant::InterfaceMethodRef { |
| 120 | class_index: ConstantPoolIndex::new(r.get_u16() as usize), |
| 121 | name_and_type_index: ConstantPoolIndex::new(r.get_u16() as usize) |
| 122 | }), |
| 123 | Ok(12) => ClassReader::require_n(reader, 4, |mut r| Constant::NameAndType { |
| 124 | name_index: ConstantPoolIndex::new(r.get_u16() as usize), |
| 125 | descriptor_index: ConstantPoolIndex::new(r.get_u16() as usize) |
| 126 | }), |
| 127 | Ok(15) => ClassReader::require_n(reader, 3, |mut r| Constant::MethodHandle { |
| 128 | reference_kind: ReferenceKind::from_u8(r.get_u8()), |
| 129 | reference_index: ConstantPoolIndex::new(r.get_u16() as usize) |
| 130 | }), |
| 131 | Ok(16) => reader.read_u16().map(|idx| Constant::MethodType(ConstantPoolIndex::new(idx as usize))), |
| 132 | Ok(18) => ClassReader::require_n(reader, 4, |mut r| Constant::InvokeDynamic { |
| 133 | bootstrap_method_attr_index: ConstantPoolIndex::new(r.get_u16() as usize), |
| 134 | name_and_type_index: ConstantPoolIndex::new(r.get_u16() as usize) |
| 135 | }), |
| 136 | Ok(tag) => Ok(Constant::Unknown(tag)), |
| 137 | Err(err) => Err(err) |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | fn read_access_flags(reader: &mut BlockReader, _: &ClassFragment) -> Result<ClassFragment, Error> { |
| 142 | match reader.read_u16() { |