From 071cb88f53358f24b750ef08dd308d28f671a784 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Sun, 1 Sep 2024 06:45:16 +0200 Subject: [PATCH 1/2] delete duplicate & unused class (#60) --- .../transformer/ClassConstantPoolParser.java | 142 ------------------ .../TessellatorRedirectorTransformer.java | 3 +- 2 files changed, 1 insertion(+), 144 deletions(-) delete mode 100644 src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/ClassConstantPoolParser.java diff --git a/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/ClassConstantPoolParser.java b/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/ClassConstantPoolParser.java deleted file mode 100644 index 59b1859..0000000 --- a/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/ClassConstantPoolParser.java +++ /dev/null @@ -1,142 +0,0 @@ -/*** - * This Class is derived from the ASM ClassReader - *

- * ASM: a very small and fast Java bytecode manipulation framework Copyright (c) 2000-2011 INRIA, France Telecom All - * rights reserved. - *

- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the - * following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation and/or other materials provided with the - * distribution. 3. Neither the name of the copyright holders nor the names of its contributors may be used to endorse - * or promote products derived from this software without specific prior written permission. - *

- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package com.gtnewhorizon.gtnhlib.core.transformer; - -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; - -import org.objectweb.asm.Opcodes; - -/** - * Using this class to search for a (single) String reference is > 40 times faster than parsing a class with a - * ClassReader + ClassNode while using way less RAM - */ -public class ClassConstantPoolParser { - - private static final int UTF8 = 1; - private static final int INT = 3; - private static final int FLOAT = 4; - private static final int LONG = 5; - private static final int DOUBLE = 6; - private static final int FIELD = 9; - private static final int METH = 10; - private static final int IMETH = 11; - private static final int NAME_TYPE = 12; - private static final int HANDLE = 15; - private static final int INDY = 18; - - private final ArrayList BYTES_TO_SEARCH; - - public ClassConstantPoolParser(String... strings) { - BYTES_TO_SEARCH = new ArrayList<>(strings.length); - for (int i = 0; i < strings.length; i++) { - BYTES_TO_SEARCH.add(i, strings[i].getBytes(StandardCharsets.UTF_8)); - } - } - - public void addString(String string) { - BYTES_TO_SEARCH.add(string.getBytes(StandardCharsets.UTF_8)); - } - - /** - * Returns true if the constant pool of the class represented by this byte array contains one of the Strings we are - * looking for - */ - public boolean find(byte[] basicClass) { - return find(basicClass, false); - } - - /** - * Returns true if the constant pool of the class represented by this byte array contains one of the Strings we are - * looking for. - * - * @param prefixes If true, it is enough for a constant pool entry to start with one of our Strings to count - * as a match - otherwise, the entire String has to match. - */ - public boolean find(byte[] basicClass, boolean prefixes) { - if (basicClass == null || basicClass.length == 0) { - return false; - } - // checks the class version - if (readShort(6, basicClass) > Opcodes.V1_8) { - return false; - } - // parses the constant pool - final int n = readUnsignedShort(8, basicClass); - int index = 10; - for (int i = 1; i < n; ++i) { - final int size; - switch (basicClass[index]) { - case FIELD: - case METH: - case IMETH: - case INT: - case FLOAT: - case NAME_TYPE: - case INDY: - size = 5; - break; - case LONG: - case DOUBLE: - size = 9; - ++i; - break; - case UTF8: - final int strLen = readUnsignedShort(index + 1, basicClass); - size = 3 + strLen; - for (byte[] bytes : BYTES_TO_SEARCH) { - if (prefixes ? strLen >= bytes.length : strLen == bytes.length) { - boolean found = true; - for (int j = index + 3; j < index + 3 + bytes.length; j++) { - if (basicClass[j] != bytes[j - (index + 3)]) { - found = false; - break; - } - } - if (found) { - return true; - } - } - } - break; - case HANDLE: - size = 4; - break; - default: - size = 3; - break; - } - index += size; - } - return false; - } - - private static short readShort(final int index, byte[] basicClass) { - return (short) (((basicClass[index] & 0xFF) << 8) | (basicClass[index + 1] & 0xFF)); - } - - private static int readUnsignedShort(final int index, byte[] basicClass) { - return ((basicClass[index] & 0xFF) << 8) | (basicClass[index + 1] & 0xFF); - } - -} diff --git a/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/TessellatorRedirectorTransformer.java b/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/TessellatorRedirectorTransformer.java index 1483b42..b2b508d 100644 --- a/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/TessellatorRedirectorTransformer.java +++ b/src/main/java/com/gtnewhorizon/gtnhlib/core/transformer/TessellatorRedirectorTransformer.java @@ -23,8 +23,7 @@ public class TessellatorRedirectorTransformer implements IClassTransformer { private static final String TessellatorClass = "net/minecraft/client/renderer/Tessellator"; - private static final com.gtnewhorizon.gtnhlib.asm.ClassConstantPoolParser cstPoolParser = new ClassConstantPoolParser( - TessellatorClass); + private static final ClassConstantPoolParser cstPoolParser = new ClassConstantPoolParser(TessellatorClass); private static final List TransformerExclusions = Arrays.asList( "org.lwjgl", From 0b01adbae6f8f9829b49e8a99426675f6bbadb5d Mon Sep 17 00:00:00 2001 From: Lyft <127234178+Lyfts@users.noreply.github.com> Date: Sun, 1 Sep 2024 09:30:57 +0200 Subject: [PATCH 2/2] don't merge configs in different subfolders (#59) --- .../gtnhlib/config/ConfigurationManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gtnewhorizon/gtnhlib/config/ConfigurationManager.java b/src/main/java/com/gtnewhorizon/gtnhlib/config/ConfigurationManager.java index b35214a..bab6f58 100644 --- a/src/main/java/com/gtnewhorizon/gtnhlib/config/ConfigurationManager.java +++ b/src/main/java/com/gtnewhorizon/gtnhlib/config/ConfigurationManager.java @@ -59,7 +59,7 @@ public static void registerConfig(Class configClass) throws ConfigException { val modid = cfg.modid(); val filename = Optional.of(cfg.filename().trim()).filter(s -> !s.isEmpty()).orElse(modid); - Configuration rawConfig = configs.computeIfAbsent(modid + "|" + filename, (ignored) -> { + Configuration rawConfig = configs.computeIfAbsent(getConfigKey(cfg), (ignored) -> { Path newConfigDir = configDir; if (!cfg.configSubDirectory().trim().isEmpty()) { newConfigDir = newConfigDir.resolve(cfg.configSubDirectory().trim()); @@ -231,9 +231,7 @@ public static List getConfigElements(Class configClass) throw init(); val cfg = Optional.ofNullable(configClass.getAnnotation(Config.class)).orElseThrow( () -> new ConfigException("Class " + configClass.getName() + " does not have a @Config annotation!")); - val modid = cfg.modid(); - val filename = Optional.of(cfg.filename().trim()).filter(s -> !s.isEmpty()).orElse(modid); - val rawConfig = Optional.ofNullable(configs.get(modid + "|" + filename)).map( + val rawConfig = Optional.ofNullable(configs.get(getConfigKey(cfg))).map( (conf) -> Optional.ofNullable(configToCategoryClassMap.get(conf)) .map((map) -> map.get(cfg.category().trim()).contains(configClass)).orElse(false) ? conf : null) .orElseThrow( @@ -267,6 +265,10 @@ public static List getConfigElementsMulti(Class... configClas } } + private static String getConfigKey(Config cfg) { + return cfg.modid() + "|" + cfg.configSubDirectory() + "|" + cfg.filename(); + } + private static File minecraftHome() { return Launch.minecraftHome != null ? Launch.minecraftHome : new File("."); }