Skip to content

Commit 76a34cc

Browse files
committed
Trace serialization accesses
1 parent c180bce commit 76a34cc

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
import java.util.concurrent.ConcurrentMap;
3636
import java.util.stream.Collectors;
3737

38-
import jdk.graal.compiler.java.LambdaUtils;
39-
4038
import com.oracle.svm.core.annotate.Alias;
4139
import com.oracle.svm.core.annotate.RecomputeFieldValue;
4240
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
@@ -45,8 +43,11 @@
4543
import com.oracle.svm.core.annotate.TargetElement;
4644
import com.oracle.svm.core.fieldvaluetransformer.NewInstanceFieldValueTransformer;
4745
import com.oracle.svm.core.hub.DynamicHub;
46+
import com.oracle.svm.core.metadata.MetadataTracer;
4847
import com.oracle.svm.core.reflect.serialize.MissingSerializationRegistrationUtils;
4948

49+
import jdk.graal.compiler.java.LambdaUtils;
50+
5051
@TargetClass(java.io.FileDescriptor.class)
5152
final class Target_java_io_FileDescriptor {
5253

@@ -68,8 +69,8 @@ static ObjectStreamClass lookup(Class<?> cl, boolean all) {
6869
return null;
6970
}
7071

71-
if (Serializable.class.isAssignableFrom(cl)) {
72-
if (!cl.isArray() && !DynamicHub.fromClass(cl).isRegisteredForSerialization()) {
72+
if (Serializable.class.isAssignableFrom(cl) && !cl.isArray()) {
73+
if (!DynamicHub.fromClass(cl).isRegisteredForSerialization()) {
7374
boolean isLambda = cl.getTypeName().contains(LambdaUtils.LAMBDA_CLASS_NAME_SUBSTRING);
7475
boolean isProxy = Proxy.isProxyClass(cl);
7576
if (isProxy || isLambda) {
@@ -87,6 +88,9 @@ static ObjectStreamClass lookup(Class<?> cl, boolean all) {
8788
MissingSerializationRegistrationUtils.missingSerializationRegistration(cl, "type " + cl.getTypeName());
8889
}
8990
}
91+
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
92+
MetadataTracer.singleton().traceSerializationType(cl.getName());
93+
}
9094
}
9195

9296
return Target_java_io_ObjectStreamClass_Caches.localDescs0.get(cl);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/metadata/MetadataTracer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ public void traceResourceBundle(String baseName, Locale locale) {
8989
config.getResourceConfiguration().addBundle(UnresolvedConfigurationCondition.alwaysTrue(), baseName, List.of(locale));
9090
}
9191

92+
public void traceSerializationType(String className) {
93+
assert enabled();
94+
config.getReflectionConfiguration().getOrCreateType(UnresolvedConfigurationCondition.alwaysTrue(), className).setSerializable();
95+
}
96+
9297
private static void initialize() {
9398
assert Options.MetadataTracingSupport.getValue();
9499
MetadataTracer singleton = MetadataTracer.singleton();

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/serialize/SerializationSupport.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.graalvm.nativeimage.impl.ConfigurationCondition;
4242

4343
import com.oracle.svm.core.configure.RuntimeConditionSet;
44+
import com.oracle.svm.core.metadata.MetadataTracer;
4445
import com.oracle.svm.core.reflect.SubstrateConstructorAccessor;
4546
import com.oracle.svm.core.util.ImageHeapMap;
4647
import com.oracle.svm.core.util.VMError;
@@ -228,6 +229,9 @@ public Object getSerializationConstructorAccessor(Class<?> rawDeclaringClass, Cl
228229
Object constructorAccessor = constructorAccessors.get(new SerializationLookupKey(declaringClass, targetConstructorClass));
229230

230231
if (constructorAccessor != null) {
232+
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
233+
MetadataTracer.singleton().traceSerializationType(declaringClass.getName());
234+
}
231235
return constructorAccessor;
232236
} else {
233237
String targetConstructorClassName = targetConstructorClass.getName();

0 commit comments

Comments
 (0)