package com.coding.mini_jvm.src.com.coderising.jvm.loader;
import com.coding.mini_jvm.src.com.coderising.jvm.util.Util;
public class ByteCodeIterator {
public static final int U1 = 1;
public static final int U2 = 2;
public static final int U4 = 4;
public static final int U8 = 8;
private byte[] bytes;
private int cursor;
public ByteCodeIterator(byte[] bytes) {
this.bytes = bytes;
}
public String readTwoBytesToString() {
String ret = Util.byte2String(bytes, cursor, U2);
cursor += U2;
return ret;
}
public String readBytesToString(int len) {
String ret = Util.byte2String(bytes, cursor, len);
cursor += len;
return ret;
}
public String readBytesToHexString(int len) {
byte[] bs = new byte[len];
System.arraycopy(bytes, cursor, bs, 0, len);
String ret = Util.byteToHexString(bs);
cursor += len;
return ret;
}
public int readTwoBytesToInt() {
int ret = Util.bytes2Int(bytes, cursor, U2);
cursor += U2;
return ret;
}
public int readFourBytesToInt() {
int ret = Util.bytes2Int(bytes, cursor, U4);
cursor += U4;
return ret;
}
public int readByteToInt() {
int ret = Util.bytes2Int(bytes, cursor, U1);
cursor += U1;
return ret;
}
public int skip(int len) {
if (cursor + len < 0 || cursor + len > bytes.length - 1) {
throw new IndexOutOfBoundsException();
}
cursor += len;
return cursor;
}
public int back(int len) {
if (cursor + len < 0 || cursor + len > bytes.length - 1) {
throw new IndexOutOfBoundsException();
}
cursor -= len;
return cursor;
}
}