Skip to content

Commit e64260b

Browse files
committed
Enable serialization in -H:Preserve
1 parent 381adbb commit e64260b

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/PreserveOptionsSupport.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
4545
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
4646
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
47+
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
4748

4849
import com.oracle.graal.pointsto.ClassInclusionPolicy;
4950
import com.oracle.svm.core.SubstrateOptions;
@@ -152,6 +153,7 @@ public static void registerPreservedClasses(NativeImageClassLoaderSupport classL
152153
final RuntimeReflectionSupport reflection = ImageSingletons.lookup(RuntimeReflectionSupport.class);
153154
final RuntimeJNIAccessSupport jni = ImageSingletons.lookup(RuntimeJNIAccessSupport.class);
154155
final RuntimeProxyCreationSupport proxy = ImageSingletons.lookup(RuntimeProxyCreationSupport.class);
156+
final RuntimeSerializationSupport<ConfigurationCondition> serialization = RuntimeSerializationSupport.singleton();
155157
final ConfigurationCondition always = ConfigurationCondition.alwaysTrue();
156158

157159
/*
@@ -207,7 +209,7 @@ public static void registerPreservedClasses(NativeImageClassLoaderSupport classL
207209
classesToPreserve.reversed().forEach(c -> {
208210
reflection.registerAllFields(always, c);
209211
reflection.registerAllMethodsQuery(always, false, c);
210-
// RuntimeSerialization.register(c);
212+
serialization.register(always, c);
211213
});
212214

213215
for (String className : classLoaderSupport.getClassNamesToPreserve()) {

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -554,15 +554,24 @@ public void registerAllDeclaredFields(ConfigurationCondition condition, Class<?>
554554
registerAllDeclaredFieldsQuery(condition, false, clazz);
555555
}
556556

557+
private record AllDeclaredFieldsQuery(ConfigurationCondition condition, boolean queriedOnly, Class<?> clazz) {
558+
}
559+
560+
private Set<AllDeclaredFieldsQuery> existingAllDeclaredFieldsQuery = ConcurrentHashMap.newKeySet();
561+
557562
public void registerAllDeclaredFieldsQuery(ConfigurationCondition condition, boolean queriedOnly, Class<?> clazz) {
558-
runConditionalInAnalysisTask(condition, (cnd) -> {
559-
setQueryFlag(clazz, ALL_DECLARED_FIELDS_FLAG);
560-
try {
561-
registerFields(cnd, queriedOnly, clazz.getDeclaredFields());
562-
} catch (LinkageError e) {
563-
registerLinkageError(clazz, e, fieldLookupExceptions);
564-
}
565-
});
563+
final var query = new AllDeclaredFieldsQuery(condition, queriedOnly, clazz);
564+
if (!existingAllDeclaredFieldsQuery.contains(query)) {
565+
runConditionalInAnalysisTask(condition, (cnd) -> {
566+
setQueryFlag(clazz, ALL_DECLARED_FIELDS_FLAG);
567+
try {
568+
registerFields(cnd, queriedOnly, clazz.getDeclaredFields());
569+
} catch (LinkageError e) {
570+
registerLinkageError(clazz, e, fieldLookupExceptions);
571+
}
572+
});
573+
existingAllDeclaredFieldsQuery.add(query);
574+
}
566575
}
567576

568577
private void registerFields(ConfigurationCondition cnd, boolean queriedOnly, Field[] reflectFields) {
@@ -1137,6 +1146,7 @@ protected void afterAnalysis() {
11371146
if (!throwMissingRegistrationErrors()) {
11381147
pendingRecordClasses = null;
11391148
}
1149+
existingAllDeclaredFieldsQuery = null;;
11401150
}
11411151

11421152
@Override

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,9 @@ private Constructor<?> newConstructorForSerialization(Class<?> serializationTarg
604604
} else {
605605
constructorToCall = customConstructorToCall;
606606
}
607+
if (constructorToCall == null) {
608+
return null;
609+
}
607610
ConstructorAccessor acc = getConstructorAccessor(serializationTargetClass, constructorToCall);
608611
JavaLangReflectAccess langReflectAccess = ReflectionUtil.readField(ReflectionFactory.class, "langReflectAccess", ReflectionFactory.getReflectionFactory());
609612
Method newConstructorWithAccessor = ReflectionUtil.lookupMethod(JavaLangReflectAccess.class, "newConstructorWithAccessor", Constructor.class, ConstructorAccessor.class);

substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/ReflectionUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public static <T> Constructor<T> lookupConstructor(boolean optional, Class<T> de
123123
openModule(declaringClass);
124124
result.setAccessible(true);
125125
return result;
126-
} catch (ReflectiveOperationException | NoClassDefFoundError ex) {
126+
} catch (ReflectiveOperationException | LinkageError ex) {
127127
if (optional) {
128128
return null;
129129
}

0 commit comments

Comments
 (0)