10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package jdk.vm.ci.hotspot;
24
25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
26 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
27
28 import java.lang.reflect.Array;
29
30 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
31 import jdk.vm.ci.meta.Constant;
32 import jdk.vm.ci.meta.ConstantReflectionProvider;
33 import jdk.vm.ci.meta.JavaConstant;
34 import jdk.vm.ci.meta.JavaKind;
35 import jdk.vm.ci.meta.JavaType;
36 import jdk.vm.ci.meta.MemoryAccessProvider;
37 import jdk.vm.ci.meta.MethodHandleAccessProvider;
38 import jdk.vm.ci.meta.ResolvedJavaField;
39 import jdk.vm.ci.meta.ResolvedJavaType;
40
41 /**
42 * HotSpot implementation of {@link ConstantReflectionProvider}.
43 */
44 public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
45
46 protected final HotSpotJVMCIRuntimeProvider runtime;
47 protected final HotSpotMethodHandleAccessProvider methodHandleAccess;
48 protected final HotSpotMemoryAccessProviderImpl memoryAccess;
49
338 public JavaConstant readStableFieldValue(ResolvedJavaField field, JavaConstant receiver, boolean isDefaultStable) {
339 JavaConstant fieldValue = readNonStableFieldValue(field, receiver);
340 if (fieldValue.isNonNull()) {
341 JavaType declaredType = field.getType();
342 if (declaredType.getComponentType() != null) {
343 int stableDimension = getArrayDimension(declaredType);
344 return HotSpotObjectConstantImpl.forStableArray(((HotSpotObjectConstantImpl) fieldValue).object(), stableDimension, isDefaultStable);
345 }
346 }
347 return fieldValue;
348 }
349
350 private static int getArrayDimension(JavaType type) {
351 int dimensions = 0;
352 JavaType componentType = type;
353 while ((componentType = componentType.getComponentType()) != null) {
354 dimensions++;
355 }
356 return dimensions;
357 }
358 }
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package jdk.vm.ci.hotspot;
24
25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
26 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
27
28 import java.lang.reflect.Array;
29
30 import jdk.vm.ci.common.JVMCIError;
31 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
32 import jdk.vm.ci.meta.Constant;
33 import jdk.vm.ci.meta.ConstantReflectionProvider;
34 import jdk.vm.ci.meta.JavaConstant;
35 import jdk.vm.ci.meta.JavaKind;
36 import jdk.vm.ci.meta.JavaType;
37 import jdk.vm.ci.meta.MemoryAccessProvider;
38 import jdk.vm.ci.meta.MethodHandleAccessProvider;
39 import jdk.vm.ci.meta.ResolvedJavaField;
40 import jdk.vm.ci.meta.ResolvedJavaType;
41
42 /**
43 * HotSpot implementation of {@link ConstantReflectionProvider}.
44 */
45 public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
46
47 protected final HotSpotJVMCIRuntimeProvider runtime;
48 protected final HotSpotMethodHandleAccessProvider methodHandleAccess;
49 protected final HotSpotMemoryAccessProviderImpl memoryAccess;
50
339 public JavaConstant readStableFieldValue(ResolvedJavaField field, JavaConstant receiver, boolean isDefaultStable) {
340 JavaConstant fieldValue = readNonStableFieldValue(field, receiver);
341 if (fieldValue.isNonNull()) {
342 JavaType declaredType = field.getType();
343 if (declaredType.getComponentType() != null) {
344 int stableDimension = getArrayDimension(declaredType);
345 return HotSpotObjectConstantImpl.forStableArray(((HotSpotObjectConstantImpl) fieldValue).object(), stableDimension, isDefaultStable);
346 }
347 }
348 return fieldValue;
349 }
350
351 private static int getArrayDimension(JavaType type) {
352 int dimensions = 0;
353 JavaType componentType = type;
354 while ((componentType = componentType.getComponentType()) != null) {
355 dimensions++;
356 }
357 return dimensions;
358 }
359
360 @Override
361 public JavaConstant asJavaClass(ResolvedJavaType type) {
362 return HotSpotObjectConstantImpl.forObject(((HotSpotResolvedJavaType) type).mirror());
363 }
364
365 @Override
366 public Constant asObjectHub(ResolvedJavaType type) {
367 if (type instanceof HotSpotResolvedObjectType) {
368 return ((HotSpotResolvedObjectType) type).klass();
369 } else {
370 throw JVMCIError.unimplemented();
371 }
372 }
373 }
|