package reflect;
import icecaptools.IcecapCompileMe;
import vm.Address;
import vm.Address32Bit;
import vm.Address64Bit;
import vm.Machine;
import vm.HardwareObject;
public class StaticRefInfo {
private static class OffsetsArray extends HardwareObject {
public int data;
public OffsetsArray(int address) {
super(new Address32Bit(address));
}
public OffsetsArray(long address) {
super(new Address64Bit(address));
}
public void advance() {
address.add(4);
}
}
private static int[] offsets;
@IcecapCompileMe
public static int[] getOffsets() {
if (offsets == null) {
OffsetsArray oa;
switch (Machine.architecture) {
case Machine.X86_64:
oa = new OffsetsArray(StaticRefInfo64.staticReferenceOffsets);
break;
case Machine.X86_32:
oa = new OffsetsArray(StaticRefInfo32.staticReferenceOffsets);
break;
default:
oa = null;
break;
}
int length = oa.data;
short index = 0;
offsets = new int[length];
oa.advance();
while (length > 0) {
offsets[index++] = oa.data;
oa.advance();
length--;
}
}
return offsets;
}
private static class ReferenceArray extends HardwareObject {
public int data;
public ReferenceArray() {
super(new Address32Bit(0));
}
public void setAddress(Address adr) {
this.address = adr;
}
}
static ReferenceArray ra;
@IcecapCompileMe
public static int getReference(int offset) {
if (ra == null) {
ra = new ReferenceArray();
}
Address adr;
switch (Machine.architecture) {
case Machine.X86_64:
adr = new Address64Bit(StaticRefInfo64.classData);
break;
case Machine.X86_32:
adr = new Address64Bit(StaticRefInfo32.classData);
break;
default:
adr = null;
break;
}
adr.add(offset);
ra.setAddress(adr);
return ra.data;
}
}