+ * RET 指令在早期版本的 Java 虚拟机中使用,但自从 Java SE 6 版本以后,它已经被废弃不再使用。取而代之的是通过 JSR 和 RET 指令的组合实现的子例程(subroutines)已经被新的字节码指令 invokedynamic 所取代。 + *
+ * RET 指令需要一个操作数,作为局部变量表(local variable table)中一个给定索引处的值。这个索引通常是由 JSR(Jump SubRoutine)指令记录的,JSR 指令在携带一个偏移量的情况下,会将指令执行的位置压入操作数栈,并跳转到指定的位置。RET 指令则使用这个记录的位置来返回。 + *
+ * 需要注意的是,由于 RET 指令被废弃,所以在现代的 Java 虚拟机中,解释器或即时编译器会将 RET 指令替换为其他的指令序列来实现相同的功能。 + */ +public class RET extends Instruction { + + public RET(CodeStream codeStream) { + super(codeStream); + throw new UnsupportedOperationException("RET"); + } + + @Override + public void execute(Frame frame) { + throw new UnsupportedOperationException("RET"); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/control/RETURN.java b/src/main/java/haidnor/jvm/instruction/control/RETURN.java new file mode 100644 index 0000000..56ff11a --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/control/RETURN.java @@ -0,0 +1,19 @@ +package haidnor.jvm.instruction.control; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; +import haidnor.jvm.util.JvmThreadHolder; + +public class RETURN extends Instruction { + + public RETURN(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + JvmThreadHolder.get().pop(); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/D2F.java b/src/main/java/haidnor/jvm/instruction/conversions/D2F.java new file mode 100644 index 0000000..bbfc874 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/D2F.java @@ -0,0 +1,20 @@ + +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +public class D2F extends Instruction { + + public D2F(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + double doubleVal = frame.popDouble(); + frame.pushFloat(Double.valueOf(doubleVal).floatValue()); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/D2I.java b/src/main/java/haidnor/jvm/instruction/conversions/D2I.java new file mode 100644 index 0000000..94f5e44 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/D2I.java @@ -0,0 +1,19 @@ +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +public class D2I extends Instruction { + + public D2I(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + double doubleVal = frame.popDouble(); + frame.pushInt(Double.valueOf(doubleVal).intValue()); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/D2L.java b/src/main/java/haidnor/jvm/instruction/conversions/D2L.java new file mode 100644 index 0000000..1bba3f0 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/D2L.java @@ -0,0 +1,19 @@ +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +public class D2L extends Instruction { + + public D2L(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + double doubleVal = frame.popDouble(); + frame.pushLong(Double.valueOf(doubleVal).longValue()); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/F2D.java b/src/main/java/haidnor/jvm/instruction/conversions/F2D.java new file mode 100644 index 0000000..a4a0d77 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/F2D.java @@ -0,0 +1,19 @@ +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +public class F2D extends Instruction { + + public F2D(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + float floatVal = frame.popFloat(); + frame.pushDouble(Float.valueOf(floatVal).doubleValue()); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/F2I.java b/src/main/java/haidnor/jvm/instruction/conversions/F2I.java new file mode 100644 index 0000000..0a95939 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/F2I.java @@ -0,0 +1,19 @@ +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +public class F2I extends Instruction { + + public F2I(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + float floatVal = frame.popFloat(); + frame.pushInt(Float.valueOf(floatVal).intValue()); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/F2L.java b/src/main/java/haidnor/jvm/instruction/conversions/F2L.java new file mode 100644 index 0000000..cdadf34 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/F2L.java @@ -0,0 +1,19 @@ +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +public class F2L extends Instruction { + + public F2L(CodeStream codeStream) { + super(codeStream); + } + + @Override + public void execute(Frame frame) { + float floatVal = frame.popFloat(); + frame.pushLong(Float.valueOf(floatVal).longValue()); + } + +} diff --git a/src/main/java/haidnor/jvm/instruction/conversions/I2B.java b/src/main/java/haidnor/jvm/instruction/conversions/I2B.java new file mode 100644 index 0000000..1b84a80 --- /dev/null +++ b/src/main/java/haidnor/jvm/instruction/conversions/I2B.java @@ -0,0 +1,24 @@ +package haidnor.jvm.instruction.conversions; + +import haidnor.jvm.instruction.Instruction; +import haidnor.jvm.runtime.Frame; +import haidnor.jvm.util.CodeStream; + +/** + * JVM中的I2B指令是用于执行将整数类型(int)转换为字节类型(byte)的指令。该指令将一个int类型的数值从操作数栈中弹出,并将其转换为一个字节(byte)。 + * 然后,将转换后的字节值压入操作数栈顶。 + *
+ * byte 类型的数据是以 int 形式存在的,因此不需要做任何处理
+ */
+public class I2B extends Instruction {
+
+ public I2B(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/I2C.java b/src/main/java/haidnor/jvm/instruction/conversions/I2C.java
new file mode 100644
index 0000000..04a9b08
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/I2C.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+/**
+ * char 类型的数据是以 int 形式存在的,因此不需要做任何处理
+ */
+public class I2C extends Instruction {
+
+ public I2C(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/I2D.java b/src/main/java/haidnor/jvm/instruction/conversions/I2D.java
new file mode 100644
index 0000000..e62a3dd
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/I2D.java
@@ -0,0 +1,19 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class I2D extends Instruction {
+
+ public I2D(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int intVal = frame.popInt();
+ frame.pushDouble(Integer.valueOf(intVal).doubleValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/I2F.java b/src/main/java/haidnor/jvm/instruction/conversions/I2F.java
new file mode 100644
index 0000000..7c4daf5
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/I2F.java
@@ -0,0 +1,19 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class I2F extends Instruction {
+
+ public I2F(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int intVal = frame.popInt();
+ frame.pushFloat(Integer.valueOf(intVal).floatValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/I2L.java b/src/main/java/haidnor/jvm/instruction/conversions/I2L.java
new file mode 100644
index 0000000..6bb9ac8
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/I2L.java
@@ -0,0 +1,19 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class I2L extends Instruction {
+
+ public I2L(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int intVal = frame.popInt();
+ frame.pushLong(Integer.valueOf(intVal).longValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/I2S.java b/src/main/java/haidnor/jvm/instruction/conversions/I2S.java
new file mode 100644
index 0000000..fe9cd1e
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/I2S.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class I2S extends Instruction {
+
+ public I2S(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int intVal = frame.popInt();
+ short shortValue = Integer.valueOf(intVal).shortValue();
+ frame.pushInt(((int) shortValue));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/L2D.java b/src/main/java/haidnor/jvm/instruction/conversions/L2D.java
new file mode 100644
index 0000000..fd38919
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/L2D.java
@@ -0,0 +1,19 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class L2D extends Instruction {
+
+ public L2D(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long longVal = frame.popLong();
+ frame.pushDouble(Long.valueOf(longVal).doubleValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/L2F.java b/src/main/java/haidnor/jvm/instruction/conversions/L2F.java
new file mode 100644
index 0000000..ae4d084
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/L2F.java
@@ -0,0 +1,19 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class L2F extends Instruction {
+
+ public L2F(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long longVal = frame.popLong();
+ frame.pushFloat(Long.valueOf(longVal).floatValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/conversions/L2I.java b/src/main/java/haidnor/jvm/instruction/conversions/L2I.java
new file mode 100644
index 0000000..7e43556
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/conversions/L2I.java
@@ -0,0 +1,19 @@
+package haidnor.jvm.instruction.conversions;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class L2I extends Instruction {
+
+ public L2I(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long longVal = frame.popLong();
+ frame.pushInt(Long.valueOf(longVal).intValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/extended/GOTO.java b/src/main/java/haidnor/jvm/instruction/extended/GOTO.java
new file mode 100644
index 0000000..a7fc5d4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/extended/GOTO.java
@@ -0,0 +1,33 @@
+package haidnor.jvm.instruction.extended;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+/**
+ * Java VM opcode.
+ *
+ * @see Opcode definitions in
+ * The Java Virtual Machine Specification
+ */
+public class GOTO extends Instruction {
+ /**
+ * 下次再执行的偏移量
+ */
+ private final int offSet;
+
+ public GOTO(CodeStream codeStream) {
+ super(codeStream);
+ this.offSet = codeStream.readShort(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ super.setOffSet(offSet);
+ }
+
+ @Override
+ public String toString() {
+ return super.index() + " " + this.getClass().getSimpleName() + " " + offSet;
+ }
+}
diff --git a/src/main/java/haidnor/jvm/instruction/extended/GOTO_W.java b/src/main/java/haidnor/jvm/instruction/extended/GOTO_W.java
new file mode 100644
index 0000000..e79bb2b
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/extended/GOTO_W.java
@@ -0,0 +1,27 @@
+package haidnor.jvm.instruction.extended;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class GOTO_W extends Instruction {
+ /**
+ * 下次再执行的偏移量
+ */
+ private final int offSet;
+
+ public GOTO_W(CodeStream codeStream) {
+ super(codeStream);
+ this.offSet = codeStream.readInt(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ super.setOffSet(offSet);
+ }
+
+ @Override
+ public String toString() {
+ return super.index() + " " + this.getClass().getSimpleName() + " " + offSet;
+ }
+}
diff --git a/src/main/java/haidnor/jvm/instruction/extended/IFNONNULL.java b/src/main/java/haidnor/jvm/instruction/extended/IFNONNULL.java
new file mode 100644
index 0000000..2c7f73c
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/extended/IFNONNULL.java
@@ -0,0 +1,33 @@
+package haidnor.jvm.instruction.extended;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class IFNONNULL extends Instruction {
+ /**
+ * 下次再执行的偏移量
+ */
+ private final int offSet;
+
+ public IFNONNULL(CodeStream codeStream) {
+ super(codeStream);
+ this.offSet = codeStream.readShort(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue v1 = frame.pop();
+ if (v1.getValue() != null) {
+ super.setOffSet(offSet);
+ } else {
+ super.setOffSet(3);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return super.index() + " " + this.getClass().getSimpleName() + " " + offSet;
+ }
+}
diff --git a/src/main/java/haidnor/jvm/instruction/extended/IFNULL.java b/src/main/java/haidnor/jvm/instruction/extended/IFNULL.java
new file mode 100644
index 0000000..af693eb
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/extended/IFNULL.java
@@ -0,0 +1,33 @@
+package haidnor.jvm.instruction.extended;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class IFNULL extends Instruction {
+ /**
+ * 下次再执行的偏移量
+ */
+ private final int offSet;
+
+ public IFNULL(CodeStream codeStream) {
+ super(codeStream);
+ this.offSet = codeStream.readShort(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue v1 = frame.pop();
+ if (v1.getValue() == null) {
+ super.setOffSet(offSet);
+ } else {
+ super.setOffSet(3);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return super.index() + " " + this.getClass().getSimpleName() + " " + offSet;
+ }
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java
new file mode 100644
index 0000000..acc30b6
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/AALOAD.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.rtda.heap.InstanceArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class AALOAD extends Instruction {
+
+ public AALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ InstanceArray array = (InstanceArray) frame.popRef();
+ Instance item = (Instance) array.items[index];
+ frame.pushRef(item);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java
new file mode 100644
index 0000000..2819ae4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD.java
@@ -0,0 +1,26 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+
+public class ALOAD extends Instruction {
+
+ private final int index;
+
+ public ALOAD(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Object value = frame.slotGetRef(index);
+ frame.push(new StackValue(Const.T_OBJECT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java
new file mode 100644
index 0000000..5f83857
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_0.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class ALOAD_0 extends Instruction {
+
+ public ALOAD_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Object value = frame.slotGetRef(0);
+ frame.push(new StackValue(Const.T_OBJECT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java
new file mode 100644
index 0000000..0d7f851
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_1.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class ALOAD_1 extends Instruction {
+
+ public ALOAD_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Object value = frame.slotGetRef(1);
+ frame.push(new StackValue(Const.T_OBJECT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_2.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_2.java
new file mode 100644
index 0000000..2f1867d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_2.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class ALOAD_2 extends Instruction {
+
+ public ALOAD_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Object value = frame.slotGetRef(2);
+ frame.push(new StackValue(Const.T_OBJECT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ALOAD_3.java b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_3.java
new file mode 100644
index 0000000..005ccc0
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ALOAD_3.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class ALOAD_3 extends Instruction {
+
+ public ALOAD_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Object value = frame.slotGetRef(3);
+ frame.push(new StackValue(Const.T_OBJECT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java
new file mode 100644
index 0000000..f069c41
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/BALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class BALOAD extends Instruction {
+
+ public BALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushInt(array.ints[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java
new file mode 100644
index 0000000..edc9cd7
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/CALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class CALOAD extends Instruction {
+
+ public CALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushInt(array.ints[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java
new file mode 100644
index 0000000..59ef521
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/DALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class DALOAD extends Instruction {
+
+ public DALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushDouble(array.doubles[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/DLOAD.java b/src/main/java/haidnor/jvm/instruction/loads/DLOAD.java
new file mode 100644
index 0000000..35a1235
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/DLOAD.java
@@ -0,0 +1,25 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+
+public class DLOAD extends Instruction {
+
+ private final int index;
+
+ public DLOAD(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ double value = frame.slotGetDouble(index);
+ frame.push(new StackValue(Const.T_DOUBLE, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/DLOAD_0.java b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_0.java
new file mode 100644
index 0000000..5e39063
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_0.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DLOAD_0 extends Instruction {
+
+ public DLOAD_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ double value = frame.slotGetDouble(0);
+ frame.push(new StackValue(Const.T_DOUBLE, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/DLOAD_1.java b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_1.java
new file mode 100644
index 0000000..7cbb195
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_1.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DLOAD_1 extends Instruction {
+
+ public DLOAD_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ double value = frame.slotGetDouble(1);
+ frame.push(new StackValue(Const.T_DOUBLE, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/DLOAD_2.java b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_2.java
new file mode 100644
index 0000000..1648b66
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_2.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DLOAD_2 extends Instruction {
+
+ public DLOAD_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ double value = frame.slotGetDouble(2);
+ frame.push(new StackValue(Const.T_DOUBLE, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/DLOAD_3.java b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_3.java
new file mode 100644
index 0000000..f5405ce
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/DLOAD_3.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DLOAD_3 extends Instruction {
+
+ public DLOAD_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ double value = frame.slotGetDouble(3);
+ frame.push(new StackValue(Const.T_DOUBLE, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java
new file mode 100644
index 0000000..66be156
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/FALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class FALOAD extends Instruction {
+
+ public FALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushFloat(array.floats[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/FLOAD.java b/src/main/java/haidnor/jvm/instruction/loads/FLOAD.java
new file mode 100644
index 0000000..7ce6301
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/FLOAD.java
@@ -0,0 +1,25 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+
+public class FLOAD extends Instruction {
+
+ private final int index;
+
+ public FLOAD(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ float value = frame.slotGetFloat(index);
+ frame.push(new StackValue(Const.T_FLOAT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/FLOAD_0.java b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_0.java
new file mode 100644
index 0000000..5a3ae65
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_0.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FLOAD_0 extends Instruction {
+
+ public FLOAD_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ float value = frame.slotGetFloat(0);
+ frame.push(new StackValue(Const.T_FLOAT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/FLOAD_1.java b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_1.java
new file mode 100644
index 0000000..eb6aca2
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_1.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FLOAD_1 extends Instruction {
+
+ public FLOAD_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ float value = frame.slotGetFloat(1);
+ frame.push(new StackValue(Const.T_FLOAT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/FLOAD_2.java b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_2.java
new file mode 100644
index 0000000..cc740f2
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_2.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FLOAD_2 extends Instruction {
+
+ public FLOAD_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ float value = frame.slotGetFloat(2);
+ frame.push(new StackValue(Const.T_FLOAT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/FLOAD_3.java b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_3.java
new file mode 100644
index 0000000..d2ead70
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/FLOAD_3.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FLOAD_3 extends Instruction {
+
+ public FLOAD_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ float value = frame.slotGetFloat(3);
+ frame.push(new StackValue(Const.T_FLOAT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java
new file mode 100644
index 0000000..1a58fe7
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/IALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class IALOAD extends Instruction {
+
+ public IALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushInt(array.ints[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ILOAD.java b/src/main/java/haidnor/jvm/instruction/loads/ILOAD.java
new file mode 100644
index 0000000..78c5304
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ILOAD.java
@@ -0,0 +1,25 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+
+public class ILOAD extends Instruction {
+
+ private final int index;
+
+ public ILOAD(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int value = frame.slotGetInt(index);
+ frame.push(new StackValue(Const.T_INT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ILOAD_0.java b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_0.java
new file mode 100644
index 0000000..4396c21
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_0.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+/**
+ * https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.iload_n
+ */
+public class ILOAD_0 extends Instruction {
+
+ public ILOAD_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int value = frame.slotGetInt(0);
+ frame.push(new StackValue(Const.T_INT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ILOAD_1.java b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_1.java
new file mode 100644
index 0000000..9ea6009
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_1.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+/**
+ * https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.iload_n
+ */
+public class ILOAD_1 extends Instruction {
+
+ public ILOAD_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int value = frame.slotGetInt(1);
+ frame.push(new StackValue(Const.T_INT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ILOAD_2.java b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_2.java
new file mode 100644
index 0000000..e8a00a4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_2.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+/**
+ * https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.iload_n
+ */
+public class ILOAD_2 extends Instruction {
+
+ public ILOAD_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int value = frame.slotGetInt(2);
+ frame.push(new StackValue(Const.T_INT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/ILOAD_3.java b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_3.java
new file mode 100644
index 0000000..6adc81a
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/ILOAD_3.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+/**
+ * https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.iload_n
+ */
+public class ILOAD_3 extends Instruction {
+
+ public ILOAD_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int value = frame.slotGetInt(3);
+ frame.push(new StackValue(Const.T_INT, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java
new file mode 100644
index 0000000..9b676a4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/LALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class LALOAD extends Instruction {
+
+ public LALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushLong(array.longs[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/LLOAD.java b/src/main/java/haidnor/jvm/instruction/loads/LLOAD.java
new file mode 100644
index 0000000..702139d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/LLOAD.java
@@ -0,0 +1,25 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+
+public class LLOAD extends Instruction {
+
+ private final int index;
+
+ public LLOAD(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long value = frame.slotGetLong(index);
+ frame.push(new StackValue(Const.T_LONG, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/LLOAD_0.java b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_0.java
new file mode 100644
index 0000000..2a7a29d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_0.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LLOAD_0 extends Instruction {
+
+ public LLOAD_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long value = frame.slotGetLong(0);
+ frame.push(new StackValue(Const.T_LONG, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/LLOAD_1.java b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_1.java
new file mode 100644
index 0000000..00b07e6
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_1.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LLOAD_1 extends Instruction {
+
+ public LLOAD_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long value = frame.slotGetLong(1);
+ frame.push(new StackValue(Const.T_LONG, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/LLOAD_2.java b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_2.java
new file mode 100644
index 0000000..acb724f
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_2.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LLOAD_2 extends Instruction {
+
+ public LLOAD_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long value = frame.slotGetLong(2);
+ frame.push(new StackValue(Const.T_LONG, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/LLOAD_3.java b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_3.java
new file mode 100644
index 0000000..0c831fe
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/LLOAD_3.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LLOAD_3 extends Instruction {
+
+ public LLOAD_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long value = frame.slotGetLong(3);
+ frame.push(new StackValue(Const.T_LONG, value));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java b/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java
new file mode 100644
index 0000000..3428db7
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/loads/SALOAD.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.loads;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+
+public class SALOAD extends Instruction {
+
+ public SALOAD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ frame.pushInt(array.ints[index]);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/DADD.java b/src/main/java/haidnor/jvm/instruction/math/DADD.java
new file mode 100644
index 0000000..cd0f3d5
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/DADD.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DADD extends Instruction {
+
+ public DADD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ double result = (double) value1.getValue() + (double) value2.getValue();
+ frame.push(new StackValue(Const.T_DOUBLE, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/DDIV.java b/src/main/java/haidnor/jvm/instruction/math/DDIV.java
new file mode 100644
index 0000000..7db3560
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/DDIV.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DDIV extends Instruction {
+
+ public DDIV(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ double result = (double) value1.getValue() / (double) value2.getValue();
+ frame.push(new StackValue(Const.T_DOUBLE, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/DMUL.java b/src/main/java/haidnor/jvm/instruction/math/DMUL.java
new file mode 100644
index 0000000..0b66ca9
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/DMUL.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DMUL extends Instruction {
+
+ public DMUL(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ double result = (double) value1.getValue() * (double) value2.getValue();
+ frame.push(new StackValue(Const.T_DOUBLE, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/DNEG.java b/src/main/java/haidnor/jvm/instruction/math/DNEG.java
new file mode 100644
index 0000000..efd5b75
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/DNEG.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DNEG extends Instruction {
+
+ public DNEG(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue stackValue = frame.pop();
+ double value = (double) stackValue.getValue();
+ double tmp = -value;
+ frame.push(new StackValue(Const.T_DOUBLE, tmp));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/DREM.java b/src/main/java/haidnor/jvm/instruction/math/DREM.java
new file mode 100644
index 0000000..2fc29de
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/DREM.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DREM extends Instruction {
+
+ public DREM(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ double result = (double) value1.getValue() % (double) value2.getValue();
+ frame.push(new StackValue(Const.T_DOUBLE, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/DSUB.java b/src/main/java/haidnor/jvm/instruction/math/DSUB.java
new file mode 100644
index 0000000..d25ff6f
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/DSUB.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class DSUB extends Instruction {
+
+ public DSUB(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ double result = (double) value1.getValue() - (double) value2.getValue();
+ frame.push(new StackValue(Const.T_DOUBLE, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/FADD.java b/src/main/java/haidnor/jvm/instruction/math/FADD.java
new file mode 100644
index 0000000..c4a73c4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/FADD.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FADD extends Instruction {
+
+ public FADD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ float result = (float) value1.getValue() + (float) value2.getValue();
+ frame.push(new StackValue(Const.T_FLOAT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/FDIV.java b/src/main/java/haidnor/jvm/instruction/math/FDIV.java
new file mode 100644
index 0000000..6e7e768
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/FDIV.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FDIV extends Instruction {
+
+ public FDIV(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ float result = (float) value1.getValue() / (float) value2.getValue();
+ frame.push(new StackValue(Const.T_FLOAT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/FMUL.java b/src/main/java/haidnor/jvm/instruction/math/FMUL.java
new file mode 100644
index 0000000..7c82541
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/FMUL.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FMUL extends Instruction {
+
+ public FMUL(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ float result = (float) value1.getValue() * (float) value2.getValue();
+ frame.push(new StackValue(Const.T_FLOAT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/FNEG.java b/src/main/java/haidnor/jvm/instruction/math/FNEG.java
new file mode 100644
index 0000000..e245a33
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/FNEG.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FNEG extends Instruction {
+
+ public FNEG(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue stackValue = frame.pop();
+ float value = (float) stackValue.getValue();
+ float tmp = -value;
+ frame.push(new StackValue(Const.T_FLOAT, tmp));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/FREM.java b/src/main/java/haidnor/jvm/instruction/math/FREM.java
new file mode 100644
index 0000000..280de40
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/FREM.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FREM extends Instruction {
+
+ public FREM(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ float result = (float) value1.getValue() % (float) value2.getValue();
+ frame.push(new StackValue(Const.T_FLOAT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/FSUB.java b/src/main/java/haidnor/jvm/instruction/math/FSUB.java
new file mode 100644
index 0000000..0b83e45
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/FSUB.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class FSUB extends Instruction {
+
+ public FSUB(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ float result = (float) value1.getValue() - (float) value2.getValue();
+ frame.push(new StackValue(Const.T_FLOAT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IADD.java b/src/main/java/haidnor/jvm/instruction/math/IADD.java
new file mode 100644
index 0000000..d6c311f
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IADD.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class IADD extends Instruction {
+
+ public IADD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ int result = (int) value1.getValue() + (int) value2.getValue();
+ frame.push(new StackValue(Const.T_INT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IAND.java b/src/main/java/haidnor/jvm/instruction/math/IAND.java
new file mode 100644
index 0000000..396420f
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IAND.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class IAND extends Instruction {
+
+ public IAND(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Integer v2 = frame.popInt();
+ Integer v1 = frame.popInt();
+ int val = v1 & v2;
+ frame.pushInt(val);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IDIV.java b/src/main/java/haidnor/jvm/instruction/math/IDIV.java
new file mode 100644
index 0000000..fb2e53c
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IDIV.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class IDIV extends Instruction {
+
+ public IDIV(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ int result = (int) value1.getValue() / (int) value2.getValue();
+ frame.push(new StackValue(Const.T_INT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IINC.java b/src/main/java/haidnor/jvm/instruction/math/IINC.java
new file mode 100644
index 0000000..8dd1958
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IINC.java
@@ -0,0 +1,37 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+/**
+ * Java VM opcode.
+ *
+ * @see Opcode definitions in
+ * The Java Virtual Machine Specification
+ */
+public class IINC extends Instruction {
+
+ /**
+ * 局部变量表中需要被自增元素的索引
+ */
+ public final int index;
+
+ /**
+ * 自增值
+ */
+ public final int increment;
+
+ public IINC(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ this.increment = codeStream.readByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int value = frame.slotGetInt(index);
+ frame.slotSetInt(index, value + increment);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IMUL.java b/src/main/java/haidnor/jvm/instruction/math/IMUL.java
new file mode 100644
index 0000000..6ffaed8
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IMUL.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class IMUL extends Instruction {
+
+ public IMUL(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ int result = (int) value1.getValue() * (int) value2.getValue();
+ frame.push(new StackValue(Const.T_INT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/INEG.java b/src/main/java/haidnor/jvm/instruction/math/INEG.java
new file mode 100644
index 0000000..6e2c073
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/INEG.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class INEG extends Instruction {
+
+ public INEG(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue stackValue = frame.pop();
+ int value = (int) stackValue.getValue();
+ int tmp = -value;
+ frame.push(new StackValue(Const.T_INT, tmp));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IOR.java b/src/main/java/haidnor/jvm/instruction/math/IOR.java
new file mode 100644
index 0000000..0202bb3
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IOR.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class IOR extends Instruction {
+
+ public IOR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int v2 = frame.popInt();
+ int v1 = frame.popInt();
+ frame.pushInt(v1 | v2);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IREM.java b/src/main/java/haidnor/jvm/instruction/math/IREM.java
new file mode 100644
index 0000000..62f6ae5
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IREM.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class IREM extends Instruction {
+
+ public IREM(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ int result = (int) value1.getValue() % (int) value2.getValue();
+ frame.push(new StackValue(Const.T_INT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/ISHL.java b/src/main/java/haidnor/jvm/instruction/math/ISHL.java
new file mode 100644
index 0000000..d9273b5
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/ISHL.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class ISHL extends Instruction {
+
+ public ISHL(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int v2 = frame.popInt();
+ int v1 = frame.popInt();
+ int s = v2 & 0x1f;
+ int ret = v1 << s;
+ frame.pushInt(ret);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/ISHR.java b/src/main/java/haidnor/jvm/instruction/math/ISHR.java
new file mode 100644
index 0000000..ae36c0d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/ISHR.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class ISHR extends Instruction {
+
+ public ISHR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int v2 = frame.popInt();
+ int v1 = frame.popInt();
+ int s = v2 & 0x1f;
+ int ret = v1 >> s;
+ frame.pushInt(ret);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/ISUB.java b/src/main/java/haidnor/jvm/instruction/math/ISUB.java
new file mode 100644
index 0000000..8e39ccd
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/ISUB.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class ISUB extends Instruction {
+
+ public ISUB(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ int result = (int) value1.getValue() - (int) value2.getValue();
+ frame.push(new StackValue(Const.T_INT, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IUSHR.java b/src/main/java/haidnor/jvm/instruction/math/IUSHR.java
new file mode 100644
index 0000000..7f0c822
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IUSHR.java
@@ -0,0 +1,37 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+/**
+ * JVM中的IUSHR指令是用于执行无符号右移操作的指令。该指令将两个整数值从操作数栈中弹出,
+ * 然后将第一个操作数的位表示向右移动第二个操作数指定的位数,移位过程中高位用零填充。最后,将结果压入操作数栈中。
+ *
+ * 在Java虚拟机规范中,IUSHR指令的操作码为0x7C,它属于逻辑指令家族(logical instructions)。
+ * 这个指令通常需用到无符号数值在位级上的运算,因此它主要用于一些特定的计算和算法中。
+ *
+ * 需要注意的是,IUSHR指令只适用于int类型的数据。如果操作数是long类型,则需要使用LUSHR指令进行无符号右移操作。
+ */
+public class IUSHR extends Instruction {
+
+ public IUSHR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int v2 = frame.popInt();
+ int v1 = frame.popInt();
+ int s = v2 & 0x1f;
+
+ if (v1 >= 0) {
+ int ret = v1 >> s;
+ frame.pushInt(ret);
+ return;
+ }
+ int ret = (v1 >> s) + (2 << ~s);
+ frame.pushInt(ret);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/IXOR.java b/src/main/java/haidnor/jvm/instruction/math/IXOR.java
new file mode 100644
index 0000000..f6aceba
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/IXOR.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class IXOR extends Instruction {
+
+ public IXOR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ final int v2 = frame.popInt();
+ final int v1 = frame.popInt();
+ frame.pushInt(v1 ^ v2);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LADD.java b/src/main/java/haidnor/jvm/instruction/math/LADD.java
new file mode 100644
index 0000000..06bf035
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LADD.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LADD extends Instruction {
+
+ public LADD(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ long result = (long) value1.getValue() + (long) value2.getValue();
+ frame.push(new StackValue(Const.T_LONG, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LAND.java b/src/main/java/haidnor/jvm/instruction/math/LAND.java
new file mode 100644
index 0000000..06988b9
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LAND.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LAND extends Instruction {
+
+ public LAND(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long a1 = frame.popLong();
+ long a2 = frame.popLong();
+ frame.pushLong(a2 & a1);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LDIV.java b/src/main/java/haidnor/jvm/instruction/math/LDIV.java
new file mode 100644
index 0000000..fbcf6e6
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LDIV.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LDIV extends Instruction {
+
+ public LDIV(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ long result = (long) value1.getValue() / (long) value2.getValue();
+ frame.push(new StackValue(Const.T_LONG, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LMUL.java b/src/main/java/haidnor/jvm/instruction/math/LMUL.java
new file mode 100644
index 0000000..6b448eb
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LMUL.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LMUL extends Instruction {
+
+ public LMUL(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ long result = (long) value1.getValue() * (long) value2.getValue();
+ frame.push(new StackValue(Const.T_LONG, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LNEG.java b/src/main/java/haidnor/jvm/instruction/math/LNEG.java
new file mode 100644
index 0000000..385f17b
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LNEG.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LNEG extends Instruction {
+
+ public LNEG(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue stackValue = frame.pop();
+ long value = (long) stackValue.getValue();
+ long tmp = -value;
+ frame.push(new StackValue(Const.T_LONG, tmp));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LOR.java b/src/main/java/haidnor/jvm/instruction/math/LOR.java
new file mode 100644
index 0000000..024a15d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LOR.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LOR extends Instruction {
+
+ public LOR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Long v2 = frame.popLong();
+ Long v1 = frame.popLong();
+ frame.pushLong(v1 | v2);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LREM.java b/src/main/java/haidnor/jvm/instruction/math/LREM.java
new file mode 100644
index 0000000..f3afcf4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LREM.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LREM extends Instruction {
+
+ public LREM(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ long result = (long) value1.getValue() % (long) value2.getValue();
+ frame.push(new StackValue(Const.T_LONG, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LSHL.java b/src/main/java/haidnor/jvm/instruction/math/LSHL.java
new file mode 100644
index 0000000..8177ad2
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LSHL.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LSHL extends Instruction {
+
+ public LSHL(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int v2 = frame.popInt();
+ long v1 = frame.popLong();
+ int s = v2 & 0x1f;
+ long ret = v1 << s;
+ frame.pushLong(ret);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LSHR.java b/src/main/java/haidnor/jvm/instruction/math/LSHR.java
new file mode 100644
index 0000000..7837209
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LSHR.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LSHR extends Instruction {
+
+ public LSHR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ final int v2 = frame.popInt();
+ final long v1 = frame.popLong();
+ frame.pushLong(v1 >> v2);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LSUB.java b/src/main/java/haidnor/jvm/instruction/math/LSUB.java
new file mode 100644
index 0000000..e4f4229
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LSUB.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import org.apache.bcel.Const;
+
+public class LSUB extends Instruction {
+
+ public LSUB(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value2 = frame.pop();
+ StackValue value1 = frame.pop();
+ long result = (long) value1.getValue() - (long) value2.getValue();
+ frame.push(new StackValue(Const.T_LONG, result));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LUSHR.java b/src/main/java/haidnor/jvm/instruction/math/LUSHR.java
new file mode 100644
index 0000000..fbe63a9
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LUSHR.java
@@ -0,0 +1,28 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LUSHR extends Instruction {
+
+ public LUSHR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int v2 = frame.popInt();
+ long v1 = frame.popLong();
+ int s = v2 & 0x3f;
+
+ if (v1 >= 0) {
+ long ret = v1 >> s;
+ frame.pushLong(ret);
+ return;
+ }
+ long ret = (v1 >> s) + (2L << ~s);
+ frame.pushLong(ret);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/math/LXOR.java b/src/main/java/haidnor/jvm/instruction/math/LXOR.java
new file mode 100644
index 0000000..cb13220
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/math/LXOR.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.math;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LXOR extends Instruction {
+
+ public LXOR(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long v2 = frame.popLong();
+ long v1 = frame.popLong();
+ frame.pushLong(v1 ^ v2);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java b/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java
new file mode 100644
index 0000000..5a2a27a
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/ANEWARRAY.java
@@ -0,0 +1,47 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.rtda.heap.InstanceArray;
+import haidnor.jvm.rtda.heap.Klass;
+import haidnor.jvm.rtda.metaspace.Metaspace;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import haidnor.jvm.util.ConstantPoolUtil;
+import lombok.SneakyThrows;
+import org.apache.bcel.Const;
+import org.apache.bcel.classfile.ConstantClass;
+import org.apache.bcel.classfile.ConstantPool;
+import org.apache.bcel.classfile.Utility;
+
+public class ANEWARRAY extends Instruction {
+
+ private final int constantClassIndex;
+
+ public ANEWARRAY(CodeStream codeStream) {
+ super(codeStream);
+ this.constantClassIndex = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ ConstantPool constantPool = frame.getConstantPool();
+ ConstantPoolUtil constantPoolUtil = frame.getConstantPoolUtil();
+ ConstantClass constantClass = constantPool.getConstant(constantClassIndex);
+ String className = constantPoolUtil.getClassName(constantClass);
+
+ Klass klass = Metaspace.getJavaClass(Utility.compactClassName(className));
+ if (klass == null) {
+ // 如果在元空间中找不到已加载的类,则开始进行类加载流程
+ klass = frame.getMetaClass().getClassLoader().loadClass(className);
+ }
+ int size = frame.popInt();
+ Instance[] items = new Instance[size];
+ InstanceArray instanceArray = new InstanceArray(klass, items);
+
+ frame.push(new StackValue(Const.T_OBJECT, instanceArray));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java b/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java
new file mode 100644
index 0000000..4d245df
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/ARRAYLENGTH.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.ArrayInstance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+public class ARRAYLENGTH extends Instruction {
+
+ public ARRAYLENGTH(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ ArrayInstance array = (ArrayInstance) frame.popRef();
+ frame.pushInt(array.size);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/CHECKCAST.java b/src/main/java/haidnor/jvm/instruction/references/CHECKCAST.java
new file mode 100644
index 0000000..15a4874
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/CHECKCAST.java
@@ -0,0 +1,24 @@
+
+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 CHECKCAST extends Instruction {
+
+ private final int constantClassIndex;
+
+ public CHECKCAST(CodeStream codeStream) {
+ super(codeStream);
+ this.constantClassIndex = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ // 暂时不支持
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java b/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java
new file mode 100644
index 0000000..edd13d7
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/GETFIELD.java
@@ -0,0 +1,52 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.rtda.heap.KlassField;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import haidnor.jvm.util.ConstantPoolUtil;
+import lombok.SneakyThrows;
+
+public class GETFIELD extends Instruction {
+
+ private final int constantFieldrefIndex;
+
+ public GETFIELD(CodeStream codeStream) {
+ super(codeStream);
+ this.constantFieldrefIndex = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ ConstantPoolUtil constantPool = frame.getConstantPoolUtil();
+ String filedName = constantPool.getFieldName(constantFieldrefIndex);
+ String fieldSignature = constantPool.getFieldSignature(constantFieldrefIndex);
+
+ Instance instanceRef = frame.popRef();
+ KlassField field = instanceRef.getField(filedName, fieldSignature);
+ switch (field.descriptor) {
+ case "Z":
+ case "C":
+ case "B":
+ case "S":
+ case "I":
+ frame.pushInt((int) field.getValue());
+ break;
+ case "J":
+ frame.pushLong((long) field.getValue());
+ break;
+ case "F":
+ frame.pushFloat((float) field.getValue());
+ break;
+ case "D":
+ frame.pushDouble((double) field.getValue());
+ break;
+ default: // ref
+ frame.pushRef(field.getValue());
+ break;
+ }
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java b/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java
new file mode 100644
index 0000000..46fcf0e
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/GETSTATIC.java
@@ -0,0 +1,46 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import haidnor.jvm.util.ConstantPoolUtil;
+import lombok.SneakyThrows;
+import org.apache.bcel.Const;
+import org.apache.bcel.classfile.ConstantFieldref;
+import org.apache.bcel.classfile.ConstantPool;
+
+import java.lang.reflect.Field;
+
+/**
+ * 获取字段符号引用指定的对象或者值(类的静态字段 static 修饰),并将其压入操作数栈
+ */
+public class GETSTATIC extends Instruction {
+
+ private final int constantFieldrefIndex;
+
+ public GETSTATIC(CodeStream codeStream) {
+ super(codeStream);
+ this.constantFieldrefIndex = codeStream.readUnsignedShort(this);
+ }
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ ConstantPool constantPool = frame.getConstantPool();
+ ConstantPoolUtil constantPoolUtil = frame.getConstantPoolUtil();
+ ConstantFieldref constFieldref = constantPool.getConstant(constantFieldrefIndex);
+ // 动态链接. 找到字段所属的 Java 类
+ String className = constantPoolUtil.getFiledBelongClassName(constFieldref);
+ // 动态链接. 找到字段的名字
+ String fieldName = constantPoolUtil.getFieldName(constFieldref);
+
+ // 以上代码体现了动态链接.Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池里指向方法的符号引用作为参数.
+
+ Class> clazz = Class.forName(className.replace('/', '.'));
+ Field field = clazz.getField(fieldName);
+ Object staticFiledValue = field.get(null); // 获取静态字段上的值
+
+ frame.push(new StackValue(Const.T_OBJECT, staticFiledValue));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java b/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java
new file mode 100644
index 0000000..0c7b8c3
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/INVOKESPECIAL.java
@@ -0,0 +1,87 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.classloader.ClassLoader;
+import haidnor.jvm.core.JavaExecutionEngine;
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Klass;
+import haidnor.jvm.rtda.heap.KlassMethod;
+import haidnor.jvm.rtda.metaspace.Metaspace;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import haidnor.jvm.util.ConstantPoolUtil;
+import haidnor.jvm.util.SignatureUtil;
+import lombok.SneakyThrows;
+import org.apache.bcel.Const;
+import org.apache.bcel.classfile.*;
+
+/**
+ * 调用一些需要特殊处理的实例方法,包括构造器方法,私有方法,父类方法,这些方法都是静态绑定的,不会在调用时进行动态分配
+ */
+public class INVOKESPECIAL extends Instruction {
+
+ private final int constantMethodrefIndex;
+
+ public INVOKESPECIAL(CodeStream codeStream) {
+ super(codeStream);
+ this.constantMethodrefIndex = codeStream.readUnsignedShort(this);
+ }
+
+ @SneakyThrows
+ @Override
+ public void execute(Frame frame) {
+ ConstantPool constantPool = frame.getConstantPool();
+ ConstantPoolUtil constantPoolUtil = frame.getConstantPoolUtil();
+ ConstantMethodref methodref = constantPool.getConstant(constantMethodrefIndex);
+
+ String className = constantPoolUtil.getBelongClassName(methodref);
+ String methodName = constantPoolUtil.getMethodName(methodref);
+ String methodSignature = constantPoolUtil.getMethodSignature(methodref);
+
+ Klass klass = Metaspace.getJavaClass(Utility.compactClassName(className));
+ JavaClass javaClass;
+ if (klass != null) {
+ javaClass = klass.getJavaClass();
+ } else {
+ ClassLoader classLoader = frame.getMetaClass().getClassLoader();
+ klass = classLoader.loadClass(className);
+ javaClass = klass.getJavaClass();
+ }
+
+ if (className.startsWith("java/")) {
+ // 执行 RT.jar 中 Java 对象构造方法的时候创建java对象
+ if (methodName.equals("
+ * JSR指令的操作码为0xA8,属于控制指令家族(Control Instructions)。它的操作数是一个16位的无符号偏移量,用于表示跳转目标的字节码偏移量。
+ *
+ * 使用JSR指令可以实现方法的调用和返回,但在实际的Java字节码中,更常见的是使用invokestatic、invokevirtual等指令来进行方法调用。
+ *
+ * 需要注意的是,JSR指令只在早期版本的Java虚拟机规范中存在,在Java SE 6及以后的版本中已被废弃,并且不建议在新的Java代码中使用。
+ */
+public class JSR extends Instruction {
+
+ public JSR(CodeStream codeStream) {
+ super(codeStream);
+ throw new UnsupportedOperationException("JSR");
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ throw new UnsupportedOperationException("JSR");
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/JSR_W.java b/src/main/java/haidnor/jvm/instruction/references/JSR_W.java
new file mode 100644
index 0000000..09513e8
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/JSR_W.java
@@ -0,0 +1,26 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+/**
+ * 在早期版本的Java虚拟机规范中,存在JSR和JSR_W两个指令。其中,JSR指令用于进行子程序调用,而JSR_W指令用于进行宽跳转的子程序调用。宽跳转指令可以用于在字节码中的跳转偏移量超过16位时进行有效的跳转。
+ *
+ * 然而,从Java SE 6及以后的版本开始,Java虚拟机规范已废弃了JSR_W指令,并且不建议在新的Java代码中使用。而是通过其他方式来实现跳转,例如使用ldc_w、ldc2_w和goto_w等指令结合进行宽跳转。
+ */
+public class JSR_W extends Instruction {
+
+ public JSR_W(CodeStream codeStream) {
+ super(codeStream);
+ throw new UnsupportedOperationException("JSR_W");
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ throw new UnsupportedOperationException("JSR");
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/NEW.java b/src/main/java/haidnor/jvm/instruction/references/NEW.java
new file mode 100644
index 0000000..59a7c6f
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/NEW.java
@@ -0,0 +1,48 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.rtda.heap.Klass;
+import haidnor.jvm.rtda.metaspace.Metaspace;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import haidnor.jvm.util.ConstantPoolUtil;
+import lombok.SneakyThrows;
+import org.apache.bcel.Const;
+import org.apache.bcel.classfile.ConstantClass;
+import org.apache.bcel.classfile.ConstantPool;
+import org.apache.bcel.classfile.Utility;
+
+public class NEW extends Instruction {
+
+ private final int constantClassIndex;
+
+ public NEW(CodeStream codeStream) {
+ super(codeStream);
+ this.constantClassIndex = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ ConstantPool constantPool = frame.getConstantPool();
+ ConstantPoolUtil constantPoolUtil = frame.getConstantPoolUtil();
+ ConstantClass constantClass = constantPool.getConstant(constantClassIndex);
+ String className = constantPoolUtil.getClassName(constantClass);
+
+ if (className.startsWith("java/")) {
+ frame.push(new StackValue(Const.T_OBJECT, null));
+ return;
+ }
+
+ Klass klass = Metaspace.getJavaClass(Utility.compactClassName(className));
+ if (klass == null) {
+ // 如果在元空间中找不到已加载的类,则开始进行类加载流程
+ klass = frame.getMetaClass().getClassLoader().loadClass(className);
+ }
+ Instance instance = klass.newInstance();
+ frame.push(new StackValue(Const.T_OBJECT, instance));
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java b/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java
new file mode 100644
index 0000000..5c0a3e8
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/NEWARRAY.java
@@ -0,0 +1,53 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+import org.apache.bcel.Const;
+
+public class NEWARRAY extends Instruction {
+
+ private final int type;
+
+ public NEWARRAY(CodeStream codeStream) {
+ super(codeStream);
+ this.type = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ int size = frame.popInt();
+ switch (type) {
+ case Const.T_BOOLEAN -> {
+ frame.pushRef(BasicTypeArray.boolArray(size));
+ }
+ case Const.T_CHAR -> {
+ frame.pushRef(BasicTypeArray.charArray(size));
+ }
+ case Const.T_FLOAT -> {
+ frame.pushRef(BasicTypeArray.floatArray(size));
+ }
+ case Const.T_DOUBLE -> {
+ frame.pushRef(BasicTypeArray.doubleArray(size));
+ }
+ case Const.T_BYTE -> {
+ frame.pushRef(BasicTypeArray.byteArray(size));
+ }
+ case Const.T_SHORT -> {
+ frame.pushRef(BasicTypeArray.shortArray(size));
+ }
+ case Const.T_INT -> {
+ frame.pushRef(BasicTypeArray.intArray(size));
+ }
+ case Const.T_LONG -> {
+ frame.pushRef(BasicTypeArray.longArray(size));
+ }
+ default -> throw new IllegalArgumentException();
+ }
+
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java b/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java
new file mode 100644
index 0000000..9866e36
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/references/PUTFIELD.java
@@ -0,0 +1,35 @@
+package haidnor.jvm.instruction.references;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.rtda.heap.KlassField;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import haidnor.jvm.util.ConstantPoolUtil;
+import lombok.SneakyThrows;
+
+public class PUTFIELD extends Instruction {
+
+ private final int constantFieldrefIndex;
+
+ public PUTFIELD(CodeStream codeStream) {
+ super(codeStream);
+ this.constantFieldrefIndex = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ ConstantPoolUtil constantPool = frame.getConstantPoolUtil();
+ String filedName = constantPool.getFieldName(constantFieldrefIndex);
+ String fieldSignature = constantPool.getFieldSignature(constantFieldrefIndex);
+
+ StackValue stackValue = frame.pop();
+
+ Instance instance = frame.popRef();
+ KlassField field = instance.getField(filedName, fieldSignature);
+ field.setVal(stackValue);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/DUP.java b/src/main/java/haidnor/jvm/instruction/stack/DUP.java
new file mode 100644
index 0000000..e29a03b
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/DUP.java
@@ -0,0 +1,27 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+public class DUP extends Instruction {
+
+ public DUP(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ StackValue stackValue = frame.pop();
+
+ // 判空是为了兼容创建 Java 对象, 创建rt.jar java对象时,执行 NEW 指令会在栈帧中存放一个 NULL
+ if (stackValue.getValue() != null) {
+ frame.push(stackValue);
+ frame.push(stackValue);
+ }
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/DUP2.java b/src/main/java/haidnor/jvm/instruction/stack/DUP2.java
new file mode 100644
index 0000000..ea7e3dd
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/DUP2.java
@@ -0,0 +1,41 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+/**
+ * DUP2指令是一条Java虚拟机指令,用于复制栈顶两个元素,并将复制的值插入到栈顶之后。
+ *
+ * DUP2指令有以下几种形式:
+ *
+ * 栈顶元素为A的情况:
+ *
+ * 执行DUP2指令后,栈的状态变为:A(副本)、A。
+ * 栈顶元素为A和B的情况:
+ *
+ * 执行DUP2指令后,栈的状态变为:A(副本)、B、A、B。
+ * 需要注意的是,在执行DUP2指令时,操作数栈必须至少有一个或两个元素,具体取决于栈顶元素的数量。如果栈顶元素只有一个,则只会复制该元素一次;如果栈顶元素有两个,则会分别复制两个元素。
+ *
+ * 在Java虚拟机规范中,DUP2指令的操作码为0x5C,也属于堆栈管理指令家族(Stack Management Instructions)。
+ */
+public class DUP2 extends Instruction {
+
+ public DUP2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ StackValue stackValue1 = frame.pop();
+ StackValue stackValue2 = frame.pop();
+ frame.push(stackValue2);
+ frame.push(stackValue1);
+ frame.push(stackValue2);
+ frame.push(stackValue1);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/DUP_X1.java b/src/main/java/haidnor/jvm/instruction/stack/DUP_X1.java
new file mode 100644
index 0000000..6829c32
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/DUP_X1.java
@@ -0,0 +1,36 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+/**
+ * DUP_X1指令是一条Java虚拟机指令,用于复制栈顶元素并插入到栈顶下面的第二个元素位置。
+ *
+ * 具体而言,DUP_X1指令的作用是将栈顶元素复制一份,并将复制出的值插入到栈顶下面的第二个元素位置。这种操作会在栈上产生一个额外的副本,栈的深度会增加1。
+ *
+ * 例如,如果栈顶是A,下面的两个元素是B和C,执行DUP_X1指令后,栈的状态将变为:A(副本)、B、C、A。
+ *
+ * 在Java虚拟机规范中,DUP_X1指令的操作码为0x5A,属于堆栈管理指令家族(Stack Management Instructions)。
+ *
+ * 需要注意的是,执行DUP_X1指令时,操作数栈必须至少有两个元素,否则指令无法正常执行。
+ */
+public class DUP_X1 extends Instruction {
+
+ public DUP_X1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ StackValue stackValue1 = frame.pop();
+ StackValue stackValue2 = frame.pop();
+ frame.push(stackValue1);
+ frame.push(stackValue2);
+ frame.push(stackValue1);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/DUP_X2.java b/src/main/java/haidnor/jvm/instruction/stack/DUP_X2.java
new file mode 100644
index 0000000..e8430a3
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/DUP_X2.java
@@ -0,0 +1,47 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+/**
+ * DUP_X2指令是一条Java虚拟机指令,用于复制栈顶元素并插入到栈顶下面的第三个元素位置。
+ *
+ * 具体而言,DUP_X2指令的作用是将栈顶元素复制一份,并将复制出的值插入到栈顶下面的第三个元素位置。这种操作会在栈上产生一个额外的副本,栈的深度会增加1。
+ *
+ * 根据栈顶元素以及其后面的元素数量,DUP_X2指令有三种不同的形式:
+ *
+ * 栈顶元素为A,下面两个元素为B和C的情况:
+ *
+ * 执行DUP_X2指令后,栈的状态变为:A(副本)、B、C、A。
+ * 栈顶元素为A,下面三个元素为B、C和D的情况:
+ *
+ * 执行DUP_X2指令后,栈的状态变为:A(副本)、B、C、D、A。
+ * 栈顶元素为A,下面一个元素为B的情况:
+ *
+ * 执行DUP_X2指令后,栈的状态变为:A(副本)、B、A。
+ * 在Java虚拟机规范中,DUP_X2指令的操作码为0x5C,也属于堆栈管理指令家族(Stack Management Instructions)。
+ *
+ * 需要注意的是,执行DUP_X2指令时,操作数栈必须至少有两个或三个元素,具体取决于栈顶元素和其后面的元素的数量,否则指令无法正常执行。
+ */
+public class DUP_X2 extends Instruction {
+
+ public DUP_X2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ StackValue stackValue1 = frame.pop();
+ StackValue stackValue2 = frame.pop();
+ StackValue stackValue3 = frame.pop();
+ frame.push(stackValue1);
+ frame.push(stackValue3);
+ frame.push(stackValue2);
+ frame.push(stackValue1);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/POP.java b/src/main/java/haidnor/jvm/instruction/stack/POP.java
new file mode 100644
index 0000000..3543f15
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/POP.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+public class POP extends Instruction {
+
+ public POP(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ frame.pop();
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/POP2.java b/src/main/java/haidnor/jvm/instruction/stack/POP2.java
new file mode 100644
index 0000000..289ae75
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/POP2.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+public class POP2 extends Instruction {
+
+ public POP2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ frame.pop();
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stack/SWAP.java b/src/main/java/haidnor/jvm/instruction/stack/SWAP.java
new file mode 100644
index 0000000..3cd35d1
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stack/SWAP.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.stack;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+import lombok.SneakyThrows;
+
+public class SWAP extends Instruction {
+
+ public SWAP(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ @SneakyThrows
+ public void execute(Frame frame) {
+ Instance v2 = frame.popRef();
+ Instance v1 = frame.popRef();
+ frame.pushRef(v2);
+ frame.pushRef(v1);
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java
new file mode 100644
index 0000000..bc17d68
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/AASTORE.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.rtda.heap.InstanceArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class AASTORE extends Instruction {
+
+ public AASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ Instance val = frame.popRef();
+ int index = frame.popInt();
+ InstanceArray array = (InstanceArray) frame.popRef();
+ array.items[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/ASTORE.java
new file mode 100644
index 0000000..f8dfa7d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ASTORE.java
@@ -0,0 +1,24 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ASTORE extends Instruction {
+
+ private final int index;
+
+ public ASTORE(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetRef(index, (Instance) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ASTORE_0.java b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_0.java
new file mode 100644
index 0000000..19d39ad
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_0.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ASTORE_0 extends Instruction {
+
+ public ASTORE_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetRef(0, (Instance) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ASTORE_1.java b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_1.java
new file mode 100644
index 0000000..14faefe
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_1.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ASTORE_1 extends Instruction {
+
+ public ASTORE_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetRef(1, value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ASTORE_2.java b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_2.java
new file mode 100644
index 0000000..c04efc9
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_2.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ASTORE_2 extends Instruction {
+
+ public ASTORE_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetRef(2, value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ASTORE_3.java b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_3.java
new file mode 100644
index 0000000..0ea75d6
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ASTORE_3.java
@@ -0,0 +1,21 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ASTORE_3 extends Instruction {
+
+ public ASTORE_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetRef(3, (Instance) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java
new file mode 100644
index 0000000..d92693a
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/BASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class BASTORE extends Instruction {
+
+ public BASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int val = frame.popInt();
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.ints[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java
new file mode 100644
index 0000000..5677d74
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/CASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class CASTORE extends Instruction {
+
+ public CASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int val = frame.popInt();
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.ints[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java
new file mode 100644
index 0000000..ab3dac1
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/DASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class DASTORE extends Instruction {
+
+ public DASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ double val = frame.popDouble();
+ int index = frame.popInt();
+ final BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.doubles[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/DSTORE.java b/src/main/java/haidnor/jvm/instruction/stores/DSTORE.java
new file mode 100644
index 0000000..a6f18d9
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/DSTORE.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class DSTORE extends Instruction {
+
+ private final int index;
+
+ public DSTORE(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetDouble(index, (double) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/DSTORE_0.java b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_0.java
new file mode 100644
index 0000000..e3e188b
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_0.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class DSTORE_0 extends Instruction {
+
+ public DSTORE_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetDouble(0, (double) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/DSTORE_1.java b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_1.java
new file mode 100644
index 0000000..9e9aad3
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_1.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class DSTORE_1 extends Instruction {
+
+ public DSTORE_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetDouble(1, (double) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/DSTORE_2.java b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_2.java
new file mode 100644
index 0000000..943ce56
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_2.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class DSTORE_2 extends Instruction {
+
+ public DSTORE_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetDouble(2, (double) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/DSTORE_3.java b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_3.java
new file mode 100644
index 0000000..874ecff
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/DSTORE_3.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class DSTORE_3 extends Instruction {
+
+ public DSTORE_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetDouble(3, (double) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java
new file mode 100644
index 0000000..d172a64
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/FASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class FASTORE extends Instruction {
+
+ public FASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ float val = frame.popFloat();
+ int index = frame.popInt();
+ final BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.floats[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/FSTORE.java b/src/main/java/haidnor/jvm/instruction/stores/FSTORE.java
new file mode 100644
index 0000000..354aabd
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/FSTORE.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class FSTORE extends Instruction {
+
+ private final int index;
+
+ public FSTORE(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetFloat(index, (float) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/FSTORE_0.java b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_0.java
new file mode 100644
index 0000000..9f3d662
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_0.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class FSTORE_0 extends Instruction {
+
+ public FSTORE_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetFloat(0, (float) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/FSTORE_1.java b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_1.java
new file mode 100644
index 0000000..39a02d4
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_1.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class FSTORE_1 extends Instruction {
+
+ public FSTORE_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetFloat(1, (float) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/FSTORE_2.java b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_2.java
new file mode 100644
index 0000000..93c878d
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_2.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class FSTORE_2 extends Instruction {
+
+ public FSTORE_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetFloat(2, (float) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/FSTORE_3.java b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_3.java
new file mode 100644
index 0000000..2fbc978
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/FSTORE_3.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class FSTORE_3 extends Instruction {
+
+ public FSTORE_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetFloat(3, (float) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java
new file mode 100644
index 0000000..62a5804
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/IASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class IASTORE extends Instruction {
+
+ public IASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int val = frame.popInt();
+ int index = frame.popInt();
+ final BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.ints[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ISTORE.java b/src/main/java/haidnor/jvm/instruction/stores/ISTORE.java
new file mode 100644
index 0000000..20095e2
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ISTORE.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ISTORE extends Instruction {
+
+ private final int index;
+
+ public ISTORE(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedShort(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetInt(index, (int) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ISTORE_0.java b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_0.java
new file mode 100644
index 0000000..34b1c45
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_0.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ISTORE_0 extends Instruction {
+
+ public ISTORE_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetInt(0, (int) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ISTORE_1.java b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_1.java
new file mode 100644
index 0000000..d48c064
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_1.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ISTORE_1 extends Instruction {
+
+ public ISTORE_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetInt(1, (int) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ISTORE_2.java b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_2.java
new file mode 100644
index 0000000..166bc3a
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_2.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ISTORE_2 extends Instruction {
+
+ public ISTORE_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetInt(2, (int) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/ISTORE_3.java b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_3.java
new file mode 100644
index 0000000..7e9fe6e
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/ISTORE_3.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class ISTORE_3 extends Instruction {
+
+ public ISTORE_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetInt(3, (int) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java
new file mode 100644
index 0000000..273fa56
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/LASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class LASTORE extends Instruction {
+
+ public LASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ long val = frame.popLong();
+ int index = frame.popInt();
+ final BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.longs[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/LSTORE.java b/src/main/java/haidnor/jvm/instruction/stores/LSTORE.java
new file mode 100644
index 0000000..764dbfd
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/LSTORE.java
@@ -0,0 +1,23 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class LSTORE extends Instruction {
+
+ private final int index;
+
+ public LSTORE(CodeStream codeStream) {
+ super(codeStream);
+ this.index = codeStream.readUnsignedByte(this);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetLong(index, (long) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/LSTORE_0.java b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_0.java
new file mode 100644
index 0000000..2c5711a
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_0.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class LSTORE_0 extends Instruction {
+
+ public LSTORE_0(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetLong(0, (long) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/LSTORE_1.java b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_1.java
new file mode 100644
index 0000000..3b3d390
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_1.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class LSTORE_1 extends Instruction {
+
+ public LSTORE_1(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetLong(1, (long) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/LSTORE_2.java b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_2.java
new file mode 100644
index 0000000..e993b72
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_2.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class LSTORE_2 extends Instruction {
+
+ public LSTORE_2(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetLong(2, (long) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/LSTORE_3.java b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_3.java
new file mode 100644
index 0000000..eb4cb25
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/LSTORE_3.java
@@ -0,0 +1,20 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.runtime.StackValue;
+import haidnor.jvm.util.CodeStream;
+
+public class LSTORE_3 extends Instruction {
+
+ public LSTORE_3(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ StackValue value = frame.pop();
+ frame.slotSetLong(3, (long) value.getValue());
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java b/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java
new file mode 100644
index 0000000..00b8bbd
--- /dev/null
+++ b/src/main/java/haidnor/jvm/instruction/stores/SASTORE.java
@@ -0,0 +1,22 @@
+package haidnor.jvm.instruction.stores;
+
+import haidnor.jvm.instruction.Instruction;
+import haidnor.jvm.rtda.heap.BasicTypeArray;
+import haidnor.jvm.runtime.Frame;
+import haidnor.jvm.util.CodeStream;
+
+public class SASTORE extends Instruction {
+
+ public SASTORE(CodeStream codeStream) {
+ super(codeStream);
+ }
+
+ @Override
+ public void execute(Frame frame) {
+ int val = frame.popInt();
+ int index = frame.popInt();
+ BasicTypeArray array = (BasicTypeArray) frame.popRef();
+ array.ints[index] = val;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/rtda/UnionSlot.java b/src/main/java/haidnor/jvm/rtda/UnionSlot.java
new file mode 100644
index 0000000..adf9761
--- /dev/null
+++ b/src/main/java/haidnor/jvm/rtda/UnionSlot.java
@@ -0,0 +1,103 @@
+package haidnor.jvm.rtda;
+
+import haidnor.jvm.rtda.heap.Instance;
+import haidnor.jvm.runtime.Slot;
+
+/**
+ * 用于字段的联合 Slot
+ */
+public class UnionSlot {
+
+ private Slot high;
+ private Slot low;
+
+ private UnionSlot(Slot high, Slot low) {
+ this.high = high;
+ this.low = low;
+ }
+
+ // 初始化
+ public static UnionSlot of(Slot high, Slot low) {
+ return new UnionSlot(high, low);
+ }
+
+ public static UnionSlot of(Slot high) {
+ return new UnionSlot(high, null);
+ }
+
+ public static UnionSlot of(Instance instance) {
+ return new UnionSlot(new Slot(instance), null);
+ }
+
+ public static UnionSlot of(int val) {
+ return new UnionSlot(new Slot(val), null);
+ }
+
+ public static UnionSlot of(float val) {
+ return of(Float.floatToIntBits(val));
+ }
+
+ public static UnionSlot of(long val) {
+ int high = (int) (val >> 32); //高32位
+ int low = (int) (val & 0x000000ffffffffL); //低32位
+ return new UnionSlot(new Slot(high), new Slot(low));
+ }
+
+ public static UnionSlot of(double val) {
+ return of(Double.doubleToLongBits(val));
+ }
+
+ // 存
+ public void setRef(Instance val) {
+ high.ref = val;
+ }
+
+ public void setInt(int val) {
+ high.num = val;
+ }
+
+ public void setFloat(float val) {
+ setInt(Float.floatToIntBits(val));
+ }
+
+ public void setLong(long val) {
+ int highV = (int) (val >> 32); //高32位
+ int lowV = (int) (val & 0x000000ffffffffL); //低32位
+ high.num = highV;
+ low.num = lowV;
+ }
+
+ public void setDouble(double val) {
+ setLong(Double.doubleToLongBits(val));
+ }
+
+ public void set(UnionSlot neo) {
+ this.high = neo.high;
+ this.low = neo.low;
+ }
+
+ // 取
+ public Object getRef() {
+ return high.ref;
+ }
+
+ public int getInt() {
+ return high.num;
+ }
+
+ public float getFloat() {
+ return Float.intBitsToFloat(getInt());
+ }
+
+ public long getLong() {
+ final int high = this.high.num;
+ final int low = this.low.num;
+ long l1 = (high & 0x000000ffffffffL) << 32;
+ long l2 = low & 0x00000000ffffffffL;
+ return l1 | l2;
+ }
+
+ public double getDouble() {
+ return Double.longBitsToDouble(getLong());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/haidnor/jvm/rtda/heap/ArrayInstance.java b/src/main/java/haidnor/jvm/rtda/heap/ArrayInstance.java
new file mode 100644
index 0000000..53e00fc
--- /dev/null
+++ b/src/main/java/haidnor/jvm/rtda/heap/ArrayInstance.java
@@ -0,0 +1,12 @@
+package haidnor.jvm.rtda.heap;
+
+public abstract class ArrayInstance extends Instance {
+
+ public final int size;
+
+ public ArrayInstance(Klass klass, int size) {
+ super(klass);
+ this.size = size;
+ }
+
+}
diff --git a/src/main/java/haidnor/jvm/rtda/heap/BasicTypeArray.java b/src/main/java/haidnor/jvm/rtda/heap/BasicTypeArray.java
new file mode 100644
index 0000000..41ced9a
--- /dev/null
+++ b/src/main/java/haidnor/jvm/rtda/heap/BasicTypeArray.java
@@ -0,0 +1,62 @@
+package haidnor.jvm.rtda.heap;
+
+public class BasicTypeArray extends ArrayInstance {
+
+ public int[] ints;
+ public long[] longs;
+ public float[] floats;
+ public double[] doubles;
+
+ private BasicTypeArray(int size) {
+ super(null, size);
+ }
+
+ public static BasicTypeArray charArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.ints = new int[size];
+ return array;
+ }
+
+ public static BasicTypeArray boolArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.ints = new int[size];
+ return array;
+ }
+
+ public static BasicTypeArray byteArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.ints = new int[size];
+ return array;
+ }
+
+ public static BasicTypeArray shortArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.ints = new int[size];
+ return array;
+ }
+
+ public static BasicTypeArray intArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.ints = new int[size];
+ return array;
+ }
+
+ public static BasicTypeArray longArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.longs = new long[size];
+ return array;
+ }
+
+ public static BasicTypeArray floatArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.floats = new float[size];
+ return array;
+ }
+
+ public static BasicTypeArray doubleArray(int size) {
+ final BasicTypeArray array = new BasicTypeArray(size);
+ array.doubles = new double[size];
+ return array;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/haidnor/jvm/rtda/heap/Heap.java b/src/main/java/haidnor/jvm/rtda/heap/Heap.java
new file mode 100644
index 0000000..ca3a372
--- /dev/null
+++ b/src/main/java/haidnor/jvm/rtda/heap/Heap.java
@@ -0,0 +1,7 @@
+package haidnor.jvm.rtda.heap;
+
+/**
+ * 堆空间
+ */
+public class Heap {
+}
diff --git a/src/main/java/haidnor/jvm/rtda/heap/Instance.java b/src/main/java/haidnor/jvm/rtda/heap/Instance.java
new file mode 100644
index 0000000..ee67354
--- /dev/null
+++ b/src/main/java/haidnor/jvm/rtda/heap/Instance.java
@@ -0,0 +1,67 @@
+package haidnor.jvm.rtda.heap;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * JVM 中的 Java 对象实例
+ */
+public class Instance {
+
+ public final Klass klass;
+
+ public final List
+ * <<深入理解JAVA虚拟机>>:
+ * 每一个栈帧都包含一个指向运行时常量池中该栈帧所属的方法引用,持有这个引用的目的是为了支持方法调用过程中的动态链接(Dynamic Linking)
+ */
+ private final org.apache.bcel.classfile.Method method;
+
+ private final KlassMethod klassMethod;
+
+ public final Klass aKlass;
+
+ /**
+ * 栈帧所属的方法代码对象
+ */
+ private final Code code;
+
+ private final CodeStream codeStream;
+
+ private final ConstantPool constantPool;
+
+ private final ConstantPoolUtil constantPoolUtil;
+
+ /**
+ * 操作数栈
+ */
+ private final Stack