Skip to content

Commit 15482d6

Browse files
committed
[GR-37155] Support ClassLoader.getClassLoadingLock
PullRequest: graal/11175
2 parents f26c8af + e6d498d commit 15482d6

File tree

3 files changed

+34
-19
lines changed

3 files changed

+34
-19
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/annotate/RecomputeFieldValue.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ enum Kind {
6060
* default constructor.
6161
*/
6262
NewInstance,
63+
/**
64+
* The object field is set to a instance of {@link #declClass} created by calling the
65+
* default constructor when the target field value is not null.
66+
*/
67+
NewInstanceWhenNotNull,
6368
/**
6469
* The field is set to the value assigned to the {@link Alias} field.
6570
*/

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_lang_ClassLoader.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public final class Target_java_lang_ClassLoader {
7474
@Alias @RecomputeFieldValue(kind = Kind.Reset)//
7575
private Vector<Class<?>> classes;
7676

77-
@Alias @RecomputeFieldValue(kind = Kind.Reset)//
77+
@Alias @RecomputeFieldValue(kind = Kind.NewInstanceWhenNotNull, declClass = ConcurrentHashMap.class)//
7878
private ConcurrentHashMap<String, Object> parallelLockMap;
7979

8080
/**
@@ -187,12 +187,6 @@ Class<?> loadClass(Module module, String name) {
187187
}
188188
}
189189

190-
@Substitute //
191-
@SuppressWarnings({"unused"})
192-
Object getClassLoadingLock(String className) {
193-
throw VMError.unsupportedFeature("Target_java_lang_ClassLoader.getClassLoadingLock(String)");
194-
}
195-
196190
@Substitute //
197191
@SuppressWarnings({"unused"}) //
198192
private Class<?> findLoadedClass0(String name) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/ComputedValueField.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -316,13 +316,14 @@ public JavaConstant readValue(MetaAccessProvider metaAccess, JavaConstant receiv
316316
private JavaConstant computeValue(MetaAccessProvider metaAccess, JavaConstant receiver) {
317317
SnippetReflectionProvider originalSnippetReflection = GraalAccess.getOriginalSnippetReflection();
318318
JavaConstant result;
319+
Object originalValue;
319320
switch (kind) {
321+
case NewInstanceWhenNotNull:
322+
originalValue = fetchOriginalValue(metaAccess, receiver, originalSnippetReflection);
323+
result = originalValue == null ? originalSnippetReflection.forObject(null) : createNewInstance(originalSnippetReflection);
324+
break;
320325
case NewInstance:
321-
try {
322-
result = originalSnippetReflection.forObject(ReflectionUtil.newInstance(targetClass));
323-
} catch (ReflectionUtilError ex) {
324-
throw VMError.shouldNotReachHere("Error performing field recomputation for alias " + annotated.format("%H.%n"), ex.getCause());
325-
}
326+
result = createNewInstance(originalSnippetReflection);
326327
break;
327328
case AtomicFieldUpdaterOffset:
328329
result = computeAtomicFieldUpdaterOffset(metaAccess, receiver);
@@ -336,13 +337,7 @@ private JavaConstant computeValue(MetaAccessProvider metaAccess, JavaConstant re
336337
if (customValueProvider instanceof CustomFieldValueComputer) {
337338
newValue = ((CustomFieldValueComputer) customValueProvider).compute(metaAccess, original, annotated, receiverValue);
338339
} else if (customValueProvider instanceof CustomFieldValueTransformer) {
339-
JavaConstant originalValueConstant = ReadableJavaField.readFieldValue(metaAccess, GraalAccess.getOriginalProviders().getConstantReflection(), original, receiver);
340-
Object originalValue;
341-
if (originalValueConstant.getJavaKind().isPrimitive()) {
342-
originalValue = originalValueConstant.asBoxedPrimitive();
343-
} else {
344-
originalValue = originalSnippetReflection.asObject(Object.class, originalValueConstant);
345-
}
340+
originalValue = fetchOriginalValue(metaAccess, receiver, originalSnippetReflection);
346341
newValue = ((CustomFieldValueTransformer) customValueProvider).transform(metaAccess, original, annotated, receiverValue, originalValue);
347342
} else {
348343
throw UserError.abort("The custom field value computer class %s does not implement %s or %s", targetClass.getName(),
@@ -360,6 +355,27 @@ private JavaConstant computeValue(MetaAccessProvider metaAccess, JavaConstant re
360355
return result;
361356
}
362357

358+
private JavaConstant createNewInstance(SnippetReflectionProvider originalSnippetReflection) {
359+
JavaConstant result;
360+
try {
361+
result = originalSnippetReflection.forObject(ReflectionUtil.newInstance(targetClass));
362+
} catch (ReflectionUtilError ex) {
363+
throw VMError.shouldNotReachHere("Error performing field recomputation for alias " + annotated.format("%H.%n"), ex.getCause());
364+
}
365+
return result;
366+
}
367+
368+
private Object fetchOriginalValue(MetaAccessProvider metaAccess, JavaConstant receiver, SnippetReflectionProvider originalSnippetReflection) {
369+
JavaConstant originalValueConstant = ReadableJavaField.readFieldValue(metaAccess, GraalAccess.getOriginalProviders().getConstantReflection(), original, receiver);
370+
Object originalValue;
371+
if (originalValueConstant.getJavaKind().isPrimitive()) {
372+
originalValue = originalValueConstant.asBoxedPrimitive();
373+
} else {
374+
originalValue = originalSnippetReflection.asObject(Object.class, originalValueConstant);
375+
}
376+
return originalValue;
377+
}
378+
363379
private void putCached(JavaConstant receiver, JavaConstant result) {
364380
if (disableCaching) {
365381
return;

0 commit comments

Comments
 (0)