diff --git a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java index 751af68..246934e 100644 --- a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java +++ b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java @@ -3,7 +3,7 @@ package haidnor.jvm.core; import haidnor.jvm.instruction.Instruction; import haidnor.jvm.instruction.InstructionFactory; -import haidnor.jvm.instruction.control.RETURN; +import haidnor.jvm.instruction.control.*; import haidnor.jvm.rtda.KlassMethod; import haidnor.jvm.runtime.Frame; import haidnor.jvm.runtime.JVMThread; @@ -95,7 +95,7 @@ public class JavaExecutionEngine { Instruction instruction = instructionMap.get(i); log.debug("{}│ {}", blank, instruction); instruction.execute(frame); - if (instruction instanceof RETURN) { + if (instruction instanceof RETURN || instruction instanceof ARETURN || instruction instanceof DRETURN || instruction instanceof FRETURN || instruction instanceof IRETURN) { break; } i += instruction.offSet(); diff --git a/src/main/java/haidnor/jvm/instruction/InstructionFactory.java b/src/main/java/haidnor/jvm/instruction/InstructionFactory.java index 27f87b8..58baf22 100644 --- a/src/main/java/haidnor/jvm/instruction/InstructionFactory.java +++ b/src/main/java/haidnor/jvm/instruction/InstructionFactory.java @@ -595,7 +595,7 @@ public abstract class InstructionFactory { return new ARRAYLENGTH(codeStream); } case Const.ATHROW -> { - throw new Error("Not support JavaVM opcode ATHROW"); + return new ATHROW(codeStream); } case Const.CHECKCAST -> { return new CHECKCAST(codeStream); diff --git a/src/main/java/haidnor/jvm/instruction/references/ATHROW.java b/src/main/java/haidnor/jvm/instruction/references/ATHROW.java new file mode 100644 index 0000000..708f19c --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/references/ATHROW.java @@ -0,0 +1,20 @@ +package haidnor.jvm.instruction.references; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; +import lombok.SneakyThrows; + +public class ATHROW extends Instruction { + + public ATHROW(CodeStream codeStream) { + super(codeStream); + } + + @Override + @SneakyThrows + public void execute(Frame frame) { + + } + +} diff --git a/src/test/java/haidnor/jvm/test/TestJVM.java b/src/test/java/haidnor/jvm/test/TestJVM.java index dc8b5f3..bb9274e 100644 --- a/src/test/java/haidnor/jvm/test/TestJVM.java +++ b/src/test/java/haidnor/jvm/test/TestJVM.java @@ -70,6 +70,11 @@ public class TestJVM { runMainClass(Demo6.class); } + @Test + public void test_7() throws Exception { + runMainClass(Demo7.class); + } + @Test public void test_NEW() throws Exception { runMainClass(NEW.class); diff --git a/src/test/java/haidnor/jvm/test/demo/Demo7.java b/src/test/java/haidnor/jvm/test/demo/Demo7.java new file mode 100644 index 0000000..1db1fb6 --- /dev/null +++ b/src/test/java/haidnor/jvm/test/demo/Demo7.java @@ -0,0 +1,20 @@ +package haidnor.jvm.test.demo; + + +public class Demo7 { + + public static void main(String[] args) { + String fun = fun(); + System.out.println(fun); + } + + public static String fun() { + String str = "hello"; + try { + return str; + } finally { + System.out.println("zhangsan"); + } + } + +}