src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMetaAccessProvider.java
--- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMetaAccessProvider.java Wed May 01 12:41:26 2019 -0400
+++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMetaAccessProvider.java Wed May 01 12:31:29 2019 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,6 @@
*/
package jdk.vm.ci.hotspot;
-import static jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.fromObjectClass;
-import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
-
-import java.lang.reflect.Array;
import java.lang.reflect.Executable;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
@@ -43,6 +39,8 @@
import jdk.vm.ci.meta.ResolvedJavaType;
import jdk.vm.ci.meta.Signature;
import jdk.vm.ci.meta.SpeculationLog;
+import jdk.vm.ci.meta.SpeculationLog.NoSpeculationReason;
+import jdk.vm.ci.meta.SpeculationLog.Speculation;
// JaCoCo Exclude
@@ -87,20 +85,19 @@
public ResolvedJavaField lookupJavaField(Field reflectionField) {
Class<?> fieldHolder = reflectionField.getDeclaringClass();
- HotSpotResolvedObjectType holder = fromObjectClass(fieldHolder);
+ HotSpotResolvedJavaType holder = runtime.fromClass(fieldHolder);
+ assert holder != null : fieldHolder;
+ ResolvedJavaField[] fields;
if (Modifier.isStatic(reflectionField.getModifiers())) {
- final long offset = UNSAFE.staticFieldOffset(reflectionField);
- for (ResolvedJavaField field : holder.getStaticFields()) {
- if (offset == ((HotSpotResolvedJavaField) field).getOffset()) {
- return field;
- }
- }
+ fields = holder.getStaticFields();
} else {
- final long offset = UNSAFE.objectFieldOffset(reflectionField);
- for (ResolvedJavaField field : holder.getInstanceFields(false)) {
- if (offset == ((HotSpotResolvedJavaField) field).getOffset()) {
- return field;
- }
+ fields = holder.getInstanceFields(false);
+ }
+ ResolvedJavaType fieldType = lookupJavaType(reflectionField.getType());
+ for (ResolvedJavaField field : fields) {
+ if (reflectionField.getName().equals(field.getName()) && field.getType().equals(fieldType)) {
+ assert Modifier.isStatic(reflectionField.getModifiers()) == field.isStatic();
+ return field;
}
}
@@ -147,19 +144,21 @@
}
@Override
- public JavaConstant encodeSpeculation(SpeculationLog.Speculation speculation) {
- if (speculation.getReason() instanceof SpeculationLog.NoSpeculationReason) {
+ public JavaConstant encodeSpeculation(Speculation speculation) {
+ if (speculation.getReason() instanceof NoSpeculationReason) {
return JavaConstant.LONG_0;
}
return ((HotSpotSpeculationLog.HotSpotSpeculation) speculation).getEncoding();
}
@Override
- public SpeculationLog.Speculation decodeSpeculation(JavaConstant constant, SpeculationLog speculationLog) {
+ public Speculation decodeSpeculation(JavaConstant constant, SpeculationLog speculationLog) {
if (constant.equals(JavaConstant.LONG_0)) {
return SpeculationLog.NO_SPECULATION;
}
- assert speculationLog != null : "Must have a speculation log";
+ if (speculationLog == null) {
+ throw new IllegalArgumentException("A speculation log is required to decode the speculation denoted by " + constant);
+ }
return speculationLog.lookupSpeculation(constant);
}
@@ -303,11 +302,11 @@
return 0;
} else {
if (lookupJavaType.isArray()) {
- int length = Array.getLength(((HotSpotObjectConstantImpl) constant).object());
+ int length = runtime.getHostJVMCIBackend().getConstantReflection().readArrayLength(constant);
ResolvedJavaType elementType = lookupJavaType.getComponentType();
JavaKind elementKind = elementType.getJavaKind();
- final int headerSize = getArrayBaseOffset(elementKind);
- int sizeOfElement = getArrayIndexScale(elementKind);
+ final int headerSize = runtime.getArrayBaseOffset(elementKind);
+ int sizeOfElement = runtime.getArrayIndexScale(elementKind);
int log2ElementSize = CodeUtil.log2(sizeOfElement);
return computeArrayAllocationSize(length, headerSize, log2ElementSize);
}