From 701def339fec9fd7a254eb4f3ac9f59627b50816 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 20 Apr 2023 19:20:15 -0400 Subject: [PATCH] Fix crash when null type references are interned --- .../classloading/ModFileScanDataDeduplicator.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java b/src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java index a2347963..0604a4f1 100644 --- a/src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java +++ b/src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java @@ -9,11 +9,14 @@ import org.objectweb.asm.Type; import java.lang.reflect.Field; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; public class ModFileScanDataDeduplicator { private final Interner typeInterner = Interners.newStrongInterner(); + private final Function internerFn = type -> type != null ? typeInterner.intern(type) : null; + private static Field classClazzField, parentField, interfacesField, annotationClazzField, annotationTypeField; private static final boolean reflectionSuccessful; @@ -54,13 +57,13 @@ public class ModFileScanDataDeduplicator { private void deduplicateClass(ModFileScanData.ClassData data) { try { Type type = (Type)classClazzField.get(data); - type = typeInterner.intern(type); + type = internerFn.apply(type); classClazzField.set(data, type); type = (Type)parentField.get(data); - type = typeInterner.intern(type); + type = internerFn.apply(type); parentField.set(data, type); Set types = (Set)interfacesField.get(data); - types = types.stream().map(typeInterner::intern).collect(Collectors.toSet()); + types = types.stream().map(internerFn).collect(Collectors.toSet()); interfacesField.set(data, types); } catch(ReflectiveOperationException e) { } @@ -69,10 +72,10 @@ public class ModFileScanDataDeduplicator { private void deduplicateAnnotation(ModFileScanData.AnnotationData data) { try { Type type = (Type)annotationClazzField.get(data); - type = typeInterner.intern(type); + type = internerFn.apply(type); annotationClazzField.set(data, type); type = (Type)annotationTypeField.get(data); - type = typeInterner.intern(type); + type = internerFn.apply(type); annotationTypeField.set(data, type); } catch(ReflectiveOperationException e) { }