diff --git a/src/main/java/net/minecraftforge/fart/internal/EnhancedRemapper.java b/src/main/java/net/minecraftforge/fart/internal/EnhancedRemapper.java index a5ed715..eddeb36 100644 --- a/src/main/java/net/minecraftforge/fart/internal/EnhancedRemapper.java +++ b/src/main/java/net/minecraftforge/fart/internal/EnhancedRemapper.java @@ -112,7 +112,6 @@ public Optional getClass(String cls) { ret = resolved.get(cls); if (ret == null) { ret = computeClass(cls); - resolved.put(cls, ret); } } } @@ -132,7 +131,7 @@ private Optional computeClass(String cls) { IMappingFile.IClass mcls = this.map.getClass(cls); if (!icls.isPresent() && mcls == null) return Optional.empty(); - return Optional.of(new MClass(icls.orElse(null), mcls)); + return Optional.of(new MClass(cls, icls.orElse(null), mcls)); } public class MClass { @@ -145,7 +144,7 @@ public class MClass { private final Map> methods = new ConcurrentHashMap<>(); private Collection> methodsView = Collections.unmodifiableCollection(methods.values()); - MClass(IClassInfo icls, IMappingFile.IClass mcls) { + MClass(String cls, IClassInfo icls, IMappingFile.IClass mcls) { if (icls == null && mcls == null) throw new IllegalArgumentException("Can't pass in both nulls.."); @@ -153,6 +152,10 @@ public class MClass { this.mcls = mcls; this.mappedName = mcls == null ? EnhancedRemapper.this.getMap().remapClass(icls.getName()) : mcls.getMapped(); + // Put ourselves into the resolved map earlier so we could avoid StackOverflowError in some cases + // See https://github.com/Sinytra/Connector/issues/1592#issuecomment-3211922070 + resolved.put(cls, Optional.of(this)); + if (icls != null) { List parents = new ArrayList<>(); EnhancedRemapper.this.getClass(icls.getSuper()).ifPresent(parents::add);