mirror of
https://github.com/Noratrieb/coldsquare.git
synced 2026-01-14 16:35:10 +01:00
make this more debuggable
This commit is contained in:
parent
b07a20566c
commit
ef797d6fa2
3 changed files with 72 additions and 32 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -3,4 +3,5 @@
|
||||||
|
|
||||||
/target
|
/target
|
||||||
|
|
||||||
*.class
|
*.class
|
||||||
|
*.java
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use coldsquare::parse_class_file;
|
use coldsquare::parse_class_file;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let file = "primeNumberChecker.class";
|
let file = "Test.class";
|
||||||
let file = std::fs::read(file).unwrap();
|
let file = std::fs::read(file).unwrap();
|
||||||
|
|
||||||
let class_file = parse_class_file(file).unwrap();
|
let class_file = parse_class_file(file).unwrap();
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ pub use model::*;
|
||||||
use std::path::Prefix::Verbatim;
|
use std::path::Prefix::Verbatim;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ParseErr;
|
pub struct ParseErr(String);
|
||||||
|
|
||||||
pub type Result<T> = std::result::Result<T, ParseErr>;
|
pub type Result<T> = std::result::Result<T, ParseErr>;
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@ impl Data {
|
||||||
fn u1(&mut self) -> Result<u1> {
|
fn u1(&mut self) -> Result<u1> {
|
||||||
let item = self.data.get(self.pointer).cloned();
|
let item = self.data.get(self.pointer).cloned();
|
||||||
self.pointer += 1;
|
self.pointer += 1;
|
||||||
item.ok_or(ParseErr)
|
item.ok_or(ParseErr("No u1 left".to_string()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn u2(&mut self) -> Result<u2> {
|
fn u2(&mut self) -> Result<u2> {
|
||||||
|
|
@ -39,17 +39,32 @@ impl Data {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn last_u1(&self) -> Result<u1> {
|
fn last_u1(&self) -> Result<u1> {
|
||||||
self.data.get(self.pointer - 1).cloned().ok_or(ParseErr)
|
self.data
|
||||||
|
.get(self.pointer - 1)
|
||||||
|
.cloned()
|
||||||
|
.ok_or(ParseErr("Last u1 not found".to_string()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn last_u2(&self) -> Result<u2> {
|
fn last_u2(&self) -> Result<u2> {
|
||||||
let last2u1 = self.data.get(self.pointer - 2).cloned().ok_or(ParseErr)?;
|
let last2u1 = self
|
||||||
|
.data
|
||||||
|
.get(self.pointer - 2)
|
||||||
|
.cloned()
|
||||||
|
.ok_or(ParseErr("Last u2 not found".to_string()))?;
|
||||||
Ok(((last2u1 as u2) << 8) | self.last_u1()? as u2)
|
Ok(((last2u1 as u2) << 8) | self.last_u1()? as u2)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn last_u4(&self) -> Result<u4> {
|
fn last_u4(&self) -> Result<u4> {
|
||||||
let last2u1 = self.data.get(self.pointer - 3).cloned().ok_or(ParseErr)?;
|
let last2u1 = self
|
||||||
let last3u1 = self.data.get(self.pointer - 4).cloned().ok_or(ParseErr)?;
|
.data
|
||||||
|
.get(self.pointer - 3)
|
||||||
|
.cloned()
|
||||||
|
.ok_or(ParseErr("Last 2 u1 in last u4 not found".to_string()))?;
|
||||||
|
let last3u1 = self
|
||||||
|
.data
|
||||||
|
.get(self.pointer - 4)
|
||||||
|
.cloned()
|
||||||
|
.ok_or(ParseErr("Last 3 u1 in last u4 not found".to_string()))?;
|
||||||
Ok(((last3u1 as u4) << 24) | ((last2u1 as u4) << 16) | self.last_u2()? as u4)
|
Ok(((last3u1 as u4) << 24) | ((last2u1 as u4) << 16) | self.last_u2()? as u4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -95,23 +110,41 @@ parse_primitive!(u4);
|
||||||
|
|
||||||
impl Parse for ClassFile {
|
impl Parse for ClassFile {
|
||||||
fn parse(data: &mut Data) -> Result<Self> {
|
fn parse(data: &mut Data) -> Result<Self> {
|
||||||
|
let magic = data.u4()?;
|
||||||
|
assert_eq!(magic, 0xCAFEBABE);
|
||||||
|
let minor_version = data.u2()?;
|
||||||
|
let major_version = data.u2()?;
|
||||||
|
let constant_pool_count = data.u2()?;
|
||||||
|
let constant_pool = Vec::parse_vec(data, constant_pool_count as usize)?;
|
||||||
|
let access_flags = data.u2()?;
|
||||||
|
let this_class = data.u2()?;
|
||||||
|
let super_class = data.u2()?;
|
||||||
|
let interfaces_count = data.u2()?;
|
||||||
|
let interfaces = Vec::parse_vec(data, interfaces_count as usize)?;
|
||||||
|
let fields_count = data.u2()?;
|
||||||
|
let fields = Vec::parse_vec(data, fields_count as usize)?;
|
||||||
|
let method_count = data.u2()?;
|
||||||
|
let methods = Vec::parse_vec(data, method_count as usize)?;
|
||||||
|
let attributes_count = data.u2()?;
|
||||||
|
let attributes = Vec::parse_vec(data, attributes_count as usize)?;
|
||||||
|
println!("los");
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
magic: data.u4()?,
|
magic,
|
||||||
minor_version: data.u2()?,
|
minor_version,
|
||||||
major_version: data.u2()?,
|
major_version,
|
||||||
constant_pool_count: data.u2()?,
|
constant_pool_count,
|
||||||
constant_pool: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
constant_pool,
|
||||||
access_flags: data.u2()?,
|
access_flags,
|
||||||
this_class: data.u2()?,
|
this_class,
|
||||||
super_class: data.u2()?,
|
super_class,
|
||||||
interfaces_count: data.u2()?,
|
interfaces_count,
|
||||||
interfaces: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
interfaces,
|
||||||
fields_count: data.u2()?,
|
fields_count,
|
||||||
fields: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
fields,
|
||||||
method_count: data.u2()?,
|
method_count,
|
||||||
methods: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
methods,
|
||||||
attributes_count: data.u2()?,
|
attributes_count,
|
||||||
attributes: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
attributes,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -186,7 +219,7 @@ impl Parse for CpInfo {
|
||||||
bootstrap_method_attr_index: data.u2()?,
|
bootstrap_method_attr_index: data.u2()?,
|
||||||
name_and_type_index: data.u2()?,
|
name_and_type_index: data.u2()?,
|
||||||
},
|
},
|
||||||
_ => Err(ParseErr)?,
|
_ => Err(ParseErr(format!("Invalid CPInfo tag: {}", tag)))?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -272,16 +305,16 @@ impl Parse for StackMapFrame {
|
||||||
number_of_stack_items: data.u2()?,
|
number_of_stack_items: data.u2()?,
|
||||||
stack: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
stack: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
||||||
},
|
},
|
||||||
_ => Err(ParseErr)?,
|
_ => Err(ParseErr(format!(
|
||||||
|
"Invalid StackMapFrame type: {}",
|
||||||
|
frame_type
|
||||||
|
)))?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Parse for VerificationTypeInfo {
|
impl Parse for VerificationTypeInfo {
|
||||||
fn parse(data: &mut Data) -> Result<Self>
|
fn parse(data: &mut Data) -> Result<Self> {
|
||||||
where
|
|
||||||
Self: Sized,
|
|
||||||
{
|
|
||||||
let tag = data.u1()?;
|
let tag = data.u1()?;
|
||||||
Ok(match tag {
|
Ok(match tag {
|
||||||
0 => Self::Top { tag },
|
0 => Self::Top { tag },
|
||||||
|
|
@ -299,7 +332,10 @@ impl Parse for VerificationTypeInfo {
|
||||||
tag,
|
tag,
|
||||||
offset: data.u2()?,
|
offset: data.u2()?,
|
||||||
},
|
},
|
||||||
_ => Err(ParseErr)?,
|
_ => Err(ParseErr(format!(
|
||||||
|
"Invalid VerificationTypeInfo tag: {}",
|
||||||
|
tag
|
||||||
|
)))?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -383,7 +419,10 @@ impl Parse for AnnotationElementValueValue {
|
||||||
num_values: data.u2()?,
|
num_values: data.u2()?,
|
||||||
values: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
values: Vec::parse_vec(data, data.last_u2()? as usize)?,
|
||||||
},
|
},
|
||||||
_ => Err(ParseErr)?,
|
_ => Err(ParseErr(format!(
|
||||||
|
"Invalid AnnotationElementValueValue tag: {}",
|
||||||
|
tag
|
||||||
|
)))?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue