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(".");
}