Run-time Data Area
This commit is contained in:
parent
4f24288e20
commit
716f2c9ad2
@ -2,6 +2,9 @@ package com.gabongao.jvm;
|
|||||||
|
|
||||||
import com.gabongao.jvm.classfile.ClassFile;
|
import com.gabongao.jvm.classfile.ClassFile;
|
||||||
import com.gabongao.jvm.classpath.ClassPath;
|
import com.gabongao.jvm.classpath.ClassPath;
|
||||||
|
import com.gabongao.jvm.rtda.Frame;
|
||||||
|
import com.gabongao.jvm.rtda.LocalVars;
|
||||||
|
import com.gabongao.jvm.rtda.OperandStack;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -64,6 +67,8 @@ public class Jvm {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* ch03
|
||||||
ClassPath cp = new ClassPath();
|
ClassPath cp = new ClassPath();
|
||||||
cp.parse(cmd.jreOption, cmd.cpOption);
|
cp.parse(cmd.jreOption, cmd.cpOption);
|
||||||
String className = cmd.className.replace(".", "/").concat(".class");
|
String className = cmd.className.replace(".", "/").concat(".class");
|
||||||
@ -90,7 +95,51 @@ public class Jvm {
|
|||||||
for (int i = 0; i < classFile.getMethods().length; i++) {
|
for (int i = 0; i < classFile.getMethods().length; i++) {
|
||||||
System.out.printf("\t\t%s\n", classFile.getMethods()[i].getName());
|
System.out.printf("\t\t%s\n", classFile.getMethods()[i].getName());
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
Frame frame = new Frame(100, 100);
|
||||||
|
testLocalVars(frame.getLocalVars());
|
||||||
|
testOperandStack(frame.getOperandStack());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void testLocalVars(LocalVars localVars) {
|
||||||
|
localVars.setInt(0, 100);
|
||||||
|
localVars.setInt(1, -100);
|
||||||
|
localVars.setInt(2, -100000);
|
||||||
|
localVars.setLong(3, 2997924580L);
|
||||||
|
localVars.setLong(5, -2997924580L);
|
||||||
|
localVars.setFloat(7, 3.1415926f);
|
||||||
|
localVars.setDouble(8, -2.7814897347028520974);
|
||||||
|
localVars.setRef(10, null);
|
||||||
|
System.out.println(localVars.getInt(0));
|
||||||
|
System.out.println(localVars.getInt(1));
|
||||||
|
System.out.println(localVars.getInt(2));
|
||||||
|
System.out.println(localVars.getLong(3));
|
||||||
|
System.out.println(localVars.getLong(5));
|
||||||
|
System.out.println(localVars.getFloat(7));
|
||||||
|
System.out.println(localVars.getDouble(8));
|
||||||
|
System.out.println(localVars.getRef(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void testOperandStack(OperandStack operandStack) {
|
||||||
|
operandStack.pushInt(100);
|
||||||
|
operandStack.pushInt(-100);
|
||||||
|
operandStack.pushInt(-100000);
|
||||||
|
operandStack.pushLong(2997924580L);
|
||||||
|
operandStack.pushLong(-2997924580L);
|
||||||
|
operandStack.pushFloat(3.1415926f);
|
||||||
|
operandStack.pushDouble(-2.7814897347028520974);
|
||||||
|
operandStack.pushRef(null);
|
||||||
|
System.out.println(operandStack.popRef());
|
||||||
|
System.out.println(operandStack.popDouble());
|
||||||
|
System.out.println(operandStack.popFloat());
|
||||||
|
System.out.println(operandStack.popLong());
|
||||||
|
System.out.println(operandStack.popLong());
|
||||||
|
System.out.println(operandStack.popInt());
|
||||||
|
System.out.println(operandStack.popInt());
|
||||||
|
System.out.println(operandStack.popInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
60
src/com/gabongao/jvm/rtda/Frame.java
Normal file
60
src/com/gabongao/jvm/rtda/Frame.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class Frame {
|
||||||
|
private Frame lower;
|
||||||
|
private LocalVars localVars;
|
||||||
|
private OperandStack operandStack;
|
||||||
|
|
||||||
|
public Frame(int maxLocals, int maxStack) {
|
||||||
|
localVars = new LocalVars(maxLocals);
|
||||||
|
operandStack = new OperandStack(maxStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalVars getLocalVars() {
|
||||||
|
return localVars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperandStack getOperandStack() {
|
||||||
|
return operandStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
Frame getLower() {
|
||||||
|
return lower;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setLower(Frame lower) {
|
||||||
|
this.lower = lower;
|
||||||
|
}
|
||||||
|
}
|
||||||
93
src/com/gabongao/jvm/rtda/LocalVars.java
Normal file
93
src/com/gabongao/jvm/rtda/LocalVars.java
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class LocalVars {
|
||||||
|
private Slot[] slots;
|
||||||
|
|
||||||
|
LocalVars(int maxLocals) {
|
||||||
|
if (maxLocals > 0) {
|
||||||
|
slots = new Slot[maxLocals];
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("LocalVars Count Error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInt(int index, int val) {
|
||||||
|
slots[index] = new Slot();
|
||||||
|
slots[index].setNum(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInt(int index) {
|
||||||
|
return slots[index].getNum();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFloat(int index, float val) {
|
||||||
|
slots[index] = new Slot();
|
||||||
|
slots[index].setNum(Float.floatToRawIntBits(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getFloat(int index) {
|
||||||
|
return Float.intBitsToFloat(slots[index].getNum());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLong(int index, long val) {
|
||||||
|
slots[index] = new Slot();
|
||||||
|
slots[index].setNum((int) val);
|
||||||
|
slots[index + 1] = new Slot();
|
||||||
|
slots[index + 1].setNum((int) (val >> 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLong(int index) {
|
||||||
|
int low = slots[index].getNum();
|
||||||
|
int high = slots[index + 1].getNum();
|
||||||
|
return ((((long) high) << 32) & 0xffffffff00000000L) | (((long) low) & 0x00000000ffffffffL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRef(int index, Object ref) {
|
||||||
|
slots[index] = new Slot();
|
||||||
|
slots[index].setRef(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getRef(int index) {
|
||||||
|
return slots[index].getRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDouble(int index, double val) {
|
||||||
|
setLong(index, Double.doubleToRawLongBits(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDouble(int index) {
|
||||||
|
return Double.longBitsToDouble(getLong(index));
|
||||||
|
}
|
||||||
|
}
|
||||||
37
src/com/gabongao/jvm/rtda/Object.java
Normal file
37
src/com/gabongao/jvm/rtda/Object.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class Object {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
105
src/com/gabongao/jvm/rtda/OperandStack.java
Normal file
105
src/com/gabongao/jvm/rtda/OperandStack.java
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class OperandStack {
|
||||||
|
private int size = 0;
|
||||||
|
private Slot[] slots;
|
||||||
|
|
||||||
|
public OperandStack(int maxStacks) {
|
||||||
|
if (maxStacks > 0) {
|
||||||
|
slots = new Slot[maxStacks];
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Operands Count Error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushInt(int val) {
|
||||||
|
slots[size] = new Slot();
|
||||||
|
slots[size].setNum(val);
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int popInt() {
|
||||||
|
size--;
|
||||||
|
return slots[size].getNum();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushFloat(float val) {
|
||||||
|
slots[size] = new Slot();
|
||||||
|
slots[size].setNum(Float.floatToRawIntBits(val));
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float popFloat() {
|
||||||
|
size--;
|
||||||
|
return Float.intBitsToFloat(slots[size].getNum());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushLong(long val) {
|
||||||
|
slots[size] = new Slot();
|
||||||
|
slots[size].setNum((int) val);
|
||||||
|
slots[size + 1] = new Slot();
|
||||||
|
slots[size + 1].setNum((int) (val >> 32));
|
||||||
|
size += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long popLong() {
|
||||||
|
size -= 2;
|
||||||
|
int high = slots[size + 1].getNum();
|
||||||
|
int low = slots[size].getNum();
|
||||||
|
return ((((long) high) << 32) & 0xffffffff00000000L) | (((long) low) & 0x00000000ffffffffL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushRef(Object ref) {
|
||||||
|
slots[size] = new Slot();
|
||||||
|
slots[size].setRef(ref);
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object popRef() {
|
||||||
|
size--;
|
||||||
|
Object ref = slots[size].getRef();
|
||||||
|
slots[size].setRef(null);
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void pushDouble(double val) {
|
||||||
|
pushLong(Double.doubleToRawLongBits(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
public double popDouble() {
|
||||||
|
return Double.longBitsToDouble(popLong());
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/com/gabongao/jvm/rtda/Slot.java
Normal file
54
src/com/gabongao/jvm/rtda/Slot.java
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class Slot {
|
||||||
|
private int num;
|
||||||
|
private Object ref;
|
||||||
|
|
||||||
|
public int getNum() {
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNum(int num) {
|
||||||
|
this.num = num;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getRef() {
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRef(Object ref) {
|
||||||
|
this.ref = ref;
|
||||||
|
}
|
||||||
|
}
|
||||||
71
src/com/gabongao/jvm/rtda/Stack.java
Normal file
71
src/com/gabongao/jvm/rtda/Stack.java
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class Stack {
|
||||||
|
int maxSize, size = 0;
|
||||||
|
Frame _top;
|
||||||
|
|
||||||
|
public Stack(int maxSize) {
|
||||||
|
this.maxSize = maxSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void push(Frame frame) {
|
||||||
|
if (size >= maxSize) {
|
||||||
|
throw new RuntimeException("StackOverFlowError");
|
||||||
|
}
|
||||||
|
if (_top != null) {
|
||||||
|
frame.setLower(_top);
|
||||||
|
}
|
||||||
|
_top = frame;
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame pop() {
|
||||||
|
if (_top == null) {
|
||||||
|
throw new RuntimeException("jvm stack is empty");
|
||||||
|
}
|
||||||
|
Frame top = _top;
|
||||||
|
_top = top.getLower();
|
||||||
|
top.setLower(null);
|
||||||
|
size--;
|
||||||
|
return top;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame top() {
|
||||||
|
if (_top == null) {
|
||||||
|
throw new RuntimeException("jvm stack is empty");
|
||||||
|
}
|
||||||
|
return _top;
|
||||||
|
}
|
||||||
|
}
|
||||||
62
src/com/gabongao/jvm/rtda/Thread.java
Normal file
62
src/com/gabongao/jvm/rtda/Thread.java
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.gabongao.jvm.rtda;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ┏┓ ┏┓+ +
|
||||||
|
* ┏┛┻━━━┛┻┓ + +
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ━ ┃ ++ + + +
|
||||||
|
* ████━████ ┃+
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┻ ┃
|
||||||
|
* ┃ ┃ + +
|
||||||
|
* ┗━┓ ┏━┛
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ + + + +
|
||||||
|
* ┃ ┃ Code is far away from bug with the animal protecting
|
||||||
|
* ┃ ┃ + 神兽保佑,代码无bug
|
||||||
|
* ┃ ┃
|
||||||
|
* ┃ ┃ +
|
||||||
|
* ┃ ┗━━━┓ + +
|
||||||
|
* ┃ ┣┓
|
||||||
|
* ┃ ┏┛
|
||||||
|
* ┗┓┓┏━┳┓┏┛ + + + +
|
||||||
|
* ┃┫┫ ┃┫┫
|
||||||
|
* ┗┻┛ ┗┻┛+ + + +
|
||||||
|
* Created by Imgaojp on 2017/2/18.
|
||||||
|
*/
|
||||||
|
public class Thread {
|
||||||
|
private int pc;
|
||||||
|
private Stack stack;
|
||||||
|
|
||||||
|
public Thread() {
|
||||||
|
this.stack = new Stack(1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPc() {
|
||||||
|
return pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPc(int pc) {
|
||||||
|
this.pc = pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushFrame(Frame frame) {
|
||||||
|
stack.push(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame popFrame() {
|
||||||
|
return stack.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame currentFrame() {
|
||||||
|
return stack.top();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user