39 import java.util.HashMap;
40
41 import jdk.vm.ci.common.JVMCIError;
42 import jdk.vm.ci.meta.Assumptions.AssumptionResult;
43 import jdk.vm.ci.meta.Assumptions.ConcreteMethod;
44 import jdk.vm.ci.meta.Assumptions.ConcreteSubtype;
45 import jdk.vm.ci.meta.Assumptions.LeafType;
46 import jdk.vm.ci.meta.Assumptions.NoFinalizableSubclass;
47 import jdk.vm.ci.meta.Constant;
48 import jdk.vm.ci.meta.JavaConstant;
49 import jdk.vm.ci.meta.JavaKind;
50 import jdk.vm.ci.meta.JavaType;
51 import jdk.vm.ci.meta.ModifiersProvider;
52 import jdk.vm.ci.meta.ResolvedJavaField;
53 import jdk.vm.ci.meta.ResolvedJavaMethod;
54 import jdk.vm.ci.meta.ResolvedJavaType;
55
56 /**
57 * Implementation of {@link JavaType} for resolved non-primitive HotSpot classes.
58 */
59 final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implements HotSpotResolvedObjectType, HotSpotProxified, MetaspaceWrapperObject {
60
61 /**
62 * The Java class this type represents.
63 */
64 private final Class<?> javaClass;
65 private HashMap<Long, HotSpotResolvedJavaField> fieldCache;
66 private HashMap<Long, HotSpotResolvedJavaMethodImpl> methodCache;
67 private HotSpotResolvedJavaField[] instanceFields;
68 private HotSpotResolvedObjectTypeImpl[] interfaces;
69 private HotSpotConstantPool constantPool;
70 final HotSpotJVMCIMetaAccessContext context;
71 private HotSpotResolvedObjectType arrayOfType;
72
73 /**
74 * Gets the JVMCI mirror for a {@link Class} object.
75 *
76 * @return the {@link HotSpotResolvedJavaType} corresponding to {@code javaClass}
77 */
78 static HotSpotResolvedObjectTypeImpl fromObjectClass(Class<?> javaClass) {
79 return (HotSpotResolvedObjectTypeImpl) runtime().fromClass(javaClass);
110 this.javaClass = javaClass;
111 this.context = context;
112 assert getName().charAt(0) != '[' || isArray() : getName();
113 }
114
115 /**
116 * Returns the name of this type as it would appear in a signature.
117 */
118 private static String getSignatureName(Class<?> javaClass) {
119 if (javaClass.isArray()) {
120 return javaClass.getName().replace('.', '/');
121 }
122 return "L" + javaClass.getName().replace('.', '/') + ";";
123 }
124
125 /**
126 * Gets the metaspace Klass for this type.
127 */
128 long getMetaspaceKlass() {
129 if (HotSpotJVMCIRuntime.getHostWordKind() == JavaKind.Long) {
130 return UNSAFE.getLong(javaClass, (long) config().klassOffset);
131 }
132 return UNSAFE.getInt(javaClass, (long) config().klassOffset) & 0xFFFFFFFFL;
133 }
134
135 public long getMetaspacePointer() {
136 return getMetaspaceKlass();
137 }
138
139 @Override
140 public int getModifiers() {
141 if (isArray()) {
142 return (getElementalType().getModifiers() & (Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED)) | Modifier.FINAL | Modifier.ABSTRACT;
143 } else {
144 return getAccessFlags() & ModifiersProvider.jvmClassModifiers();
145 }
146 }
147
148 public int getAccessFlags() {
149 HotSpotVMConfig config = config();
150 return UNSAFE.getInt(getMetaspaceKlass() + config.klassAccessFlagsOffset);
151 }
152
302 public HotSpotResolvedObjectType findLeastCommonAncestor(ResolvedJavaType otherType) {
303 if (otherType.isPrimitive()) {
304 return null;
305 } else {
306 HotSpotResolvedObjectTypeImpl t1 = this;
307 HotSpotResolvedObjectTypeImpl t2 = (HotSpotResolvedObjectTypeImpl) otherType;
308 while (true) {
309 if (t1.isAssignableFrom(t2)) {
310 return t1;
311 }
312 if (t2.isAssignableFrom(t1)) {
313 return t2;
314 }
315 t1 = t1.getSupertype();
316 t2 = t2.getSupertype();
317 }
318 }
319 }
320
321 @Override
322 public HotSpotResolvedObjectType asExactType() {
323 return isLeaf() ? this : null;
324 }
325
326 @Override
327 public AssumptionResult<Boolean> hasFinalizableSubclass() {
328 assert !isArray();
329 if (!compilerToVM().hasFinalizableSubclass(this)) {
330 return new AssumptionResult<>(false, new NoFinalizableSubclass(this));
331 }
332 return new AssumptionResult<>(true);
333 }
334
335 @Override
336 public boolean hasFinalizer() {
337 return (getAccessFlags() & config().jvmAccHasFinalizer) != 0;
338 }
339
340 @Override
341 public boolean isPrimitive() {
342 return false;
343 }
344
345 @Override
346 public boolean isArray() {
|
39 import java.util.HashMap;
40
41 import jdk.vm.ci.common.JVMCIError;
42 import jdk.vm.ci.meta.Assumptions.AssumptionResult;
43 import jdk.vm.ci.meta.Assumptions.ConcreteMethod;
44 import jdk.vm.ci.meta.Assumptions.ConcreteSubtype;
45 import jdk.vm.ci.meta.Assumptions.LeafType;
46 import jdk.vm.ci.meta.Assumptions.NoFinalizableSubclass;
47 import jdk.vm.ci.meta.Constant;
48 import jdk.vm.ci.meta.JavaConstant;
49 import jdk.vm.ci.meta.JavaKind;
50 import jdk.vm.ci.meta.JavaType;
51 import jdk.vm.ci.meta.ModifiersProvider;
52 import jdk.vm.ci.meta.ResolvedJavaField;
53 import jdk.vm.ci.meta.ResolvedJavaMethod;
54 import jdk.vm.ci.meta.ResolvedJavaType;
55
56 /**
57 * Implementation of {@link JavaType} for resolved non-primitive HotSpot classes.
58 */
59 final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implements HotSpotResolvedObjectType, MetaspaceWrapperObject {
60
61 /**
62 * The Java class this type represents.
63 */
64 private final Class<?> javaClass;
65 private HashMap<Long, HotSpotResolvedJavaField> fieldCache;
66 private HashMap<Long, HotSpotResolvedJavaMethodImpl> methodCache;
67 private HotSpotResolvedJavaField[] instanceFields;
68 private HotSpotResolvedObjectTypeImpl[] interfaces;
69 private HotSpotConstantPool constantPool;
70 final HotSpotJVMCIMetaAccessContext context;
71 private HotSpotResolvedObjectType arrayOfType;
72
73 /**
74 * Gets the JVMCI mirror for a {@link Class} object.
75 *
76 * @return the {@link HotSpotResolvedJavaType} corresponding to {@code javaClass}
77 */
78 static HotSpotResolvedObjectTypeImpl fromObjectClass(Class<?> javaClass) {
79 return (HotSpotResolvedObjectTypeImpl) runtime().fromClass(javaClass);
110 this.javaClass = javaClass;
111 this.context = context;
112 assert getName().charAt(0) != '[' || isArray() : getName();
113 }
114
115 /**
116 * Returns the name of this type as it would appear in a signature.
117 */
118 private static String getSignatureName(Class<?> javaClass) {
119 if (javaClass.isArray()) {
120 return javaClass.getName().replace('.', '/');
121 }
122 return "L" + javaClass.getName().replace('.', '/') + ";";
123 }
124
125 /**
126 * Gets the metaspace Klass for this type.
127 */
128 long getMetaspaceKlass() {
129 if (HotSpotJVMCIRuntime.getHostWordKind() == JavaKind.Long) {
130 return UNSAFE.getLong(javaClass, config().klassOffset);
131 }
132 return UNSAFE.getInt(javaClass, config().klassOffset) & 0xFFFFFFFFL;
133 }
134
135 public long getMetaspacePointer() {
136 return getMetaspaceKlass();
137 }
138
139 @Override
140 public int getModifiers() {
141 if (isArray()) {
142 return (getElementalType().getModifiers() & (Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED)) | Modifier.FINAL | Modifier.ABSTRACT;
143 } else {
144 return getAccessFlags() & ModifiersProvider.jvmClassModifiers();
145 }
146 }
147
148 public int getAccessFlags() {
149 HotSpotVMConfig config = config();
150 return UNSAFE.getInt(getMetaspaceKlass() + config.klassAccessFlagsOffset);
151 }
152
302 public HotSpotResolvedObjectType findLeastCommonAncestor(ResolvedJavaType otherType) {
303 if (otherType.isPrimitive()) {
304 return null;
305 } else {
306 HotSpotResolvedObjectTypeImpl t1 = this;
307 HotSpotResolvedObjectTypeImpl t2 = (HotSpotResolvedObjectTypeImpl) otherType;
308 while (true) {
309 if (t1.isAssignableFrom(t2)) {
310 return t1;
311 }
312 if (t2.isAssignableFrom(t1)) {
313 return t2;
314 }
315 t1 = t1.getSupertype();
316 t2 = t2.getSupertype();
317 }
318 }
319 }
320
321 @Override
322 public AssumptionResult<Boolean> hasFinalizableSubclass() {
323 assert !isArray();
324 if (!compilerToVM().hasFinalizableSubclass(this)) {
325 return new AssumptionResult<>(false, new NoFinalizableSubclass(this));
326 }
327 return new AssumptionResult<>(true);
328 }
329
330 @Override
331 public boolean hasFinalizer() {
332 return (getAccessFlags() & config().jvmAccHasFinalizer) != 0;
333 }
334
335 @Override
336 public boolean isPrimitive() {
337 return false;
338 }
339
340 @Override
341 public boolean isArray() {
|