package janala.logger;
import janala.interpreters.ClassDepot;
import janala.interpreters.PlaceHolder;
import janala.interpreters.Value;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
/**
* Containing the static info of a class and dynamic values of the
* static fields.
*/
public class ObjectInfo implements Serializable {
private static final long serialVersionUID = 1L;
private Map<String, Integer> fieldNameToIndex;
private List<FieldInfo> fieldList;
private Map<String, Integer> staticFieldNameToIndex;
private List<FieldInfo> staticFieldList;
int nStaticFields;
private int nFields;
public Value[] statics;
private String className;
public String getClassName() {
return className;
}
private final ClassDepot classDepot;
public ObjectInfo(String className, ClassDepot classDepot) {
this.className = className.replace('/', '.');
nFields = -1;
this.classDepot = classDepot;
}
private int get(String fieldName,
boolean isStatic,
Map<String, Integer> fieldNameToIndex,
List<FieldInfo> fieldList) {
Integer i = fieldNameToIndex.get(fieldName);
if (i == null) {
i = fieldList.size();
fieldNameToIndex.put(fieldName, i);
fieldList.add(new FieldInfo(className, fieldName, isStatic, classDepot));
}
return i;
}
private static Map<String, Integer> createMap(Map<String, Integer> fieldNameToIndex) {
if (fieldNameToIndex == null) {
return new TreeMap<String, Integer>();
}
return fieldNameToIndex;
}
private static List<FieldInfo> createList(List<FieldInfo> f) {
if (f == null) {
return new ArrayList<FieldInfo>();
}
return f;
}
public int getIdx(String fieldName, boolean isStatic) {
if (isStatic) {
staticFieldNameToIndex = createMap(staticFieldNameToIndex);
staticFieldList = createList(staticFieldList);
return get(fieldName, isStatic, staticFieldNameToIndex, staticFieldList);
}
fieldNameToIndex = createMap(fieldNameToIndex);
fieldList = createList(fieldList);
return get(fieldName, isStatic, fieldNameToIndex, fieldList);
}
public FieldInfo get(int i, boolean isStatic) {
if (isStatic) {
return staticFieldList.get(i);
}
return fieldList.get(i);
}
public Value getStaticField(int fieldId) {
initialize();
Value v = statics[fieldId];
if (v == null) {
return PlaceHolder.instance;
}
return v;
}
public void setStaticField(int fieldId, Value value) {
initialize();
statics[fieldId] = value;
}
@Override
public String toString() {
return "ObjectInfo{"
+ "fieldNameToIndex="
+ fieldNameToIndex
+ ", fieldList="
+ fieldList
+ ", staticFieldNameToIndex="
+ staticFieldNameToIndex
+ ", staticFieldList="
+ staticFieldList
+ ", nStaticFields="
+ nStaticFields
+ ", nFields="
+ nFields
+ ", statics="
+ (statics == null ? null : Arrays.asList(statics))
+ ", className='"
+ className
+ '\''
+ '}';
}
private void initialize() {
if (nFields == -1) {
nFields = classDepot.numFields(className);
nStaticFields = classDepot.numStaticFields(className);
statics = new Value[nStaticFields];
}
}
public int getNFields() {
initialize();
return nFields;
}
}