Skip to content

Commit da5da42

Browse files
committed
Fixes for various linkage errors
These happen when all elements are included for reflection.
1 parent 87f88bb commit da5da42

File tree

4 files changed

+17
-11
lines changed

4 files changed

+17
-11
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import static com.oracle.svm.core.MissingRegistrationUtils.throwMissingRegistrationErrors;
2828

29+
import java.lang.reflect.Modifier;
2930
import java.util.EnumSet;
3031
import java.util.Objects;
3132

@@ -159,7 +160,7 @@ public void registerNegativeQuery(ConfigurationCondition condition, String class
159160

160161
@Platforms(Platform.HOSTED_ONLY.class)
161162
public void registerUnsafeAllocated(ConfigurationCondition condition, Class<?> clazz) {
162-
if (!clazz.isArray()) {
163+
if (!clazz.isArray() && !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers())) {
163164
var conditionSet = unsafeInstantiatedClasses.putIfAbsent(clazz, RuntimeConditionSet.createHosted(condition));
164165
if (conditionSet != null) {
165166
conditionSet.addCondition(condition);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,11 @@
6464
import java.util.Set;
6565
import java.util.concurrent.Callable;
6666
import java.util.concurrent.ConcurrentHashMap;
67+
import java.util.concurrent.atomic.AtomicBoolean;
6768
import java.util.function.Consumer;
6869
import java.util.stream.Collectors;
6970

71+
import com.oracle.svm.core.jdk.UninterruptibleUtils;
7072
import org.graalvm.nativeimage.ImageSingletons;
7173
import org.graalvm.nativeimage.hosted.RuntimeProxyCreation;
7274
import org.graalvm.nativeimage.hosted.RuntimeReflection;
@@ -530,7 +532,7 @@ public void register(ConfigurationCondition condition, boolean finalIsWritable,
530532
}
531533

532534
@Override
533-
public void registerAllFieldsQuery(ConfigurationCondition condition, Class<?> clazz) {
535+
public void registerAllFields(ConfigurationCondition condition, Class<?> clazz) {
534536
registerAllFieldsQuery(condition, false, clazz);
535537
}
536538

@@ -549,7 +551,7 @@ public void registerAllFieldsQuery(ConfigurationCondition condition, boolean que
549551
}
550552

551553
@Override
552-
public void registerAllDeclaredFieldsQuery(ConfigurationCondition condition, Class<?> clazz) {
554+
public void registerAllDeclaredFields(ConfigurationCondition condition, Class<?> clazz) {
553555
registerAllDeclaredFieldsQuery(condition, false, clazz);
554556
}
555557

@@ -580,16 +582,13 @@ private void registerField(ConfigurationCondition cnd, boolean queriedOnly, Fiel
580582

581583
var classFields = registeredFields.computeIfAbsent(declaringClass, t -> new ConcurrentHashMap<>());
582584
boolean exists = classFields.containsKey(analysisField);
585+
// TODO open a ticket to disallow
583586
boolean shouldRegisterReachabilityHandler = classFields.isEmpty();
584587
var cndValue = classFields.computeIfAbsent(analysisField, f -> new ConditionalRuntimeValue<>(RuntimeConditionSet.emptySet(), reflectField));
585-
if (!queriedOnly) {
586-
/* queryOnly methods are conditioned by the type itself */
587-
cndValue.getConditions().addCondition(cnd);
588-
}
589-
590588
if (!exists) {
591-
registerTypesForField(analysisField, reflectField, true);
589+
registerTypesForField(analysisField, reflectField, queriedOnly);
592590

591+
// TODO bulk it up
593592
/*
594593
* The image needs to know about subtypes shadowing fields registered for reflection to
595594
* ensure the correctness of run-time reflection queries.
@@ -620,6 +619,8 @@ private void registerField(ConfigurationCondition cnd, boolean queriedOnly, Fiel
620619
* registered as queried.
621620
*/
622621
if (!queriedOnly) {
622+
/* queryOnly methods are conditioned on the type itself */
623+
cndValue.getConditions().addCondition(cnd);
623624
registerTypesForField(analysisField, reflectField, false);
624625
}
625626
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
5959

6060
import com.oracle.graal.pointsto.util.GraalAccess;
61+
import com.oracle.svm.core.MissingRegistrationSupport;
6162
import com.oracle.svm.core.configure.ConfigurationConditionResolver;
6263
import com.oracle.svm.core.configure.ConfigurationFile;
6364
import com.oracle.svm.core.configure.ConfigurationFiles;
@@ -504,7 +505,8 @@ private void registerForSerialization(ConfigurationCondition cnd, Class<?> seria
504505
* serialization class consistency, so need to register all constructors, methods and
505506
* fields.
506507
*/
507-
registerSerializationUIDElements(serializationTargetClass, true); // if MRE
508+
boolean legacyFullyRegister = !MissingRegistrationSupport.singleton().reportMissingRegistrationErrors(serializationTargetClass);
509+
registerSerializationUIDElements(serializationTargetClass, legacyFullyRegister);
508510

509511
/*
510512
* Required by jdk.internal.reflect.ReflectionFactory.newConstructorForSerialization
@@ -564,7 +566,6 @@ static void registerSerializationUIDElements(Class<?> serializationTargetClass,
564566
/* Handled by registrations above */
565567
}
566568
}
567-
RuntimeReflection.registerFieldLookup(serializationTargetClass, "serialPersistentFields");
568569
}
569570

570571
public void afterAnalysis() {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.oracle.svm.core.annotate.InjectAccessors;
3737
import com.oracle.svm.core.annotate.TargetClass;
3838

39+
import jdk.graal.compiler.api.replacements.Fold;
3940
import jdk.vm.ci.meta.ResolvedJavaType;
4041

4142
/**
@@ -74,6 +75,8 @@ public static boolean shouldExclude(Executable method, AnalysisMetaAccess metaAc
7475
return true;
7576
} else if (aMethod.isAnnotationPresent(Delete.class)) {
7677
return true; // accesses would fail at runtime
78+
} else if (aMethod.isAnnotationPresent(Fold.class)) {
79+
return true; // accesses can contain hosted elements
7780
} else if (aMethod.isSynthetic() && aMethod.getDeclaringClass().isAnnotationPresent(TargetClass.class)) {
7881
/*
7982
* Synthetic methods are usually methods injected by javac to provide access to

0 commit comments

Comments
 (0)