package janala.instrument;
/** An object to keep track of (classId, methodId, instructionId) tuples during
instrumentation. */
public class GlobalStateForInstrumentation {
public static GlobalStateForInstrumentation instance = new GlobalStateForInstrumentation();
private int iid = 0;
private int mid = 0;
private int cid = 0;
// When one gets the id, she gets the result of mergind all three ids.
// NOTE
// Beaware of truncation errors.
private final static int CBITS = 14; // CID occupies the upper 14 bits
private final static int MBITS = 8; // MID occupies the next 8 bits
/** Increment iid and get the complete id */
public int incAndGetId() {
iid++;
return getId();
}
public int getId() {
return (cid << (32 - CBITS)) + (mid << (32 - CBITS - MBITS)) + iid;
}
// Used for testing
public void reset() {
iid = 0;
mid = 0;
cid = 0;
}
public static int getCidMid(int cid, int mid) {
return cid << MBITS + mid;
}
public static int extractCidMid(int id) {
return (id >> 32 - MBITS - CBITS);
}
public int getMid() {
return mid;
}
public void incMid() {
this.mid++;
this.iid = 0;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.iid = 0;
this.mid = 0;
this.cid = cid;
}
}