Run-time Data Area

This commit is contained in:
Imgaojp 2017-02-18 16:34:50 +08:00
parent 4f24288e20
commit 716f2c9ad2
8 changed files with 531 additions and 0 deletions

View File

@ -2,6 +2,9 @@ package com.gabongao.jvm;
import com.gabongao.jvm.classfile.ClassFile;
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.util.Arrays;
@ -64,6 +67,8 @@ public class Jvm {
}
*/
/* ch03
ClassPath cp = new ClassPath();
cp.parse(cmd.jreOption, cmd.cpOption);
String className = cmd.className.replace(".", "/").concat(".class");
@ -90,7 +95,51 @@ public class Jvm {
for (int i = 0; i < classFile.getMethods().length; i++) {
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());
}
}

View 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;
}
}

View 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));
}
}

View 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
}

View 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());
}
}

View 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;
}
}

View 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;
}
}

View 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();
}
}