1 /* 2 * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 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 jdk.vm.ci.meta.Assumptions.AssumptionResult; 26 import jdk.vm.ci.meta.Constant; 27 import jdk.vm.ci.meta.ConstantPool; 28 import jdk.vm.ci.meta.JavaConstant; 29 import jdk.vm.ci.meta.JavaKind; 30 import jdk.vm.ci.meta.JavaType; 31 import jdk.vm.ci.meta.ResolvedJavaMethod; 32 import jdk.vm.ci.meta.ResolvedJavaType; 33 34 /** 35 * Implementation of {@link JavaType} for resolved non-primitive HotSpot classes. 36 */ 37 public interface HotSpotResolvedObjectType extends ResolvedJavaType { 38 39 @Override getArrayClass()40 HotSpotResolvedObjectType getArrayClass(); 41 42 @Override getComponentType()43 ResolvedJavaType getComponentType(); 44 45 @Override findLeafConcreteSubtype()46 AssumptionResult<ResolvedJavaType> findLeafConcreteSubtype(); 47 48 @Override getSuperclass()49 HotSpotResolvedObjectType getSuperclass(); 50 51 @Override getInterfaces()52 HotSpotResolvedObjectType[] getInterfaces(); 53 getSupertype()54 HotSpotResolvedObjectType getSupertype(); 55 56 @Override findLeastCommonAncestor(ResolvedJavaType otherType)57 HotSpotResolvedObjectType findLeastCommonAncestor(ResolvedJavaType otherType); 58 59 @Override isPrimitive()60 default boolean isPrimitive() { 61 return false; 62 } 63 64 @Override getJavaKind()65 default JavaKind getJavaKind() { 66 return JavaKind.Object; 67 } 68 getConstantPool()69 ConstantPool getConstantPool(); 70 71 /** 72 * Gets the instance size of this type. If an instance of this type cannot be fast path 73 * allocated, then the returned value is negative (its absolute value gives the size). Must not 74 * be called if this is an array or interface type. 75 */ instanceSize()76 int instanceSize(); 77 getVtableLength()78 int getVtableLength(); 79 80 @Override findUniqueConcreteMethod(ResolvedJavaMethod method)81 AssumptionResult<ResolvedJavaMethod> findUniqueConcreteMethod(ResolvedJavaMethod method); 82 83 /** 84 * Performs a fast-path check that this type is resolved in the context of a given accessing 85 * class. A negative result does not mean this type is not resolved with respect to 86 * {@code accessingClass}. That can only be determined by 87 * {@linkplain HotSpotJVMCIRuntime#lookupType(String, HotSpotResolvedObjectType, boolean) 88 * re-resolving} the type. 89 */ isDefinitelyResolvedWithRespectTo(ResolvedJavaType accessingClass)90 boolean isDefinitelyResolvedWithRespectTo(ResolvedJavaType accessingClass); 91 92 /** 93 * Gets the metaspace Klass boxed in a {@link JavaConstant}. 94 */ klass()95 Constant klass(); 96 isPrimaryType()97 boolean isPrimaryType(); 98 superCheckOffset()99 int superCheckOffset(); 100 prototypeMarkWord()101 long prototypeMarkWord(); 102 layoutHelper()103 int layoutHelper(); 104 105 @Override getEnclosingType()106 HotSpotResolvedObjectType getEnclosingType(); 107 108 @Override getClassInitializer()109 ResolvedJavaMethod getClassInitializer(); 110 111 /** 112 * Checks whether this type is an unsafe anonymous class. 113 * 114 * @return {@code true} if this type is an unsafe anonymous class 115 */ isUnsafeAnonymous()116 boolean isUnsafeAnonymous(); 117 118 /** 119 * Checks whether this type is an unsafe anonymous class. 120 * This method is here to maintain compatibility with JDK11. 121 * 122 * @return {@code true} if this type is an unsafe anonymous class 123 */ isAnonymous()124 default boolean isAnonymous() { 125 return isUnsafeAnonymous(); 126 } 127 128 /** 129 * Gets the fingerprint for this type. 130 * 131 * @return the value of the fingerprint ({@code 0} for arrays and synthetic classes or if the VM 132 * does not support fingerprints) 133 */ getFingerprint()134 long getFingerprint(); 135 } 136