Methods Summary |
---|
protected java.lang.Class | getClass(oracle.toplink.libraries.asm.Type t)
try {
if (t.getSort() == Type.ARRAY) {
return Class.forName(t.getDescriptor().replace('/", '."));
} else {
return Class.forName(t.getClassName());
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e.toString());
}
|
protected Value | getElementValue(Value objectArrayValue)
Type arrayType = ((BasicValue)objectArrayValue).getType();
if (arrayType != null) {
if (arrayType.getSort() == Type.ARRAY) {
return newValue(Type.getType(arrayType.getDescriptor().substring(1)));
} else if (arrayType.getDescriptor().equals("Lnull;")) {
return objectArrayValue;
}
}
throw new AnalyzerException("Not an array type");
|
protected boolean | isArrayValue(Value value)
Type t = ((BasicValue)value).getType();
if (t != null) {
return t.getDescriptor().equals("Lnull;") || t.getSort() == Type.ARRAY;
}
return false;
|
protected boolean | isSubTypeOf(Value value, Value expected)
Type expectedType = ((BasicValue)expected).getType();
Type type = ((BasicValue)value).getType();
if (expectedType == null) {
return type == null;
} else {
switch (expectedType.getSort()) {
case Type.INT:
case Type.FLOAT:
case Type.LONG:
case Type.DOUBLE:
return type == expectedType;
case Type.ARRAY:
case Type.OBJECT:
if (expectedType.getDescriptor().equals("Lnull;")) {
return type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY;
}
Class expectedClass = getClass(expectedType);
if (type.getDescriptor().equals("Lnull;")) {
return !expectedClass.isPrimitive();
} else if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
Class actualClass = getClass(type);
return expectedClass.isAssignableFrom(actualClass);
} else {
return false;
}
default:
throw new RuntimeException("Internal error");
}
}
|
public Value | merge(Value v, Value w)
if (!v.equals(w)) {
Type t = ((BasicValue)v).getType();
Type u = ((BasicValue)w).getType();
if (t != null && (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) {
if (u != null && (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
if (t.getDescriptor().equals("Lnull;")) {
return w;
}
if (u.getDescriptor().equals("Lnull;")) {
return v;
}
Class c = getClass(t);
Class d = getClass(u);
if (c.isAssignableFrom(d)) {
return v;
}
if (d.isAssignableFrom(c)) {
return w;
}
// TODO case of array classes of the same dimension
// TODO should we look also for a common super interface?
// problem: there may be several possible common super interfaces
do {
if (c == null || c.isInterface()) {
return BasicValue.REFERENCE_VALUE;
} else {
c = c.getSuperclass();
}
if (c.isAssignableFrom(d)) {
return newValue(Type.getType(c));
}
} while (true);
}
}
return BasicValue.UNINITIALIZED_VALUE;
}
return v;
|
public Value | newValue(oracle.toplink.libraries.asm.Type type)
Value v = super.newValue(type);
if (v == BasicValue.REFERENCE_VALUE) {
if (type.getSort() == Type.ARRAY) {
v = newValue(type.getElementType());
String desc = ((BasicValue)v).getType().getDescriptor();
for (int i = 0; i < type.getDimensions(); ++i) {
desc = "[" + desc;
}
v = new BasicValue(Type.getType(desc));
} else {
v = new BasicValue(type);
}
}
return v;
|