| 42 | } |
| 43 | |
| 44 | fn write_constant(&mut self, constant: &Constant) -> Result<usize, Error> { |
| 45 | match constant { |
| 46 | &Constant::Utf8(ref bytes) => self.write_u8(1).and(self.write_u16(bytes.len() as u16)).and(self.write_n(bytes)), |
| 47 | &Constant::Integer(ref value) => self.write_u8(3).and(self.write_u32(*value)), |
| 48 | &Constant::Float(ref value) => self.write_u8(4).and(self.write_u32(*value)), |
| 49 | &Constant::Long(ref value) => self.write_u8(5).and(self.write_u64(*value)), |
| 50 | &Constant::Double(ref value) => self.write_u8(6).and(self.write_u64(*value)), |
| 51 | &Constant::Class(ref idx) => self.write_u8(7).and(self.write_u16(idx.idx as u16)), |
| 52 | &Constant::String(ref idx) => self.write_u8(8).and(self.write_u16(idx.idx as u16)), |
| 53 | &Constant::MethodType(ref idx) => self.write_u8(16).and(self.write_u16(idx.idx as u16)), |
| 54 | &Constant::FieldRef { class_index: ref c_idx, name_and_type_index: ref n_idx } => self.write_u8(9).and(self.write_u16(c_idx.idx as u16)).and(self.write_u16(n_idx.idx as u16)), |
| 55 | &Constant::MethodRef { class_index: ref c_idx, name_and_type_index: ref n_idx } => self.write_u8(10).and(self.write_u16(c_idx.idx as u16)).and(self.write_u16(n_idx.idx as u16)), |
| 56 | &Constant::InterfaceMethodRef { class_index: ref c_idx, name_and_type_index: ref n_idx } => self.write_u8(11).and(self.write_u16(c_idx.idx as u16)).and(self.write_u16(n_idx.idx as u16)), |
| 57 | &Constant::NameAndType { name_index: ref n_idx, descriptor_index: ref d_idx } => self.write_u8(12).and(self.write_u16(n_idx.idx as u16)).and(self.write_u16(d_idx.idx as u16)), |
| 58 | &Constant::MethodHandle { reference_kind: ref kind, reference_index: ref r_idx } => self.write_u8(15).and(self.write_u8(kind.to_u8())).and(self.write_u16(r_idx.idx as u16)), |
| 59 | &Constant::InvokeDynamic { bootstrap_method_attr_index: ref m_idx, name_and_type_index: ref n_idx } => self.write_u8(18).and(self.write_u16(m_idx.idx as u16)).and(self.write_u16(n_idx.idx as u16)), |
| 60 | &Constant::Placeholder => Ok(0), |
| 61 | _ => Err(Error::new(ErrorKind::InvalidData, "Unknown constant detected")) |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | fn write_access_flags(&mut self, flags: &AccessFlags) -> Result<usize, Error> { |
| 66 | self.write_u16(flags.flags) |