diff --git a/src/class.rs b/src/class.rs index fb3fe82..e5ae24a 100644 --- a/src/class.rs +++ b/src/class.rs @@ -61,8 +61,9 @@ pub fn get_class( Class::initialize_fields(clone3); let clinit = clone2.borrow().methods.contains_key("()V"); + let name = &clone2.borrow().name.to_owned(); if clinit { - vm.execute_class(clone2, "()V", vec![]).unwrap(); + vm.execute(name, "()V", vec![]).unwrap(); } } Ok(clone) diff --git a/src/vm.rs b/src/vm.rs index 8fcbbc1..9feeeea 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -9,9 +9,7 @@ use log::{info}; use Value::*; use crate::class::Value::{Null, Void}; -use crate::class::{ - get_class, unsafe_ref, unsafe_val, AttributeType, Class, Modifier, UnsafeValue, Value, -}; +use crate::class::{get_class, unsafe_ref, unsafe_val, AttributeType, Class, Modifier, UnsafeValue, Value, Method}; use crate::classloader::CpEntry; use crate::heap::{Heap, Object, ObjectRef}; use crate::io::*; @@ -97,19 +95,20 @@ impl Vm { args: Vec, ) -> Result { let class = get_class(self, class_name)?; - self.execute_class(class, method_name, args) + let method = class.clone().borrow().get_method(method_name)?.clone(); + //TODO implement dynamic dispatch -> get method from instance + self.execute_class(class, method, args) } pub fn execute_class( &mut self, class: Arc>, - method_name: &str, + method: Rc, args: Vec, ) -> Result { let this_class = class; - println!("execute {}.{}", this_class.borrow().name, method_name); + println!("execute {}.{}", this_class.borrow().name, method.name()); - let method = this_class.clone().borrow().get_method(method_name)?.clone(); //TODO implement dynamic dispatch -> get method from instance let mut local_params: Vec> = @@ -152,25 +151,25 @@ impl Vm { self.current_frame().push(I32(5)); } LCONST_0 => { - self.current_frame().push(Value::I64(0)); + self.current_frame().push(I64(0)); } LCONST_1 => { - self.current_frame().push(Value::I64(1)); + self.current_frame().push(I64(1)); } FCONST_0 => { - self.current_frame().push(Value::F32(0.0)); + self.current_frame().push(F32(0.0)); } FCONST_1 => { - self.current_frame().push(Value::F32(1.0)); + self.current_frame().push(F32(1.0)); } FCONST_2 => { - self.current_frame().push(Value::F32(2.0)); + self.current_frame().push(F32(2.0)); } DCONST_0 => { - self.current_frame().push(Value::F64(0.0)); + self.current_frame().push(F64(0.0)); } DCONST_1 => { - self.current_frame().push(Value::F64(1.0)); + self.current_frame().push(F64(1.0)); } SIPUSH => { let s = read_u16(&code.opcodes, pc) as i32; @@ -212,8 +211,8 @@ impl Vm { .as_bytes() .into(); - self.execute_class( - stringclass, + self.execute( + "java/lang/String", "([B)V", vec![ stringinstance.clone(), diff --git a/tests/class_tests.rs b/tests/class_tests.rs index c46a277..9eb3797 100644 --- a/tests/class_tests.rs +++ b/tests/class_tests.rs @@ -5,8 +5,7 @@ mod test { #[test] fn if_cmp() { let mut vm = Vm::new("tests"); - let c = get_class(&mut vm, "testclasses.IfCmp").unwrap(); - let ret = vm.execute_class(c, "i_is_1()Z", vec![]).unwrap(); + let ret = vm.execute("testclasses.IfCmp", "i_is_1()Z", vec![]).unwrap(); unsafe { if let Value::I32(b) = *ret.get() { // internally a boolean is an int @@ -21,9 +20,8 @@ mod test { #[test] fn consts() { let mut vm = Vm::new("tests"); - let c = get_class(&mut vm, "testclasses.Const").unwrap(); let ret = vm - .execute_class(c, "hello()Ljava/lang/String;", vec![]) + .execute("testclasses.Const", "hello()Ljava/lang/String;", vec![]) .unwrap(); unsafe { if let Value::Ref(s) = &*ret.get() {