From ddffe93f1a6ee4d3c5423a83324d62cbc7551d76 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:46:12 -0400 Subject: [PATCH 1/2] Stop clearing fields/methods on mixin classes This seems to break generating the needed bridge access$xxx methods for inner classes in mixins. Example mixin that breaks: https://github.com/Layers-of-Railways/Railway/blob/d5b3c910aceb7dadefa832aa85d79c55d49012e0/common/src/main/java/com/railwayteam/railways/mixin/client/MixinStationScreen.java --- .../org/embeddedt/modernfix/util/ClassInfoManager.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java index 1daa97a8..a633d954 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java @@ -12,7 +12,6 @@ import org.spongepowered.asm.service.MixinServiceAbstract; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; @@ -54,15 +53,13 @@ public class ClassInfoManager { private static void doClear() { Map classInfoCache; - Field mixinField, stateField, classNodeField, methodsField, fieldsField; + Field mixinField, stateField, classNodeField; Class stateClz; try { disableLoggers(); Field field = accessible(ClassInfo.class.getDeclaredField("cache")); classInfoCache = (Map) field.get(null); mixinField = accessible(ClassInfo.class.getDeclaredField("mixin")); - methodsField = accessible(ClassInfo.class.getDeclaredField("methods")); - fieldsField = accessible(ClassInfo.class.getDeclaredField("fields")); stateClz = Class.forName("org.spongepowered.asm.mixin.transformer.MixinInfo$State"); stateField = accessible(Class.forName("org.spongepowered.asm.mixin.transformer.MixinInfo").getDeclaredField("state")); classNodeField = accessible(stateClz.getDeclaredField("classNode")); @@ -87,9 +84,6 @@ public class ClassInfoManager { if (state != null) classNodeField.set(state, emptyNode); } - // clear fields, methods - ((Collection)methodsField.get(mixinClz)).clear(); - ((Collection)fieldsField.get(mixinClz)).clear(); } catch (ReflectiveOperationException | RuntimeException e) { e.printStackTrace(); } From 226e4a373b542bfaf7a0e658dd5ccda0dd327922 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:49:24 -0400 Subject: [PATCH 2/2] Reduce chances of CME when iterating class info cache --- .../java/org/embeddedt/modernfix/util/ClassInfoManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java index a633d954..e878bb5f 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java @@ -70,7 +70,8 @@ public class ClassInfoManager { MixinEnvironment.getDefaultEnvironment().audit(); try { ClassNode emptyNode = new ClassNode(); - classInfoCache.entrySet().removeIf(entry -> { + List> entries = new ArrayList<>(classInfoCache.entrySet()); + entries.stream().filter(entry -> { if(entry.getKey().equals("java/lang/Object")) return false; ClassInfo mixinClz = entry.getValue(); @@ -88,7 +89,7 @@ public class ClassInfoManager { e.printStackTrace(); } return true; - }); + }).forEach(entry -> classInfoCache.remove(entry.getKey())); } catch (RuntimeException e) { e.printStackTrace(); }