JVM/src/com/gabongao/jvm/rtda/LocalVars.java
2017-02-18 16:34:50 +08:00

94 lines
3.2 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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));
}
}