Search in sources :

Example 26 with DynamicHub

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;
}
Also used : UnsignedWord(org.graalvm.word.UnsignedWord) DynamicHub(com.oracle.svm.core.hub.DynamicHub)

Example 27 with DynamicHub

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;
}
Also used : UnsignedWord(org.graalvm.word.UnsignedWord) DynamicHub(com.oracle.svm.core.hub.DynamicHub) Pointer(org.graalvm.word.Pointer)

Example 28 with DynamicHub

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);
        }
    }
}
Also used : Arrays(java.util.Arrays) AccessibleObject(java.lang.reflect.AccessibleObject) DuringAnalysisAccess(org.graalvm.nativeimage.Feature.DuringAnalysisAccess) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) DynamicHub(com.oracle.svm.core.hub.DynamicHub) DuringAnalysisAccessImpl(com.oracle.svm.hosted.FeatureImpl.DuringAnalysisAccessImpl) Field(java.lang.reflect.Field) Constructor(java.lang.reflect.Constructor) InvocationTargetException(java.lang.reflect.InvocationTargetException) ArrayList(java.util.ArrayList) AnalysisType(com.oracle.graal.pointsto.meta.AnalysisType) VMError(com.oracle.svm.core.util.VMError) HashSet(java.util.HashSet) List(java.util.List) UserError(com.oracle.svm.core.util.UserError) Executable(java.lang.reflect.Executable) ClassForNameSupport(com.oracle.svm.core.hub.ClassForNameSupport) Method(java.lang.reflect.Method) Collections(java.util.Collections) RuntimeReflectionSupport(com.oracle.svm.core.RuntimeReflection.RuntimeReflectionSupport) AnalysisType(com.oracle.graal.pointsto.meta.AnalysisType) Constructor(java.lang.reflect.Constructor) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) Field(java.lang.reflect.Field) DynamicHub(com.oracle.svm.core.hub.DynamicHub) DuringAnalysisAccessImpl(com.oracle.svm.hosted.FeatureImpl.DuringAnalysisAccessImpl) AccessibleObject(java.lang.reflect.AccessibleObject) HashSet(java.util.HashSet)

Aggregations

DynamicHub (com.oracle.svm.core.hub.DynamicHub)28 UnsignedWord (org.graalvm.word.UnsignedWord)11 AnalysisType (com.oracle.graal.pointsto.meta.AnalysisType)5 ObjectLayout (com.oracle.svm.core.config.ObjectLayout)4 JavaConstant (jdk.vm.ci.meta.JavaConstant)4 JavaKind (jdk.vm.ci.meta.JavaKind)4 SVMHost (com.oracle.svm.hosted.SVMHost)3 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3 Snippet (org.graalvm.compiler.api.replacements.Snippet)3 Pointer (org.graalvm.word.Pointer)3 AnalysisField (com.oracle.graal.pointsto.meta.AnalysisField)2 SubstrateObjectConstant (com.oracle.svm.core.meta.SubstrateObjectConstant)2 SubstrateType (com.oracle.svm.graal.meta.SubstrateType)2 HostedField (com.oracle.svm.hosted.meta.HostedField)2 HostedType (com.oracle.svm.hosted.meta.HostedType)2 Arrays (java.util.Arrays)2 HashSet (java.util.HashSet)2 BigBang (com.oracle.graal.pointsto.BigBang)1 ObjectScanner (com.oracle.graal.pointsto.ObjectScanner)1