From d6a40a81a46e5dc2539570f4d637ee617e9d07ca Mon Sep 17 00:00:00 2001 From: Sander Hautvast Date: Sat, 30 Sep 2023 07:50:44 +0200 Subject: [PATCH] implement java main --- src/class.rs | 10 +++------- src/main.rs | 17 ++++++----------- src/vm.rs | 6 ++++-- tests/Float.java | 14 -------------- tests/FloatBean.class | Bin 0 -> 323 bytes tests/FloatBean.java | 10 ++++++++++ tests/Main.class | Bin 0 -> 315 bytes tests/Main.java | 6 ++++++ 8 files changed, 29 insertions(+), 34 deletions(-) delete mode 100644 tests/Float.java create mode 100644 tests/FloatBean.class create mode 100644 tests/FloatBean.java create mode 100644 tests/Main.class create mode 100644 tests/Main.java diff --git a/src/class.rs b/src/class.rs index cb95969..e318983 100644 --- a/src/class.rs +++ b/src/class.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use std::fmt; use std::rc::Rc; use std::sync::Arc; +use anyhow::{anyhow, Error}; use crate::classloader::CpEntry; use crate::heap::Object; @@ -27,13 +28,8 @@ impl Class { (self.major_version, self.minor_version) } - // pub fn execute(&self, method_name: &str) -> Value { - // let m = self.methods.get(method_name).unwrap(); - // execute(m).unwrap() //TODO - // } - - pub fn get_method(&self, name: &str) -> &Method { - self.methods.get(name).expect("ClassNountFoundException") + pub fn get_method(&self, name: &str) -> Result<&Method, Error> { + self.methods.get(name).ok_or(anyhow!("Method {} not found", name)) } } unsafe impl Send for Class {} diff --git a/src/main.rs b/src/main.rs index 8849bcf..9a67592 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,10 @@ -use regex::Regex; +use std::io::Error; +use classfile_reader::vm::Vm; -fn main() { - // if let Some(class) = classfile_reader::get_class(classfile_reader::io::read_class_file("./Dummy.class")){ - // println!("{:?}", class); - // let ret = class.execute("public static get()D"); - // println!("{:?}", ret); - // } - - let pattern = Regex::new(".*/(.+)").unwrap(); - let c = pattern.captures("java/lang/String").unwrap().get(1); - println!("{}", c.unwrap().as_str()); +fn main() -> Result<(), Error> { + let mut vm = Vm::new("tests"); + vm.execute("Main","public static main([Ljava/lang/String;)V", None).unwrap(); + Ok(()) } diff --git a/src/vm.rs b/src/vm.rs index 46a8afd..572a245 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -34,6 +34,7 @@ pub struct Vm { classes: HashMap>, //TODO implement classloader heap: Heap, + pub exitcode: i32, } impl Vm { @@ -42,13 +43,14 @@ impl Vm { classpath: classpath.split(':').map(|s| s.to_owned()).collect(), classes: HashMap::new(), heap: Heap::new(), + exitcode: 0, } } pub fn get_class(&mut self, class_name: &str) -> Result, Error> { let entry = self.classes.entry(class_name.into()); let entry = entry.or_insert_with(|| { - let resolved_path = find_class(&self.classpath, class_name).unwrap(); + let resolved_path = find_class(&self.classpath, class_name).expect("Class not found"); let bytecode = read_class_file(resolved_path).unwrap(); Arc::new(load_class(bytecode).unwrap()) }); @@ -77,7 +79,7 @@ impl Vm { pub fn execute(&mut self, class_name: &str, method_name: &str, instance: Option>) -> Result, Error> { let class = self.get_class(class_name)?; - let method = class.get_method(method_name); + let method = class.get_method(method_name)?; if let AttributeType::Code(code) = method.attributes.get("Code").unwrap() { let mut stack = StackFrame::new(); let mut pc: usize = 0; diff --git a/tests/Float.java b/tests/Float.java deleted file mode 100644 index 9f66939..0000000 --- a/tests/Float.java +++ /dev/null @@ -1,14 +0,0 @@ -public class Float { - - private final static float f =42.0F; - - private float f2; - - public static float getF() { - return f; - } - - public float getF2(){ - return f2; - } -} diff --git a/tests/FloatBean.class b/tests/FloatBean.class new file mode 100644 index 0000000000000000000000000000000000000000..748e4401f7024bd4a36d5be3ed85caaf8afda878 GIT binary patch literal 323 zcmZ8cyGjE=6g_vd@2n<13&FxJT9`78SR}Ajh(#p*Y#hUebr#}mK1&b;A%!2{M~P=v z5VV;4IFCE`etzvf0E}>&!pC8P4vr!mM>rA4BVR7qo7CpnDq|O_YP3Hd0D@ra8bNqd zn$q41I)lrFz@O9)M0?ZH=vnhr=*_(66|*(`NlI(9#=YGub-nd`OM zsthT*84`qoi+1x2aO;bdLpoF(hbd(jXHBp!f= zLhPo=6}x+*Z$_*A{rma>aED=x5NU*d3=gT4(+Fn~&I#dzvBo_TI@$Gt;7{r|O-QH4 z>gRS_=w_~piWPsWj3o@S)pVoY)u>Xo9L-!~Y z<;Ggs1Or@foDhWmA?u~s=(QtsOYIh_YB`2i%5jB&mzU>(B#mp2f0x{edvLP@eel3L na1HmOAV)}e7Bt&if#e(Ba)-_*{MUm+&H?z$2h1Py?BV1eVZJoK literal 0 HcmV?d00001 diff --git a/tests/Main.java b/tests/Main.java new file mode 100644 index 0000000..e7401e9 --- /dev/null +++ b/tests/Main.java @@ -0,0 +1,6 @@ +public class Main { + + public static void main(String[] args){ + new FloatBean().getValue(); + } +}