< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java
Print this page
*** 20,35 ****
* 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.HotSpotConstantReflectionProvider.Options.*;
! import java.lang.reflect.*;
! import jdk.vm.ci.meta.*;
! import jdk.vm.ci.options.*;
/**
* HotSpot implementation of {@link ConstantReflectionProvider}.
*/
public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
--- 20,47 ----
* 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 jdk.vm.ci.meta.Constant;
! import jdk.vm.ci.meta.ConstantReflectionProvider;
! import jdk.vm.ci.meta.JavaConstant;
! import jdk.vm.ci.meta.JavaField;
! 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.ResolvedJavaType;
! import jdk.vm.ci.options.Option;
! import jdk.vm.ci.options.OptionType;
! import jdk.vm.ci.options.OptionValue;
! import jdk.vm.ci.options.StableOptionValue;
/**
* HotSpot implementation of {@link ConstantReflectionProvider}.
*/
public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
*** 59,73 ****
public MemoryAccessProvider getMemoryAccessProvider() {
return memoryAccess;
}
@Override
- public boolean isEmbeddable(Constant constant) {
- return true;
- }
-
- @Override
public Boolean constantEquals(Constant x, Constant y) {
if (x == y) {
return true;
} else if (x instanceof HotSpotObjectConstantImpl) {
return y instanceof HotSpotObjectConstantImpl && ((HotSpotObjectConstantImpl) x).object() == ((HotSpotObjectConstantImpl) y).object();
--- 71,80 ----
*** 108,119 ****
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 = runtime.getArrayBaseOffset(kind);
! int scale = runtime.getArrayIndexScale(kind);
if (offset < arraybase) {
return -1;
}
long index = offset - arraybase;
if (index % scale != 0) {
--- 115,126 ----
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) {
*** 205,224 ****
public JavaConstant forString(String value) {
return HotSpotObjectConstantImpl.forObject(value);
}
@Override
public ResolvedJavaType asJavaType(Constant constant) {
if (constant instanceof HotSpotObjectConstant) {
Object obj = ((HotSpotObjectConstantImpl) constant).object();
if (obj instanceof Class) {
return runtime.getHostJVMCIBackend().getMetaAccess().lookupJavaType((Class<?>) obj);
}
}
if (constant instanceof HotSpotMetaspaceConstant) {
! Object obj = HotSpotMetaspaceConstantImpl.getMetaspaceObject(constant);
if (obj instanceof HotSpotResolvedObjectTypeImpl) {
return (ResolvedJavaType) obj;
}
}
return null;
--- 212,235 ----
public JavaConstant forString(String value) {
return HotSpotObjectConstantImpl.forObject(value);
}
+ public JavaConstant forObject(Object value) {
+ return HotSpotObjectConstantImpl.forObject(value);
+ }
+
@Override
public ResolvedJavaType asJavaType(Constant constant) {
if (constant instanceof HotSpotObjectConstant) {
Object obj = ((HotSpotObjectConstantImpl) constant).object();
if (obj instanceof Class) {
return runtime.getHostJVMCIBackend().getMetaAccess().lookupJavaType((Class<?>) obj);
}
}
if (constant instanceof HotSpotMetaspaceConstant) {
! MetaspaceWrapperObject obj = HotSpotMetaspaceConstantImpl.getMetaspaceObject(constant);
if (obj instanceof HotSpotResolvedObjectTypeImpl) {
return (ResolvedJavaType) obj;
}
}
return null;
*** 249,259 ****
* @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() || TrustFinalDefaultFields.getValue();
}
/**
* 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
--- 260,270 ----
* @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() || Options.TrustFinalDefaultFields.getValue();
}
/**
* 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
*** 325,335 ****
public JavaConstant readFieldValue(JavaField field, JavaConstant receiver) {
HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field;
if (!hotspotField.isStable()) {
return readNonStableFieldValue(field, receiver);
} else {
! return readStableFieldValue(field, receiver, false);
}
}
private JavaConstant readNonStableFieldValue(JavaField field, JavaConstant receiver) {
HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field;
--- 336,346 ----
public JavaConstant readFieldValue(JavaField field, JavaConstant receiver) {
HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field;
if (!hotspotField.isStable()) {
return readNonStableFieldValue(field, receiver);
} else {
! return readStableFieldValue(field, receiver, hotspotField.isDefaultStable());
}
}
private JavaConstant readNonStableFieldValue(JavaField field, JavaConstant receiver) {
HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field;
< prev index next >