import java.util.Map;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.math.BigInteger;
import java.security.ProtectionDomain;
return listString;
}*/
}
-
- private static int digitsPerInt[] = {0, 0, 30, 19, 15, 13, 11,
- 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5};
-
- private static long bitsPerDigit[] = { 0, 0,
- 1024, 1624, 2048, 2378, 2648, 2875, 3072, 3247, 3402, 3543, 3672,
- 3790, 3899, 4001, 4096, 4186, 4271, 4350, 4426, 4498, 4567, 4633,
- 4696, 4756, 4814, 4870, 4923, 4975, 5025, 5074, 5120, 5166, 5210,
- 5253, 5295};
public static void main(String[] args) {
+
+ BigInteger bi = new BigInteger("-1");
+ System.out.println(bi);
+
+ /* TODO: Enumerate all methods in Class.class
+ Method[] methods = Class.class.getMethods();
+ for(Method mth : methods) {
+ //System.out.println("===========================");
+ //System.out.println("Method: " + mth.getName());
+ Type[] parameters = mth.getGenericParameterTypes();
+ for (int i = 0; i < parameters.length; i++) {
+ System.out.println(parameters[i]);
+ }
+ System.out.println();
+ Type returnType = mth.getGenericReturnType();
+ System.out.println(returnType + "\n");
+ }*/
- /*Method[] methods = SampleClass.class.getMethods();
+ Method[] methods = Collection.class.getMethods();
// Method[] methods = Class.class.getMethods();
Method method = null;
for(Method meth : methods) {
- if (meth.getName().equals("setSampleField")) {
- method = meth;
- }
+ System.out.println("===========================");
+ //System.out.println("Method: " + meth.toString());
+ Type[] parameters = meth.getGenericParameterTypes();
+ for (int i = 0; i < parameters.length; i++) {
+ System.out.println(parameters[i]);
+ }
+ Type returnType = meth.getGenericReturnType();
+ System.out.println(returnType);
+ System.out.println("===========================");
}
Type[] parameters = method.getGenericParameterTypes();
//Type[] parameters = methods[0].getGenericParameterTypes();
}
System.out.println();
Type returnType = method.getGenericReturnType();
- Class.class.getSimpleName();*/
- //System.out.println(returnType);
-
- //BigInteger bi = new BigInteger("-1");
- //System.out.println(bi);
+ System.out.println(returnType);
/* TODO: This is an excerpt of the BigInteger library
int radix = 10;
System.out.println(interfaces[i]);
}*/
-
- /*Method[] methods = Class.class.getMethods();
+ /*
+ Method[] methods = Collection.class.getMethods();
Method method = null;
for(Method mth : methods) {
- if (mth.getName().equals("getConstructor")) {
+ if (mth.getName().equals("toArray")) {
//if (mth.getName().equals("isAssignableFrom")) {
//if (mth.getName().equals("getSuperclass")) {
method = mth;
+ break;
}
}
Type[] parameters = method.getGenericParameterTypes();
System.out.println();
Type returnType = method.getGenericReturnType();
System.out.println(returnType);*/
-
- /* TODO: Enumerate all methods in Class.class */
- /*Method[] methods = Class.class.getMethods();
- for(Method mth : methods) {
- System.out.println("===========================");
- System.out.println("Method: " + mth.getName());
- Type[] parameters = mth.getGenericParameterTypes();
- for (int i = 0; i < parameters.length; i++) {
- System.out.println(parameters[i]);
- }
- System.out.println();
- Type returnType = mth.getGenericReturnType();
- System.out.println(returnType + "\n");
- }*/
/*Class[] parameterTypes = methods[0].getParameterTypes();
for(Class parameterType: parameterTypes){
}
System.out.println();*/
- ProtectionDomain pd = Class.class.getProtectionDomain();
- System.out.println(pd);
+ //ProtectionDomain pd = Class.class.getProtectionDomain();
+ //System.out.println(pd);
}
}
return getTypeName(signature.substring(1)) + "[]";
}
+ // If it does not contain '<' and '>' then it is
+ // a Type signature, e.g., T, U, etc.
+ if (Types.isParameterWithType(signature)) {
+ // Clean the ';' character first and return the Type
+ return Types.getTypeParameter(signature.replace(";", ""));
+ }
+
int len1 = len-1;
if (signature.charAt(len1) == ';') {
// TODO: Fix for Groovy's model-checking
return 1 + getTypeLength(signature, idx + 1);
case 'L':
-
+ default:
int semicolon = signature.indexOf(';', idx);
// TODO: Fix for Groovy's model-checking
// Check if this is a generic!
return semicolon - idx + 1;
}
- throw new JPFException("invalid type signature");
+ //throw new JPFException("invalid type signature");
}
/**
public static boolean isTypeParameter(String parameterizedType, String signature) {
if (signature == null || signature.equals(""))
return false;
+ // The comparison has to be done without the "[]" part if it is an array
+ if (Types.isArraySignature(parameterizedType)) {
+ parameterizedType = Types.getArrayClassName(parameterizedType);
+ }
String typeParamSig = parameterizedType.concat(":");
return signature.contains(typeParamSig);
}
return signature.replaceAll("\\+L|-L", "");
}
+ public static boolean isParameterWithType(String signature) {
+ // Does not contain a class name
+ if (!signature.contains(".") && !signature.contains("/")) {
+ return true;
+ }
+ return false;
+ }
+
public static String getTypeParameter(String signature) {
if (signature == null || signature.equals(""))
return signature;
// Get field information and fill out the fields
String clsSig = Types.getArrayClassName(signature);
- int paramTypeRef = getParameterizedTypeImplObj(clsSig, env, objRef, mi);
+ int paramTypeRef;
+ if (Types.isParameterWithType(clsSig)) {
+ paramTypeRef = getTypeVariableImplObject(env, objRef, clsSig);
+ } else {
+ paramTypeRef = getParameterizedTypeImplObj(clsSig, env, objRef, mi);
+ }
ei.setReferenceField("genericComponentType", paramTypeRef);
return genArrRef;
String[] argTypeNames = mi.getArgumentGenericTypeNames();
int[] ar = new int[argTypeNames.length];
+ String classGenericSig = mi.getClassInfo().getGenericSignature();
+ String methodGenericSig = mi.getGenericSignature();
for (int i = 0; i < argTypeNames.length; i++) {
// Change this into just the generic class type if it is a generic class
if (Types.isGenericSignature(argTypeNames[i])) {
} else {
ar[i] = getParameterizedTypeImplObj(argTypeNames[i], env, objRef, mi);
}
+ } else if (Types.isTypeParameter(argTypeNames[i], methodGenericSig) ||
+ Types.isTypeParameter(argTypeNames[i], classGenericSig)) {
+ if (Types.isArraySignature(argTypeNames[i])) {
+ // Generic array
+ ar[i] = getGenericArrayTypeImplObj(argTypeNames[i], env, objRef, mi);
+ } else {
+ ar[i] = getTypeVariableImplObject(env, objRef, argTypeNames[i]);
+ }
} else {
ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(argTypeNames[i]);
if (!ci.isRegistered()) {
MethodInfo mi = getMethodInfo(env, objRef);
ThreadInfo ti = env.getThreadInfo();
+ String genRetType = mi.getGenericReturnTypeName();
+ String classGenericSig = mi.getClassInfo().getGenericSignature();
+ String methodGenericSig = mi.getGenericSignature();
int retRef;
- if (Types.isGenericSignature(mi.getGenericReturnTypeName())) {
- if (Types.isArraySignature(mi.getGenericReturnTypeName())) {
+
+ if (Types.isGenericSignature(genRetType)) {
+ if (Types.isArraySignature(genRetType)) {
+ // Generic array
+ retRef = getGenericArrayTypeImplObj(genRetType, env, objRef, mi);
+ } else {
+ retRef = getParameterizedTypeImplObj(genRetType, env, objRef, mi);
+ }
+ } else if (Types.isTypeParameter(genRetType, methodGenericSig) ||
+ Types.isTypeParameter(genRetType, classGenericSig)) {
+ if (Types.isArraySignature(genRetType)) {
// Generic array
- retRef = getGenericArrayTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+ retRef = getGenericArrayTypeImplObj(genRetType, env, objRef, mi);
} else {
- retRef = getParameterizedTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+ retRef = getTypeVariableImplObject(env, objRef, genRetType);
}
} else {
ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(mi.getReturnTypeName());