@@ -161,7 +161,6 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav
161161 * implement a method.
162162 */
163163 private static final Object NULL_METHOD = new Object ();
164- private static final Object COMPUTING_FALLBACK_RESOLUTION = new Object ();
165164
166165 private final AnalysisType componentType ;
167166 private final AnalysisType elementalType ;
@@ -1118,7 +1117,6 @@ public AnalysisMethod resolveConcreteMethod(ResolvedJavaMethod method, ResolvedJ
11181117 if (resolvedMethod == null ) {
11191118 ResolvedJavaMethod originalMethod = OriginalMethodProvider .getOriginalMethod (method );
11201119 Object newResolvedMethod = null ;
1121- boolean computingFallback = false ;
11221120 if (originalMethod != null ) {
11231121 /*
11241122 * We do not want any access checks to be performed, so we use the method's
@@ -1130,27 +1128,7 @@ public AnalysisMethod resolveConcreteMethod(ResolvedJavaMethod method, ResolvedJ
11301128 var concreteMethod = originalMethod instanceof BaseLayerMethod ? originalMethod : wrapped .resolveConcreteMethod (originalMethod , originalCallerType );
11311129 newResolvedMethod = universe .lookup (concreteMethod );
11321130 if (newResolvedMethod == null ) {
1133- /*
1134- * Note we cannot directly use computeIfAbsent; calling
1135- * fallbackResolveConcreteMethod will potentially cause other entries to be
1136- * added to resolvedMethods, resulting in illegal recursive updates.
1137- */
1138- Object oldResolvedMethod = resolvedMethods .putIfAbsent (method , COMPUTING_FALLBACK_RESOLUTION );
1139- if (oldResolvedMethod == null ) {
1140- computingFallback = true ;
1141- try {
1142- newResolvedMethod = getUniverse ().getBigbang ().fallbackResolveConcreteMethod (this , (AnalysisMethod ) method );
1143- } catch (Throwable t ) {
1144- /* Finalize result if an error occurs. */
1145- resolvedMethods .compute (method , (k , v ) -> {
1146- assert v == COMPUTING_FALLBACK_RESOLUTION : v ;
1147- return NULL_METHOD ;
1148- });
1149- computingFallback = false ;
1150-
1151- throw t ;
1152- }
1153- }
1131+ newResolvedMethod = getUniverse ().getBigbang ().fallbackResolveConcreteMethod (this , (AnalysisMethod ) method );
11541132 }
11551133
11561134 } catch (UnsupportedFeatureException e ) {
@@ -1162,32 +1140,9 @@ public AnalysisMethod resolveConcreteMethod(ResolvedJavaMethod method, ResolvedJ
11621140 if (newResolvedMethod == null ) {
11631141 newResolvedMethod = NULL_METHOD ;
11641142 }
1165-
1166- if (computingFallback ) {
1167- /*
1168- * If computingFallback is set, it is this thread's responsibility to install the
1169- * result and override the placeholder put in the map.
1170- */
1171- var finalResolvedMethod = newResolvedMethod ;
1172- resolvedMethods .compute (method , (k , v ) -> {
1173- assert v == COMPUTING_FALLBACK_RESOLUTION : v ;
1174- return finalResolvedMethod ;
1175- });
1176- resolvedMethod = newResolvedMethod ;
1177- } else {
1178- Object oldResolvedMethod = resolvedMethods .putIfAbsent (method , newResolvedMethod );
1179- resolvedMethod = oldResolvedMethod != null ? oldResolvedMethod : newResolvedMethod ;
1180- }
1181- }
1182-
1183- /*
1184- * Wait for fallback resolution computation to complete on another thread (if needed).
1185- */
1186- while (resolvedMethod == COMPUTING_FALLBACK_RESOLUTION ) {
1187- Thread .onSpinWait ();
1188- resolvedMethod = resolvedMethods .get (method );
1143+ Object oldResolvedMethod = resolvedMethods .putIfAbsent (method , newResolvedMethod );
1144+ resolvedMethod = oldResolvedMethod != null ? oldResolvedMethod : newResolvedMethod ;
11891145 }
1190- assert resolvedMethod != null ;
11911146 return resolvedMethod == NULL_METHOD ? null : (AnalysisMethod ) resolvedMethod ;
11921147 }
11931148
0 commit comments