diff --git a/src/main/java/org/embeddedt/archaicfix/ArchaicFix.java b/src/main/java/org/embeddedt/archaicfix/ArchaicFix.java index 193679a..f4f2506 100644 --- a/src/main/java/org/embeddedt/archaicfix/ArchaicFix.java +++ b/src/main/java/org/embeddedt/archaicfix/ArchaicFix.java @@ -16,6 +16,7 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.network.NetHandlerPlayServer; import net.minecraftforge.common.MinecraftForge; +import org.embeddedt.archaicfix.asm.EarlyStringPool; import org.embeddedt.archaicfix.config.ArchaicConfig; import org.embeddedt.archaicfix.ducks.IAcceleratedRecipe; import org.embeddedt.archaicfix.proxy.CommonProxy; @@ -73,7 +74,7 @@ public void preinit(FMLPreInitializationEvent event) @EventHandler public void init(FMLInitializationEvent event) { - + EarlyStringPool.clear(); } @EventHandler diff --git a/src/main/java/org/embeddedt/archaicfix/asm/EarlyStringPool.java b/src/main/java/org/embeddedt/archaicfix/asm/EarlyStringPool.java new file mode 100644 index 0000000..f57522d --- /dev/null +++ b/src/main/java/org/embeddedt/archaicfix/asm/EarlyStringPool.java @@ -0,0 +1,20 @@ +package org.embeddedt.archaicfix.asm; + +import java.util.HashMap; +import java.util.function.Function; + +public class EarlyStringPool { + private static final HashMap POOL = new HashMap<>(); + + public static String canonicalize(String str) { + synchronized (POOL) { + return POOL.computeIfAbsent(str, Function.identity()); + } + } + + public static void clear() { + synchronized (POOL) { + POOL.clear(); + } + } +} diff --git a/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinASMData.java b/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinASMData.java index ab2ea98..310ce0e 100644 --- a/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinASMData.java +++ b/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinASMData.java @@ -1,11 +1,11 @@ package org.embeddedt.archaicfix.mixins.common.core; import cpw.mods.fml.common.discovery.ASMDataTable; +import org.embeddedt.archaicfix.asm.EarlyStringPool; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import zone.rong.loliasm.api.LoliStringPool; @Mixin(value = ASMDataTable.ASMData.class, remap = false) public class MixinASMData { @@ -15,11 +15,11 @@ public class MixinASMData { @Redirect(method = "", at = @At(value = "FIELD", target = "Lcpw/mods/fml/common/discovery/ASMDataTable$ASMData;annotationName:Ljava/lang/String;")) private void canonicalizeAnnotation(ASMDataTable.ASMData instance, String value) { - this.annotationName = value == null ? null : LoliStringPool.canonicalize(value); + this.annotationName = value == null ? null : EarlyStringPool.canonicalize(value); } @Redirect(method = "", at = @At(value = "FIELD", target = "Lcpw/mods/fml/common/discovery/ASMDataTable$ASMData;className:Ljava/lang/String;")) private void canonicalizeClassName(ASMDataTable.ASMData instance, String value) { - this.className = value == null ? null : LoliStringPool.canonicalize(value); + this.className = value == null ? null : EarlyStringPool.canonicalize(value); } } diff --git a/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinModCandidate.java b/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinModCandidate.java index a46a798..4a634c7 100644 --- a/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinModCandidate.java +++ b/src/main/java/org/embeddedt/archaicfix/mixins/common/core/MixinModCandidate.java @@ -2,12 +2,12 @@ import cpw.mods.fml.common.discovery.ASMDataTable; import cpw.mods.fml.common.discovery.ModCandidate; +import org.embeddedt.archaicfix.asm.EarlyStringPool; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import zone.rong.loliasm.api.LoliStringPool; import java.util.ArrayList; import java.util.HashSet; @@ -39,7 +39,7 @@ public void addClassEntry(String name) { className = className.replace('/','.'); int pkgIdx = className.lastIndexOf('.'); if (pkgIdx > -1) { - String pkg = LoliStringPool.canonicalize(className.substring(0, pkgIdx)); + String pkg = EarlyStringPool.canonicalize(className.substring(0, pkgIdx)); packageSet.add(pkg); table.registerPackage((ModCandidate)(Object)this, pkg); } diff --git a/src/main/java/org/embeddedt/archaicfix/proxy/ClientProxy.java b/src/main/java/org/embeddedt/archaicfix/proxy/ClientProxy.java index 97d68aa..d03a9e5 100644 --- a/src/main/java/org/embeddedt/archaicfix/proxy/ClientProxy.java +++ b/src/main/java/org/embeddedt/archaicfix/proxy/ClientProxy.java @@ -15,7 +15,6 @@ import org.embeddedt.archaicfix.config.ArchaicConfig; import org.embeddedt.archaicfix.helpers.BuiltInResourcePack; import org.embeddedt.archaicfix.helpers.SoundDeviceThread; -import zone.rong.loliasm.api.LoliStringPool; import java.lang.management.ManagementFactory; @@ -26,7 +25,6 @@ public class ClientProxy extends CommonProxy { public void preinit() { super.preinit(); Minecraft.memoryReserve = new byte[0]; - MinecraftForge.EVENT_BUS.register(new LoliStringPool.EventHandler()); MinecraftForge.EVENT_BUS.register(this); FMLCommonHandler.instance().bus().register(this); if(ArchaicConfig.modernizeTextures) { diff --git a/src/main/java/zone/rong/loliasm/api/CaptureSet.java b/src/main/java/zone/rong/loliasm/api/CaptureSet.java index f86a207..79fb27e 100644 --- a/src/main/java/zone/rong/loliasm/api/CaptureSet.java +++ b/src/main/java/zone/rong/loliasm/api/CaptureSet.java @@ -1,7 +1,5 @@ package zone.rong.loliasm.api; -import speiger.src.collections.objects.sets.ObjectOpenHashSet; - import java.util.HashSet; import java.util.Set; @@ -11,7 +9,7 @@ public class CaptureSet extends HashSet { public CaptureSet() { super(); - this.backingCaptures = new ObjectOpenHashSet<>(); + this.backingCaptures = new HashSet<>(); } public CaptureSet(Set populate) { diff --git a/src/main/java/zone/rong/loliasm/api/LoliStringPool.java b/src/main/java/zone/rong/loliasm/api/LoliStringPool.java deleted file mode 100644 index 39c427f..0000000 --- a/src/main/java/zone/rong/loliasm/api/LoliStringPool.java +++ /dev/null @@ -1,142 +0,0 @@ -package zone.rong.loliasm.api; - -import org.embeddedt.archaicfix.ArchaicLogger; -import speiger.src.collections.ints.maps.impl.misc.Int2ObjectArrayMap; -import speiger.src.collections.objects.sets.ObjectOpenHashSet; - -import java.util.Locale; - -public class LoliStringPool { - - public static final int FILE_PERMISSIONS_ID = 1; - - private static final Int2ObjectArrayMap POOLS = new Int2ObjectArrayMap<>(); - - static { - establishPool(-1, 12288, "", " "); - POOLS.setDefaultReturnValue(POOLS.get(-1)); - } - - public static void establishPool(int poolId, int expectedSize, String... startingValues) { - if (POOLS.containsKey(poolId)) { - return; - } - POOLS.put(poolId, new Internal(poolId, expectedSize, startingValues)); - } - - public static Internal purgePool(int poolId) { - return POOLS.remove(poolId); - } - - public static int getSize() { - return POOLS.getDefaultReturnValue().internalPool.size(); - } - - public static int getSize(int pool) { - return POOLS.get(pool).internalPool.size(); - } - - public static long getDeduplicatedCount() { - return POOLS.getDefaultReturnValue().deduplicatedCount; - } - - public static long getDeduplicatedCount(int pool) { - return POOLS.get(pool).deduplicatedCount; - } - - public static String canonicalize(String string) { - synchronized (POOLS) { - return POOLS.getDefaultReturnValue().addOrGet(string); - } - } - - public static String unsafe$Canonicalize(String string) { - return POOLS.getDefaultReturnValue().addOrGet(string); - } - - @SuppressWarnings("unused") - public static String lowerCaseAndCanonicalize(String string) { - synchronized (POOLS) { - return POOLS.getDefaultReturnValue().addOrGet(string.toLowerCase(Locale.ROOT)); - } - } - - @SuppressWarnings("unused") - public static String unsafe$LowerCaseAndCanonicalize(String string) { - return POOLS.getDefaultReturnValue().addOrGet(string.toLowerCase(Locale.ROOT)); - } - - public static String canonicalize(String string, int poolId, boolean checkMainPool) { - if (checkMainPool) { - synchronized (POOLS) { - ObjectOpenHashSet internalPool = POOLS.get(poolId).internalPool; - String canonicalized = internalPool.contains(string) ? internalPool.addOrGet(string) : null; - if (canonicalized != null) { - return canonicalized; - } - } - } - synchronized (POOLS) { - return POOLS.get(poolId).addOrGet(string); - } - } - - public static String unsafe$Canonicalize(String string, int poolId, boolean checkMainPool) { - if (checkMainPool) { - ObjectOpenHashSet internalPool = POOLS.get(poolId).internalPool; - String canonicalized = internalPool.contains(string) ? internalPool.addOrGet(string) : null; - if (canonicalized != null) { - return canonicalized; - } - } - return POOLS.get(poolId).addOrGet(string); - } - - public static class EventHandler { - /* - @SubscribeEvent - public void onDebugList(RenderGameOverlayEvent.Text event) { - Minecraft minecraft = Minecraft.getMinecraft(); - if (minecraft.gameSettings.showDebugInfo) { - ArrayList list = event.left; - if (!list.get(list.size() - 1).equals("")) { - list.add(""); - } - int size = getSize(); - long deduplicatedCount = getDeduplicatedCount(); - list.add(String.format("%s%s%s: %s strings processed. %s unique, %s deduplicated.", EnumChatFormatting.AQUA, "", EnumChatFormatting.RESET, deduplicatedCount, size, deduplicatedCount - size)); - } - } - */ - } - - - - static class Internal { - - final int id; - final ObjectOpenHashSet internalPool; - - long deduplicatedCount; - - @SuppressWarnings("all") - Internal(int id, int expectedSize, String... startingValues) { - this.id = id; - this.internalPool = new ObjectOpenHashSet<>(expectedSize); - for (String startingValue : startingValues) { - this.internalPool.add(startingValue); - } - } - - String addOrGet(String string) { - deduplicatedCount++; - return internalPool.addOrGet(string); - } - - @Override - protected void finalize() { - ArchaicLogger.LOGGER.warn("Clearing LoliStringPool {}", id); - } - } - -} diff --git a/src/main/java/zone/rong/loliasm/api/ResourceCache.java b/src/main/java/zone/rong/loliasm/api/ResourceCache.java index d88fbbd..71e9c1d 100644 --- a/src/main/java/zone/rong/loliasm/api/ResourceCache.java +++ b/src/main/java/zone/rong/loliasm/api/ResourceCache.java @@ -1,8 +1,8 @@ package zone.rong.loliasm.api; -import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap; +import java.util.HashMap; -public class ResourceCache extends Object2ObjectOpenHashMap { +public class ResourceCache extends HashMap { public byte[] add(String s, byte[] bytes) { return super.put(s, bytes);