< prev index next >
src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIMetaAccessContext.java
Print this page
rev 54629 : [mq]: 8218700
*** 1,7 ****
/*
! * Copyright (c) 2015, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2015, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 143,177 ****
} else {
return new HotSpotResolvedObjectTypeImpl(javaClass, this);
}
}
! private final ClassValue<WeakReference<ResolvedJavaType>> resolvedJavaType = new ClassValue<>() {
@Override
! protected WeakReference<ResolvedJavaType> computeValue(Class<?> type) {
! return new WeakReference<>(createClass(type));
}
};
/**
* Gets the JVMCI mirror for a {@link Class} object.
*
* @return the {@link ResolvedJavaType} corresponding to {@code javaClass}
*/
public ResolvedJavaType fromClass(Class<?> javaClass) {
! ResolvedJavaType javaType = null;
! while (javaType == null) {
! WeakReference<ResolvedJavaType> type = resolvedJavaType.get(javaClass);
! javaType = type.get();
if (javaType == null) {
/*
! * If the referent has become null, clear out the current value and let computeValue
! * above create a new value. Reload the value in a loop because in theory the
! * WeakReference referent can be reclaimed at any point.
*/
! resolvedJavaType.remove(javaClass);
! }
}
return javaType;
}
/**
--- 143,187 ----
} else {
return new HotSpotResolvedObjectTypeImpl(javaClass, this);
}
}
! private static class WeakTypeRef {
! private WeakReference<ResolvedJavaType> ref;
! WeakTypeRef(ResolvedJavaType value) {
! set(value);
! }
! void set(ResolvedJavaType value) {
! ref = new WeakReference<ResolvedJavaType>(value);
! }
! ResolvedJavaType get() {
! return ref.get();
! }
! };
!
! private final ClassValue<WeakTypeRef> resolvedJavaType = new ClassValue<>() {
@Override
! protected WeakTypeRef computeValue(Class<?> type) {
! return new WeakTypeRef(createClass(type));
}
};
/**
* Gets the JVMCI mirror for a {@link Class} object.
*
* @return the {@link ResolvedJavaType} corresponding to {@code javaClass}
*/
public ResolvedJavaType fromClass(Class<?> javaClass) {
! WeakTypeRef ref = resolvedJavaType.get(javaClass);
! ResolvedJavaType javaType = ref.get();
if (javaType == null) {
/*
! * If the referent has become null, create a new value and
! * update cached weak reference.
*/
! javaType = createClass(javaClass);
! ref.set(javaType);
}
return javaType;
}
/**
< prev index next >