add ARETURN 支持返回对象

This commit is contained in:
wangxiang
2023-07-21 15:01:43 +08:00
parent 6211a0d8f1
commit 05affb1a80
7 changed files with 60 additions and 29 deletions

View File

@@ -547,7 +547,7 @@ public abstract class InstructionFactory {
return new DRETURN(codeStream);
}
case Const.ARETURN -> {
throw new Error("Not support JavaVM opcode ARETURN");
return new ARETURN(codeStream);
}
case Const.RETURN -> {
return new RETURN(codeStream);

View File

@@ -0,0 +1,26 @@
package haidnor.jvm.instruction.control;
import haidnor.jvm.instruction.Instruction;
import haidnor.jvm.runtime.Frame;
import haidnor.jvm.runtime.StackValue;
import haidnor.jvm.util.CodeStream;
import haidnor.jvm.util.JvmThreadHolder;
public class ARETURN extends Instruction {
public ARETURN(CodeStream codeStream) {
super(codeStream);
}
@Override
public void execute(Frame frame) {
// 弹出操作数栈中的值
StackValue stackValue = frame.pop();
// 将当前栈帧从 jvm 线程栈中弹出
JvmThreadHolder.get().pop();
// 将方法返回值压入前一个栈帧的操作数栈中
Frame topFrame = JvmThreadHolder.get().peek();
topFrame.push(stackValue);
}
}

View File

@@ -53,7 +53,7 @@ public class INVOKESTATIC extends Instruction {
}
}
Class<?> javaClass = Class.forName(Utility.compactClassName(className,false));
Class<?> javaClass = Class.forName(Utility.compactClassName(className, false));
java.lang.reflect.Method method = javaClass.getMethod(methodName, parameterTypeArr);
method.setAccessible(true);
Object value = method.invoke(null, stacksValueArr);
@@ -63,17 +63,20 @@ public class INVOKESTATIC extends Instruction {
}
// 自定义类的方法
else {
Klass meteKlass = Metaspace.getJavaClass(Utility.compactClassName(className));
if (meteKlass != null) {
JavaClass javaClass = meteKlass.getJavaClass();
for (Method method : javaClass.getMethods()) {
if (method.getSignature().equals(methodSignature) && method.getName().equals(methodName)) {
KlassMethod klassMethod = new KlassMethod(meteKlass, method);
JavaExecutionEngine.callMethod(frame, klassMethod);
break;
}
Klass klass = Metaspace.getJavaClass(Utility.compactClassName(className));
// 调用静态方法时加载类
if (klass == null) {
klass = frame.getMetaClass().getClassLoader().loadClass(className);
}
JavaClass javaClass = klass.getJavaClass();
for (Method method : javaClass.getMethods()) {
if (method.getSignature().equals(methodSignature) && method.getName().equals(methodName)) {
KlassMethod klassMethod = new KlassMethod(klass, method);
JavaExecutionEngine.callMethod(frame, klassMethod);
break;
}
}
}
}

View File

@@ -1,7 +1,9 @@
package haidnor.jvm.test.clazz;
public class Human {
public void eat() {
System.out.println("人类吃饭");
}
}

View File

@@ -2,6 +2,16 @@ package haidnor.jvm.test.clazz;
public class Student extends Human {
public static String name = "张三";
public static String school = "家里蹲大学";
public String name;
public void printSchool() {
System.out.println(school);
}
public static Student newStudent() {
return new Student();
}
}

View File

@@ -1,16 +1,14 @@
package haidnor.jvm.test.demo;
import haidnor.jvm.test.clazz.Student;
import java.util.HashMap;
public class Demo3 {
public static void main(String[] args) {
Student sut1 = new Student(1);
Student sut2 = new Student(2);
if (sut1 == sut2) {
}
Student sut1 = new Student();
Student sut2 = new Student();
HashMap<Student, String> hashMap = new HashMap<>();
hashMap.put(sut1, "张三");
@@ -22,13 +20,3 @@ public class Demo3 {
}
class Student {
public int age;
public Student(int age) {
this.age = age;
}
}

View File

@@ -5,8 +5,10 @@ import haidnor.jvm.test.clazz.Student;
public class Demo4 {
public static void main(String[] args) {
Student student = new Student();
Student student = Student.newStudent();
student.eat();
student.name = "张三";
System.out.println(student.name);
}
}