|
@@ -135,13 +135,13 @@ public final class Definition {
|
|
|
public final String name;
|
|
|
public final Struct owner;
|
|
|
public final Class<?> augmentation;
|
|
|
- public final Type rtn;
|
|
|
- public final List<Type> arguments;
|
|
|
+ public final Class<?> rtn;
|
|
|
+ public final List<Class<?>> arguments;
|
|
|
public final org.objectweb.asm.commons.Method method;
|
|
|
public final int modifiers;
|
|
|
public final MethodHandle handle;
|
|
|
|
|
|
- public Method(String name, Struct owner, Class<?> augmentation, Type rtn, List<Type> arguments,
|
|
|
+ public Method(String name, Struct owner, Class<?> augmentation, Class<?> rtn, List<Class<?>> arguments,
|
|
|
org.objectweb.asm.commons.Method method, int modifiers, MethodHandle handle) {
|
|
|
this.name = name;
|
|
|
this.augmentation = augmentation;
|
|
@@ -172,21 +172,21 @@ public final class Definition {
|
|
|
params = new Class<?>[1 + arguments.size()];
|
|
|
params[0] = augmentation;
|
|
|
for (int i = 0; i < arguments.size(); i++) {
|
|
|
- params[i + 1] = arguments.get(i).clazz;
|
|
|
+ params[i + 1] = defClassToObjectClass(arguments.get(i));
|
|
|
}
|
|
|
- returnValue = rtn.clazz;
|
|
|
+ returnValue = defClassToObjectClass(rtn);
|
|
|
} else if (Modifier.isStatic(modifiers)) {
|
|
|
// static method: straightforward copy
|
|
|
params = new Class<?>[arguments.size()];
|
|
|
for (int i = 0; i < arguments.size(); i++) {
|
|
|
- params[i] = arguments.get(i).clazz;
|
|
|
+ params[i] = defClassToObjectClass(arguments.get(i));
|
|
|
}
|
|
|
- returnValue = rtn.clazz;
|
|
|
+ returnValue = defClassToObjectClass(rtn);
|
|
|
} else if ("<init>".equals(name)) {
|
|
|
// constructor: returns the owner class
|
|
|
params = new Class<?>[arguments.size()];
|
|
|
for (int i = 0; i < arguments.size(); i++) {
|
|
|
- params[i] = arguments.get(i).clazz;
|
|
|
+ params[i] = defClassToObjectClass(arguments.get(i));
|
|
|
}
|
|
|
returnValue = owner.clazz;
|
|
|
} else {
|
|
@@ -194,9 +194,9 @@ public final class Definition {
|
|
|
params = new Class<?>[1 + arguments.size()];
|
|
|
params[0] = owner.clazz;
|
|
|
for (int i = 0; i < arguments.size(); i++) {
|
|
|
- params[i + 1] = arguments.get(i).clazz;
|
|
|
+ params[i + 1] = defClassToObjectClass(arguments.get(i));
|
|
|
}
|
|
|
- returnValue = rtn.clazz;
|
|
|
+ returnValue = defClassToObjectClass(rtn);
|
|
|
}
|
|
|
return MethodType.methodType(returnValue, params);
|
|
|
}
|
|
@@ -223,17 +223,17 @@ public final class Definition {
|
|
|
public static final class Field {
|
|
|
public final String name;
|
|
|
public final Struct owner;
|
|
|
- public final Type type;
|
|
|
+ public final Class<?> clazz;
|
|
|
public final String javaName;
|
|
|
public final int modifiers;
|
|
|
private final MethodHandle getter;
|
|
|
private final MethodHandle setter;
|
|
|
|
|
|
- private Field(String name, String javaName, Struct owner, Type type, int modifiers, MethodHandle getter, MethodHandle setter) {
|
|
|
+ private Field(String name, String javaName, Struct owner, Class<?> clazz, int modifiers, MethodHandle getter, MethodHandle setter) {
|
|
|
this.name = name;
|
|
|
this.javaName = javaName;
|
|
|
this.owner = owner;
|
|
|
- this.type = type;
|
|
|
+ this.clazz = clazz;
|
|
|
this.modifiers = modifiers;
|
|
|
this.getter = getter;
|
|
|
this.setter = setter;
|
|
@@ -641,13 +641,13 @@ public final class Definition {
|
|
|
return simpleTypesMap.values();
|
|
|
}
|
|
|
|
|
|
- private static String buildMethodCacheKey(String structName, String methodName, List<Type> arguments) {
|
|
|
+ private static String buildMethodCacheKey(String structName, String methodName, List<Class<?>> arguments) {
|
|
|
StringBuilder key = new StringBuilder();
|
|
|
key.append(structName);
|
|
|
key.append(methodName);
|
|
|
|
|
|
- for (Type argument : arguments) {
|
|
|
- key.append(argument.name);
|
|
|
+ for (Class<?> argument : arguments) {
|
|
|
+ key.append(argument.getName());
|
|
|
}
|
|
|
|
|
|
return key.toString();
|
|
@@ -916,17 +916,17 @@ public final class Definition {
|
|
|
"parameters " + whitelistConstructor.painlessParameterTypeNames);
|
|
|
}
|
|
|
|
|
|
- List<Type> painlessParametersTypes = new ArrayList<>(whitelistConstructor.painlessParameterTypeNames.size());
|
|
|
+ List<Class<?>> painlessParametersTypes = new ArrayList<>(whitelistConstructor.painlessParameterTypeNames.size());
|
|
|
Class<?>[] javaClassParameters = new Class<?>[whitelistConstructor.painlessParameterTypeNames.size()];
|
|
|
|
|
|
for (int parameterCount = 0; parameterCount < whitelistConstructor.painlessParameterTypeNames.size(); ++parameterCount) {
|
|
|
String painlessParameterTypeName = whitelistConstructor.painlessParameterTypeNames.get(parameterCount);
|
|
|
|
|
|
try {
|
|
|
- Type painlessParameterType = getTypeInternal(painlessParameterTypeName);
|
|
|
+ Class<?> painlessParameterClass = TypeToClass(getTypeInternal(painlessParameterTypeName));
|
|
|
|
|
|
- painlessParametersTypes.add(painlessParameterType);
|
|
|
- javaClassParameters[parameterCount] = painlessParameterType.clazz;
|
|
|
+ painlessParametersTypes.add(painlessParameterClass);
|
|
|
+ javaClassParameters[parameterCount] = defClassToObjectClass(painlessParameterClass);
|
|
|
} catch (IllegalArgumentException iae) {
|
|
|
throw new IllegalArgumentException("struct not defined for constructor parameter [" + painlessParameterTypeName + "] " +
|
|
|
"with owner struct [" + ownerStructName + "] and constructor parameters " +
|
|
@@ -958,9 +958,8 @@ public final class Definition {
|
|
|
}
|
|
|
|
|
|
painlessConstructor = methodCache.computeIfAbsent(buildMethodCacheKey(ownerStruct.name, "<init>", painlessParametersTypes),
|
|
|
- key -> new Method("<init>", ownerStruct, null, getTypeInternal("void"), painlessParametersTypes,
|
|
|
+ key -> new Method("<init>", ownerStruct, null, void.class, painlessParametersTypes,
|
|
|
asmConstructor, javaConstructor.getModifiers(), javaHandle));
|
|
|
-
|
|
|
ownerStruct.constructors.put(painlessMethodKey, painlessConstructor);
|
|
|
} else if (painlessConstructor.arguments.equals(painlessParametersTypes) == false){
|
|
|
throw new IllegalArgumentException(
|
|
@@ -998,7 +997,7 @@ public final class Definition {
|
|
|
|
|
|
int augmentedOffset = javaAugmentedClass == null ? 0 : 1;
|
|
|
|
|
|
- List<Type> painlessParametersTypes = new ArrayList<>(whitelistMethod.painlessParameterTypeNames.size());
|
|
|
+ List<Class<?>> painlessParametersTypes = new ArrayList<>(whitelistMethod.painlessParameterTypeNames.size());
|
|
|
Class<?>[] javaClassParameters = new Class<?>[whitelistMethod.painlessParameterTypeNames.size() + augmentedOffset];
|
|
|
|
|
|
if (javaAugmentedClass != null) {
|
|
@@ -1009,10 +1008,10 @@ public final class Definition {
|
|
|
String painlessParameterTypeName = whitelistMethod.painlessParameterTypeNames.get(parameterCount);
|
|
|
|
|
|
try {
|
|
|
- Type painlessParameterType = getTypeInternal(painlessParameterTypeName);
|
|
|
+ Class<?> painlessParameterClass = TypeToClass(getTypeInternal(painlessParameterTypeName));
|
|
|
|
|
|
- painlessParametersTypes.add(painlessParameterType);
|
|
|
- javaClassParameters[parameterCount + augmentedOffset] = painlessParameterType.clazz;
|
|
|
+ painlessParametersTypes.add(painlessParameterClass);
|
|
|
+ javaClassParameters[parameterCount + augmentedOffset] = defClassToObjectClass(painlessParameterClass);
|
|
|
} catch (IllegalArgumentException iae) {
|
|
|
throw new IllegalArgumentException("struct not defined for method parameter [" + painlessParameterTypeName + "] " +
|
|
|
"with owner struct [" + ownerStructName + "] and method with name [" + whitelistMethod.javaMethodName + "] " +
|
|
@@ -1031,18 +1030,18 @@ public final class Definition {
|
|
|
javaImplClass.getName() + "]", nsme);
|
|
|
}
|
|
|
|
|
|
- Type painlessReturnType;
|
|
|
+ Class<?> painlessReturnClass;
|
|
|
|
|
|
try {
|
|
|
- painlessReturnType = getTypeInternal(whitelistMethod.painlessReturnTypeName);
|
|
|
+ painlessReturnClass = TypeToClass(getTypeInternal(whitelistMethod.painlessReturnTypeName));
|
|
|
} catch (IllegalArgumentException iae) {
|
|
|
throw new IllegalArgumentException("struct not defined for return type [" + whitelistMethod.painlessReturnTypeName + "] " +
|
|
|
"with owner struct [" + ownerStructName + "] and method with name [" + whitelistMethod.javaMethodName + "] " +
|
|
|
"and parameters " + whitelistMethod.painlessParameterTypeNames, iae);
|
|
|
}
|
|
|
|
|
|
- if (javaMethod.getReturnType().equals(painlessReturnType.clazz) == false) {
|
|
|
- throw new IllegalArgumentException("specified return type class [" + painlessReturnType.clazz + "] " +
|
|
|
+ if (javaMethod.getReturnType() != defClassToObjectClass(painlessReturnClass)) {
|
|
|
+ throw new IllegalArgumentException("specified return type class [" + painlessReturnClass + "] " +
|
|
|
"does not match the return type class [" + javaMethod.getReturnType() + "] for the " +
|
|
|
"method with name [" + whitelistMethod.javaMethodName + "] " +
|
|
|
"and parameters " + whitelistMethod.painlessParameterTypeNames);
|
|
@@ -1066,14 +1065,14 @@ public final class Definition {
|
|
|
|
|
|
painlessMethod = methodCache.computeIfAbsent(
|
|
|
buildMethodCacheKey(ownerStruct.name, whitelistMethod.javaMethodName, painlessParametersTypes),
|
|
|
- key -> new Method(whitelistMethod.javaMethodName, ownerStruct, null, painlessReturnType, painlessParametersTypes,
|
|
|
+ key -> new Method(whitelistMethod.javaMethodName, ownerStruct, null, painlessReturnClass, painlessParametersTypes,
|
|
|
asmMethod, javaMethod.getModifiers(), javaMethodHandle));
|
|
|
ownerStruct.staticMethods.put(painlessMethodKey, painlessMethod);
|
|
|
- } else if ((painlessMethod.name.equals(whitelistMethod.javaMethodName) && painlessMethod.rtn.equals(painlessReturnType) &&
|
|
|
+ } else if ((painlessMethod.name.equals(whitelistMethod.javaMethodName) && painlessMethod.rtn == painlessReturnClass &&
|
|
|
painlessMethod.arguments.equals(painlessParametersTypes)) == false) {
|
|
|
throw new IllegalArgumentException("illegal duplicate static methods [" + painlessMethodKey + "] " +
|
|
|
"found within the struct [" + ownerStruct.name + "] with name [" + whitelistMethod.javaMethodName + "], " +
|
|
|
- "return types [" + painlessReturnType + "] and [" + painlessMethod.rtn.name + "], " +
|
|
|
+ "return types [" + painlessReturnClass + "] and [" + painlessMethod.rtn + "], " +
|
|
|
"and parameters " + painlessParametersTypes + " and " + painlessMethod.arguments);
|
|
|
}
|
|
|
} else {
|
|
@@ -1092,14 +1091,14 @@ public final class Definition {
|
|
|
|
|
|
painlessMethod = methodCache.computeIfAbsent(
|
|
|
buildMethodCacheKey(ownerStruct.name, whitelistMethod.javaMethodName, painlessParametersTypes),
|
|
|
- key -> new Method(whitelistMethod.javaMethodName, ownerStruct, javaAugmentedClass, painlessReturnType,
|
|
|
+ key -> new Method(whitelistMethod.javaMethodName, ownerStruct, javaAugmentedClass, painlessReturnClass,
|
|
|
painlessParametersTypes, asmMethod, javaMethod.getModifiers(), javaMethodHandle));
|
|
|
ownerStruct.methods.put(painlessMethodKey, painlessMethod);
|
|
|
- } else if ((painlessMethod.name.equals(whitelistMethod.javaMethodName) && painlessMethod.rtn.equals(painlessReturnType) &&
|
|
|
+ } else if ((painlessMethod.name.equals(whitelistMethod.javaMethodName) && painlessMethod.rtn.equals(painlessReturnClass) &&
|
|
|
painlessMethod.arguments.equals(painlessParametersTypes)) == false) {
|
|
|
throw new IllegalArgumentException("illegal duplicate member methods [" + painlessMethodKey + "] " +
|
|
|
"found within the struct [" + ownerStruct.name + "] with name [" + whitelistMethod.javaMethodName + "], " +
|
|
|
- "return types [" + painlessReturnType + "] and [" + painlessMethod.rtn.name + "], " +
|
|
|
+ "return types [" + painlessReturnClass + "] and [" + painlessMethod.rtn + "], " +
|
|
|
"and parameters " + painlessParametersTypes + " and " + painlessMethod.arguments);
|
|
|
}
|
|
|
}
|
|
@@ -1127,10 +1126,10 @@ public final class Definition {
|
|
|
"not found for class [" + ownerStruct.clazz.getName() + "].");
|
|
|
}
|
|
|
|
|
|
- Type painlessFieldType;
|
|
|
+ Class<?> painlessFieldClass;
|
|
|
|
|
|
try {
|
|
|
- painlessFieldType = getTypeInternal(whitelistField.painlessFieldTypeName);
|
|
|
+ painlessFieldClass = TypeToClass(getTypeInternal(whitelistField.painlessFieldTypeName));
|
|
|
} catch (IllegalArgumentException iae) {
|
|
|
throw new IllegalArgumentException("struct not defined for return type [" + whitelistField.painlessFieldTypeName + "] " +
|
|
|
"with owner struct [" + ownerStructName + "] and field with name [" + whitelistField.javaFieldName + "]", iae);
|
|
@@ -1146,11 +1145,11 @@ public final class Definition {
|
|
|
|
|
|
if (painlessField == null) {
|
|
|
painlessField = fieldCache.computeIfAbsent(
|
|
|
- buildFieldCacheKey(ownerStruct.name, whitelistField.javaFieldName, painlessFieldType.name),
|
|
|
+ buildFieldCacheKey(ownerStruct.name, whitelistField.javaFieldName, painlessFieldClass.getName()),
|
|
|
key -> new Field(whitelistField.javaFieldName, javaField.getName(),
|
|
|
- ownerStruct, painlessFieldType, javaField.getModifiers(), null, null));
|
|
|
+ ownerStruct, painlessFieldClass, javaField.getModifiers(), null, null));
|
|
|
ownerStruct.staticMembers.put(whitelistField.javaFieldName, painlessField);
|
|
|
- } else if (painlessField.type.equals(painlessFieldType) == false) {
|
|
|
+ } else if (painlessField.clazz != painlessFieldClass) {
|
|
|
throw new IllegalArgumentException("illegal duplicate static fields [" + whitelistField.javaFieldName + "] " +
|
|
|
"found within the struct [" + ownerStruct.name + "] with type [" + whitelistField.painlessFieldTypeName + "]");
|
|
|
}
|
|
@@ -1175,11 +1174,11 @@ public final class Definition {
|
|
|
|
|
|
if (painlessField == null) {
|
|
|
painlessField = fieldCache.computeIfAbsent(
|
|
|
- buildFieldCacheKey(ownerStruct.name, whitelistField.javaFieldName, painlessFieldType.name),
|
|
|
+ buildFieldCacheKey(ownerStruct.name, whitelistField.javaFieldName, painlessFieldClass.getName()),
|
|
|
key -> new Field(whitelistField.javaFieldName, javaField.getName(),
|
|
|
- ownerStruct, painlessFieldType, javaField.getModifiers(), javaMethodHandleGetter, javaMethodHandleSetter));
|
|
|
+ ownerStruct, painlessFieldClass, javaField.getModifiers(), javaMethodHandleGetter, javaMethodHandleSetter));
|
|
|
ownerStruct.members.put(whitelistField.javaFieldName, painlessField);
|
|
|
- } else if (painlessField.type.equals(painlessFieldType) == false) {
|
|
|
+ } else if (painlessField.clazz != painlessFieldClass) {
|
|
|
throw new IllegalArgumentException("illegal duplicate member fields [" + whitelistField.javaFieldName + "] " +
|
|
|
"found within the struct [" + ownerStruct.name + "] with type [" + whitelistField.painlessFieldTypeName + "]");
|
|
|
}
|
|
@@ -1263,7 +1262,7 @@ public final class Definition {
|
|
|
for (Field field : child.members.values()) {
|
|
|
if (owner.members.get(field.name) == null) {
|
|
|
owner.members.put(field.name,
|
|
|
- new Field(field.name, field.javaName, owner, field.type, field.modifiers, field.getter, field.setter));
|
|
|
+ new Field(field.name, field.javaName, owner, field.clazz, field.modifiers, field.getter, field.setter));
|
|
|
}
|
|
|
}
|
|
|
}
|