Partially fixed constant pool lookups and validation

The code compiles, but the tests still don't work
The problem is that it tries to validate the constant pool while parsing the constant pool. This validation needs to be delayed.
This commit is contained in:
nora 2021-08-26 16:18:06 +02:00
parent a1620476d8
commit 125b880f7d
4 changed files with 128 additions and 73 deletions

View file

@ -1,8 +1,8 @@
use file_parser::{ClassFile, ParseErr};
use std::error::Error;
use file_parser::ClassFile;
use std::io;
use std::io::Write;
pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dyn Error>> {
pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), io::Error> {
let cp = &class.constant_pool;
writeln!(
@ -17,24 +17,21 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
w,
"class {} extends {}{} {{",
&class.this_class.get(cp).name_index.get(cp),
match class.super_class.get(cp) {
match class.super_class.maybe_get(cp) {
None => "<none>",
Some(class) => &class.name_index.get(cp),
}
Some(class) => class.name_index.get(cp),
},
if class.interfaces.is_empty() {
"".to_string()
} else {
format!(
" implements {}",
// this is absolutely terrible but it works i guess
class
.interfaces
.iter()
.map(|i| i.get(cp))
.collect::<Result<Vec<_>, ParseErr>>()?
.iter()
.map(|i| i.name_index.get(cp))
.collect::<Result<Vec<_>, ParseErr>>()?
.collect::<Vec<_>>()
.join(",")
)
},
@ -42,7 +39,7 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
writeln!(w, " Attributes:")?;
for attr in &class.attributes {
writeln!(w, " {}", &attr.attribute_name_index.get(cp)?)?;
writeln!(w, " {}", &attr.attribute_name_index.get(cp))?;
}
writeln!(w)?;
@ -51,8 +48,8 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
writeln!(
w,
" {} {}",
&field.descriptor_index.get(cp)?,
&field.name_index.get(cp)?
&field.descriptor_index.get(cp),
&field.name_index.get(cp)
)?;
}
writeln!(w)?;
@ -62,8 +59,8 @@ pub fn display_class<W: Write>(mut w: W, class: &ClassFile) -> Result<(), Box<dy
writeln!(
w,
" {} {}",
&method.descriptor_index.get(cp)?,
&method.name_index.get(cp)?,
&method.descriptor_index.get(cp),
&method.name_index.get(cp),
)?;
}