From ac99791d3a9d298fa75cf552c81737059512d3f6 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:39:27 -0500 Subject: [PATCH] Deduplicate empty byte arrays --- .../ModernFixCachingClassTransformer.java | 17 +++++++++++++++++ .../hashers/MixinTransformerHasher.java | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java b/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java index ec7f42b2..6eee287e 100644 --- a/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java +++ b/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java @@ -41,6 +41,8 @@ public class ModernFixCachingClassTransformer extends ClassTransformer { private ConcurrentHashMap, byte[]>> transformationCache; + public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + private static File childFile(File file) { file.getParentFile().mkdirs(); return file; @@ -85,6 +87,19 @@ public class ModernFixCachingClassTransformer extends ClassTransformer { this.transformationCache = new ConcurrentHashMap<>(); try(ObjectInputStream inStream = new ObjectInputStream(new FileInputStream(CLASS_CACHE_DAT))) { this.transformationCache = (ConcurrentHashMap,byte[]>>)inStream.readObject(); + /* Deduplicate any empty byte arrays to minimize impact of empty classes */ + List keys = new ArrayList<>(this.transformationCache.keySet()); + for(String key : keys) { + Pair,byte[]> pair = this.transformationCache.get(key); + for(int i = 0; i < pair.getLeft().size(); i++) { + if(pair.getLeft().get(i).length == 0) { + pair.getLeft().set(i, EMPTY_BYTE_ARRAY); + } + } + if(pair.getRight().length == 0) { + this.transformationCache.put(key, Pair.of(pair.getLeft(), EMPTY_BYTE_ARRAY)); + } + } int size = 0; /* Approximate the size in bytes */ for(Map.Entry,byte[]>> entry : this.transformationCache.entrySet()) { @@ -172,6 +187,8 @@ public class ModernFixCachingClassTransformer extends ClassTransformer { LOGGER.warn("Hashes have changed, discarding cached version of " + name); } byte[] transformed = super.transform(inputClass, name, reason); + if(transformed.length == 0) + transformed = EMPTY_BYTE_ARRAY; /* deduplicate */ return Pair.of(hashList, transformed); } }).getRight(); diff --git a/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java b/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java index 63d31c7c..30e2919b 100644 --- a/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java +++ b/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.classloading.hashers; import com.google.common.collect.HashMultimap; import com.google.common.io.Resources; +import cpw.mods.modlauncher.ModernFixCachingClassTransformer; import org.spongepowered.asm.launch.IClassProcessor; import org.spongepowered.asm.launch.MixinLaunchPluginLegacy; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -92,6 +93,6 @@ public class MixinTransformerHasher { } } } - return hashesByClass.getOrDefault(className, new byte[0]); + return hashesByClass.getOrDefault(className, ModernFixCachingClassTransformer.EMPTY_BYTE_ARRAY); } }