This commit is contained in:
Sander Hautvast 2023-09-30 18:06:36 +02:00
parent c821944fac
commit 027fd99312
3 changed files with 11 additions and 11 deletions

View file

@ -21,7 +21,7 @@ impl Object {
} }
fn get_field(&self, cp_index: &u16) -> &str { fn get_field(&self, cp_index: &u16) -> &str {
if let CpEntry::Utf8(name) = self.class.constant_pool.get(&cp_index).unwrap() { if let CpEntry::Utf8(name) = self.class.constant_pool.get(cp_index).unwrap() {
return name; return name;
} }
panic!() panic!()

View file

@ -17,7 +17,7 @@ pub fn find_class(classpath: &Vec<String>, class_name: &str) -> Result<String, E
} }
for clp_entry in classpath { for clp_entry in classpath {
if fs::metadata(&clp_entry)?.is_dir() { if fs::metadata(clp_entry)?.is_dir() {
let mut maybe_path = clp_entry.clone(); let mut maybe_path = clp_entry.clone();
maybe_path.push('/'); maybe_path.push('/');
maybe_path.push_str(class_name); maybe_path.push_str(class_name);
@ -37,18 +37,18 @@ pub fn find_class(classpath: &Vec<String>, class_name: &str) -> Result<String, E
/// and returns the byte array as Vec /// and returns the byte array as Vec
pub fn read_bytecode(name: String) -> Result<Vec<u8>, Error> { pub fn read_bytecode(name: String) -> Result<Vec<u8>, Error> {
let mut buffer; let mut buffer;
if name.contains("#") { if name.contains('#') {
let parts: Vec<&str> = name.split("#").collect(); let parts: Vec<&str> = name.split('#').collect();
let archive_file = File::open(parts[0])?; let archive_file = File::open(parts[0])?;
let mut archive_zip = zip::ZipArchive::new(archive_file)?; let mut archive_zip = zip::ZipArchive::new(archive_file)?;
let mut entry = archive_zip.by_name(parts[1])?; let mut entry = archive_zip.by_name(parts[1])?;
buffer = vec![0; entry.size() as usize]; buffer = vec![0; entry.size() as usize];
entry.read(&mut buffer)?; entry.read_exact(&mut buffer)?;
} else { } else {
let mut f = File::open(&name)?; let mut f = File::open(&name)?;
let metadata = fs::metadata(&name)?; let metadata = fs::metadata(&name)?;
buffer = vec![0; metadata.len() as usize]; buffer = vec![0; metadata.len() as usize];
let _ = f.read(&mut buffer)?; f.read_exact(&mut buffer)?;
} }
Ok(buffer) Ok(buffer)
} }

View file

@ -276,8 +276,8 @@ impl Vm {
fn get_signature_for_invoke(cp: Rc<HashMap<u16, CpEntry>>, index: u16) -> Option<(String, String)> { fn get_signature_for_invoke(cp: Rc<HashMap<u16, CpEntry>>, index: u16) -> Option<(String, String)> {
if let CpEntry::MethodRef(class_index, name_and_type_index) = cp.get(&index).unwrap() { if let CpEntry::MethodRef(class_index, name_and_type_index) = cp.get(&index).unwrap() {
if let Some(method_signature) = get_name_and_type(Rc::clone(&cp), *name_and_type_index) { if let Some(method_signature) = get_name_and_type(Rc::clone(&cp), *name_and_type_index) {
if let CpEntry::ClassRef(class_name_index) = cp.get(&class_index).unwrap() { if let CpEntry::ClassRef(class_name_index) = cp.get(class_index).unwrap() {
if let CpEntry::Utf8(class_name) = cp.get(&class_name_index).unwrap() { if let CpEntry::Utf8(class_name) = cp.get(class_name_index).unwrap() {
return Some((class_name.into(), method_signature)); return Some((class_name.into(), method_signature));
} }
} }
@ -286,10 +286,10 @@ fn get_signature_for_invoke(cp: Rc<HashMap<u16, CpEntry>>, index: u16) -> Option
None None
} }
fn get_name_and_type(cp: Rc<HashMap<u16, CpEntry>>, index: u16) -> Option<(String)> { fn get_name_and_type(cp: Rc<HashMap<u16, CpEntry>>, index: u16) -> Option<String> {
if let CpEntry::NameAndType(method_name_index, signature_index) = cp.get(&index).unwrap() { if let CpEntry::NameAndType(method_name_index, signature_index) = cp.get(&index).unwrap() {
if let CpEntry::Utf8(method_name) = cp.get(&method_name_index).unwrap() { if let CpEntry::Utf8(method_name) = cp.get(method_name_index).unwrap() {
if let CpEntry::Utf8(signature) = cp.get(&signature_index).unwrap() { if let CpEntry::Utf8(signature) = cp.get(signature_index).unwrap() {
let mut method_signature: String = method_name.into(); let mut method_signature: String = method_name.into();
method_signature.push_str(signature); method_signature.push_str(signature);
return Some(method_signature); return Some(method_signature);