mirror of
https://github.com/Noratrieb/coldsquare.git
synced 2026-01-16 09:25:08 +01:00
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:
parent
a1620476d8
commit
125b880f7d
4 changed files with 128 additions and 73 deletions
|
|
@ -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),
|
||||
)?;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue