use of com.oracle.svm.core.hub.DynamicHub in project graal by oracle.
the class JavaLangReflectSubstitutions method createMultiArrayAtIndex.
static Object createMultiArrayAtIndex(int index, DynamicHub arrayHub, int[] dimensions) {
final int length = dimensions[index];
final Object result = Array.newInstance(arrayHub.getComponentHub().asClass(), length);
final int nextIndex = index + 1;
if (nextIndex < dimensions.length && length > 0) {
DynamicHub subArrayHub = arrayHub.getComponentHub();
UnsignedWord offset = LayoutEncoding.getArrayBaseOffset(arrayHub.getLayoutEncoding());
UnsignedWord size = LayoutEncoding.getArraySize(arrayHub.getLayoutEncoding(), length);
while (offset.belowThan(size)) {
Object subArray = createMultiArrayAtIndex(nextIndex, subArrayHub, dimensions);
// Each subArray could create a cross-generational reference.
BarrieredAccess.writeObject(result, offset, subArray);
offset = offset.add(ConfigurationValues.getObjectLayout().getReferenceSize());
}
}
return result;
}
use of com.oracle.svm.core.hub.DynamicHub in project graal by oracle.
the class ObjectHeader method dynamicHubFromObjectHeader.
/**
* Decode a DynamicHub from an Object header.
*/
protected static DynamicHub dynamicHubFromObjectHeader(UnsignedWord header) {
// Turn the Unsigned header into a Pointer, and then to an Object of type DynamicHub.
final UnsignedWord pointerBits = clearBits(header);
final Pointer pointerValue = (Pointer) pointerBits;
final Object objectValue = pointerValue.toObject();
final DynamicHub result = KnownIntrinsics.unsafeCast(objectValue, DynamicHub.class);
return result;
}
use of com.oracle.svm.core.hub.DynamicHub in project graal by oracle.
the class ReflectionDataBuilder method duringAnalysis.
protected void duringAnalysis(DuringAnalysisAccess a) {
DuringAnalysisAccessImpl access = (DuringAnalysisAccessImpl) a;
if (!modified) {
return;
}
modified = false;
access.requireAnalysisIteration();
Method reflectionDataMethod = findMethod(Class.class, "reflectionData");
Class<?> originalReflectionDataClass = access.getImageClassLoader().findClassByName("java.lang.Class$ReflectionData");
Field declaredFieldsField = findField(originalReflectionDataClass, "declaredFields");
Field publicFieldsField = findField(originalReflectionDataClass, "publicFields");
Field declaredMethodsField = findField(originalReflectionDataClass, "declaredMethods");
Field publicMethodsField = findField(originalReflectionDataClass, "publicMethods");
Field declaredConstructorsField = findField(originalReflectionDataClass, "declaredConstructors");
Field publicConstructorsField = findField(originalReflectionDataClass, "publicConstructors");
Field declaredPublicFieldsField = findField(originalReflectionDataClass, "declaredPublicFields");
Field declaredPublicMethodsField = findField(originalReflectionDataClass, "declaredPublicMethods");
Field[] emptyFields = new Field[0];
Method[] emptyMethods = new Method[0];
Constructor<?>[] emptyConstructors = new Constructor<?>[0];
Set<Class<?>> allClasses = new HashSet<>(reflectionClasses);
reflectionMethods.stream().map(method -> method.getDeclaringClass()).forEach(clazz -> allClasses.add(clazz));
reflectionFields.stream().map(field -> field.getDeclaringClass()).forEach(clazz -> allClasses.add(clazz));
/*
* We need to find all classes that have an enclosingMethod or enclosingConstructor.
* Unfortunately, there is no reverse lookup (ask a Method or Constructor about the classes
* they contain), so we need to iterate through all types that have been loaded so far.
* Accessing the original java.lang.Class for a ResolvedJavaType is not 100% reliable,
* especially in the case of class and method substitutions. But it is the best we can do
* here, and we assume that user code that requires reflection support is not using
* substitutions.
*/
for (AnalysisType aType : access.getUniverse().getTypes()) {
Class<?> originalClass = aType.getJavaClass();
if (originalClass != null && enclosingMethodOrConstructor(originalClass) != null) {
/*
* We haven an enclosing method or constructor for this class, so we add the class
* to the set of processed classes so that the ReflectionData is initialized below.
*/
allClasses.add(originalClass);
}
}
for (Class<?> clazz : allClasses) {
DynamicHub hub = access.getHostVM().dynamicHub(access.getMetaAccess().lookupJavaType(clazz));
if (reflectionClasses.contains(clazz)) {
ClassForNameSupport.registerClass(clazz);
}
/*
* Ensure all internal fields of the original Class.ReflectionData object are
* initialized. Calling the public methods triggers lazy initialization of the fields.
*/
clazz.getDeclaredFields();
clazz.getFields();
clazz.getDeclaredMethods();
clazz.getMethods();
clazz.getDeclaredConstructors();
clazz.getConstructors();
try {
Object originalReflectionData = reflectionDataMethod.invoke(clazz);
hub.setReflectionData(new DynamicHub.ReflectionData(filter(declaredFieldsField.get(originalReflectionData), reflectionFields, emptyFields), filter(publicFieldsField.get(originalReflectionData), reflectionFields, emptyFields), filter(declaredMethodsField.get(originalReflectionData), reflectionMethods, emptyMethods), filter(publicMethodsField.get(originalReflectionData), reflectionMethods, emptyMethods), filter(declaredConstructorsField.get(originalReflectionData), reflectionMethods, emptyConstructors), filter(publicConstructorsField.get(originalReflectionData), reflectionMethods, emptyConstructors), nullaryConstructor(declaredConstructorsField.get(originalReflectionData), reflectionMethods), filter(declaredPublicFieldsField.get(originalReflectionData), reflectionFields, emptyFields), filter(declaredPublicMethodsField.get(originalReflectionData), reflectionMethods, emptyMethods), enclosingMethodOrConstructor(clazz)));
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
throw VMError.shouldNotReachHere(ex);
}
}
}
Aggregations