jvm_assembler/formats/class/writer/
entities.rs1use super::ClassWriter;
2use crate::program::*;
3use gaia_types::Result;
4use std::io::Write;
5
6impl<W: Write> ClassWriter<W> {
7 pub fn write_fields(&mut self, program: &JvmProgram) -> Result<()> {
9 self.writer.write_u16(program.fields.len() as u16)?;
10
11 for field in &program.fields {
12 self.writer.write_u16(field.access_flags.to_flags())?;
13 let name_idx = self.add_utf8(field.name.clone());
14 let desc_idx = self.add_utf8(field.descriptor.clone());
15 self.writer.write_u16(name_idx)?;
16 self.writer.write_u16(desc_idx)?;
17
18 let mut attr_count = field.attributes.len() as u16;
20 if field.constant_value.is_some() {
21 attr_count += 1;
22 }
23 self.writer.write_u16(attr_count)?;
24
25 if let Some(val) = &field.constant_value {
27 self.write_attribute(&JvmAttribute::ConstantValue { value: val.clone() })?;
28 }
29
30 for attr in &field.attributes {
32 self.write_attribute(attr)?;
33 }
34 }
35
36 Ok(())
37 }
38
39 pub fn write_methods(&mut self, program: &JvmProgram, code_utf8_idx: u16) -> Result<()> {
41 self.writer.write_u16(program.methods.len() as u16)?;
42
43 let exceptions_utf8_idx = self.add_utf8("Exceptions".to_string());
44
45 for method in &program.methods {
46 self.writer.write_u16(method.access_flags.to_flags())?;
47 let name_idx = self.add_utf8(method.name.clone());
48 let desc_idx = self.add_utf8(method.descriptor.clone());
49 self.writer.write_u16(name_idx)?;
50 self.writer.write_u16(desc_idx)?;
51
52 let mut attribute_count = 1; if !method.exceptions.is_empty() {
55 attribute_count += 1;
56 }
57 attribute_count += method.attributes.len() as u16;
58
59 self.writer.write_u16(attribute_count)?;
61
62 self.write_code_attribute(program, method, code_utf8_idx)?;
64
65 if !method.exceptions.is_empty() {
67 self.writer.write_u16(exceptions_utf8_idx)?;
68 let attr_len = 2 + method.exceptions.len() * 2;
69 self.writer.write_u32(attr_len as u32)?;
70 self.writer.write_u16(method.exceptions.len() as u16)?;
71 for exc in &method.exceptions {
72 let exc_idx = self.add_class(exc.clone());
73 self.writer.write_u16(exc_idx)?;
74 }
75 }
76
77 for attr in &method.attributes {
79 self.write_attribute(attr)?;
80 }
81 }
82
83 Ok(())
84 }
85}