< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java

Print this page

        

*** 20,43 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.hotspot; - import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset; - import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale; - import java.lang.reflect.Array; import java.util.Objects; import jdk.internal.vm.annotation.Stable; import jdk.vm.ci.common.JVMCIError; - import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option; import jdk.vm.ci.meta.Constant; import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; - import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.MemoryAccessProvider; import jdk.vm.ci.meta.MethodHandleAccessProvider; import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaType; --- 20,38 ----
*** 87,140 **** return null; } return Array.getLength(arrayObject); } - public JavaConstant readConstantArrayElement(JavaConstant array, int index) { - if (array instanceof HotSpotObjectConstantImpl && ((HotSpotObjectConstantImpl) array).getStableDimension() > 0) { - JavaConstant element = readArrayElement(array, index); - if (element != null && (((HotSpotObjectConstantImpl) array).isDefaultStable() || !element.isDefaultForKind())) { - return element; - } - } - return null; - } - - /** - * Try to convert {@code offset} into an an index into {@code array}. - * - * @return the computed index or -1 if the offset isn't within the array - */ - private int indexForOffset(JavaConstant array, long offset) { - if (array.getJavaKind() != JavaKind.Object || array.isNull()) { - return -1; - } - Class<?> componentType = ((HotSpotObjectConstantImpl) array).object().getClass().getComponentType(); - JavaKind kind = runtime.getHostJVMCIBackend().getMetaAccess().lookupJavaType(componentType).getJavaKind(); - int arraybase = getArrayBaseOffset(kind); - int scale = getArrayIndexScale(kind); - if (offset < arraybase) { - return -1; - } - long index = offset - arraybase; - if (index % scale != 0) { - return -1; - } - long result = index / scale; - if (result >= Integer.MAX_VALUE) { - return -1; - } - return (int) result; - } - - public JavaConstant readConstantArrayElementForOffset(JavaConstant array, long offset) { - if (array instanceof HotSpotObjectConstantImpl && ((HotSpotObjectConstantImpl) array).getStableDimension() > 0) { - return readConstantArrayElement(array, indexForOffset(array, offset)); - } - return null; - } - @Override public JavaConstant readArrayElement(JavaConstant array, int index) { if (array == null || array.getJavaKind() != JavaKind.Object || array.isNull()) { return null; } --- 82,91 ----
*** 144,158 **** return null; } if (a instanceof Object[]) { Object element = ((Object[]) a)[index]; - if (((HotSpotObjectConstantImpl) array).getStableDimension() > 1) { - return HotSpotObjectConstantImpl.forStableArray(element, ((HotSpotObjectConstantImpl) array).getStableDimension() - 1, ((HotSpotObjectConstantImpl) array).isDefaultStable()); - } else { return HotSpotObjectConstantImpl.forObject(element); - } } else { return JavaConstant.forBoxedPrimitive(Array.get(a, index)); } } --- 95,105 ----
*** 226,332 **** } } return null; } - private static final String SystemClassName = "Ljava/lang/System;"; - - /** - * Determines if a static field is constant for the purpose of - * {@link #readConstantFieldValue(ResolvedJavaField, JavaConstant)}. - */ - protected boolean isStaticFieldConstant(HotSpotResolvedJavaField staticField) { - if (staticField.isFinal() || (staticField.isStable() && runtime.getConfig().foldStableValues)) { - ResolvedJavaType holder = staticField.getDeclaringClass(); - if (holder.isInitialized() && !holder.getName().equals(SystemClassName)) { - return true; - } - } - return false; - } - - /** - * Determines if a value read from a {@code final} instance field is considered constant. The - * implementation in {@link HotSpotConstantReflectionProvider} returns true if {@code value} is - * not the {@link JavaConstant#isDefaultForKind default value} for its kind or if - * {@link Option#TrustFinalDefaultFields} is true. - * - * @param value a value read from a {@code final} instance field - * @param receiverClass the {@link Object#getClass() class} of object from which the - * {@code value} was read - */ - protected boolean isFinalInstanceFieldValueConstant(JavaConstant value, Class<?> receiverClass) { - return !value.isDefaultForKind() || Option.TrustFinalDefaultFields.getBoolean(); - } - - /** - * Determines if a value read from a {@link Stable} instance field is considered constant. The - * implementation in {@link HotSpotConstantReflectionProvider} returns true if {@code value} is - * not the {@link JavaConstant#isDefaultForKind default value} for its kind. - * - * @param value a value read from a {@link Stable} field - * @param receiverClass the {@link Object#getClass() class} of object from which the - * {@code value} was read - */ - protected boolean isStableInstanceFieldValueConstant(JavaConstant value, Class<?> receiverClass) { - return !value.isDefaultForKind(); - } - - public JavaConstant readConstantFieldValue(ResolvedJavaField field, JavaConstant receiver) { - HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field; - - if (hotspotField.isStatic()) { - if (isStaticFieldConstant(hotspotField)) { - JavaConstant value = readFieldValue(field, receiver); - if (hotspotField.isFinal() || !value.isDefaultForKind()) { - return value; - } - } - } else { - /* - * for non-static final fields, we must assume that they are only initialized if they - * have a non-default value. - */ - Object object = receiver.isNull() ? null : ((HotSpotObjectConstantImpl) receiver).object(); - - // Canonicalization may attempt to process an unsafe read before - // processing a guard (e.g. a null check or a type check) for this read - // so we need to check the object being read - if (object != null) { - if (hotspotField.isFinal()) { - if (hotspotField.isInObject(object)) { - JavaConstant value = readFieldValue(field, receiver); - if (isFinalInstanceFieldValueConstant(value, object.getClass())) { - return value; - } - } - } else if (hotspotField.isStable() && runtime.getConfig().foldStableValues) { - if (hotspotField.isInObject(object)) { - JavaConstant value = readFieldValue(field, receiver); - if (isStableInstanceFieldValueConstant(value, object.getClass())) { - return value; - } - } - } - } - } - return null; - } - public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) { HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field; - if (!hotspotField.isStable()) { - return readNonStableFieldValue(field, receiver); - } else if (runtime.getConfig().foldStableValues) { - return readStableFieldValue(field, receiver, hotspotField.isDefaultStable()); - } else { - return null; - } - } - - private JavaConstant readNonStableFieldValue(ResolvedJavaField field, JavaConstant receiver) { - HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field; if (hotspotField.isStatic()) { HotSpotResolvedJavaType holder = (HotSpotResolvedJavaType) hotspotField.getDeclaringClass(); if (holder.isInitialized()) { return memoryAccess.readUnsafeConstant(hotspotField.getJavaKind(), HotSpotObjectConstantImpl.forObject(holder.mirror()), hotspotField.offset()); } --- 173,184 ----
*** 336,366 **** } } return null; } - public JavaConstant readStableFieldValue(ResolvedJavaField field, JavaConstant receiver, boolean isDefaultStable) { - JavaConstant fieldValue = readNonStableFieldValue(field, receiver); - if (fieldValue != null && fieldValue.isNonNull()) { - JavaType declaredType = field.getType(); - if (declaredType.getComponentType() != null) { - int stableDimension = getArrayDimension(declaredType); - return HotSpotObjectConstantImpl.forStableArray(((HotSpotObjectConstantImpl) fieldValue).object(), stableDimension, isDefaultStable); - } - } - return fieldValue; - } - - private static int getArrayDimension(JavaType type) { - int dimensions = 0; - JavaType componentType = type; - while ((componentType = componentType.getComponentType()) != null) { - dimensions++; - } - return dimensions; - } - @Override public JavaConstant asJavaClass(ResolvedJavaType type) { return HotSpotObjectConstantImpl.forObject(((HotSpotResolvedJavaType) type).mirror()); } --- 188,197 ----
< prev index next >