< 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 >