Skip to main content

jvm_assembler/formats/class/writer/
entities.rs

1use super::ClassWriter;
2use crate::program::*;
3use gaia_types::Result;
4use std::io::Write;
5
6impl<W: Write> ClassWriter<W> {
7    /// 写入字段
8    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            // 计算属性数量
19            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            // 写入 ConstantValue 属性
26            if let Some(val) = &field.constant_value {
27                self.write_attribute(&JvmAttribute::ConstantValue { value: val.clone() })?;
28            }
29
30            // 写入其他属性
31            for attr in &field.attributes {
32                self.write_attribute(attr)?;
33            }
34        }
35
36        Ok(())
37    }
38
39    /// 写入方法
40    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            // 计算属性数量
53            let mut attribute_count = 1; // 总是包含 Code 属性
54            if !method.exceptions.is_empty() {
55                attribute_count += 1;
56            }
57            attribute_count += method.attributes.len() as u16;
58
59            // 写入属性数量
60            self.writer.write_u16(attribute_count)?;
61
62            // 1. 写入 Code 属性
63            self.write_code_attribute(program, method, code_utf8_idx)?;
64
65            // 2. 写入 Exceptions 属性
66            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            // 3. 写入其他属性
78            for attr in &method.attributes {
79                self.write_attribute(attr)?;
80            }
81        }
82
83        Ok(())
84    }
85}