Fix leaking mixin injectors

This commit is contained in:
embeddedt 2023-04-08 19:08:03 -04:00
parent e4d3ffbac1
commit 395e14ba9b
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
2 changed files with 146 additions and 0 deletions

View File

@ -10,9 +10,12 @@ import org.apache.logging.log4j.Logger;
import org.embeddedt.modernfix.classloading.ModernFixResourceFinder;
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
import org.embeddedt.modernfix.core.config.Option;
import org.embeddedt.modernfix.util.DummyList;
import org.objectweb.asm.tree.*;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import org.spongepowered.asm.mixin.injection.struct.InjectionInfo;
import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo;
import java.io.File;
import java.io.IOException;
@ -72,6 +75,18 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin {
} catch(RuntimeException | ReflectiveOperationException e) {
logger.error("Failed to make classloading changes", e);
}
/* https://github.com/FabricMC/Mixin/pull/99 */
try {
Field groupMembersField = InjectorGroupInfo.class.getDeclaredField("members");
groupMembersField.setAccessible(true);
Field noGroupField = InjectorGroupInfo.Map.class.getDeclaredField("NO_GROUP");
noGroupField.setAccessible(true);
InjectorGroupInfo noGroup = (InjectorGroupInfo)noGroupField.get(null);
groupMembersField.set(noGroup, new DummyList<>());
} catch(RuntimeException | ReflectiveOperationException e) {
logger.error("Failed to patch mixin memory leak", e);
}
}
private Method defineClassMethod = null;

View File

@ -0,0 +1,131 @@
package org.embeddedt.modernfix.util;
import org.jetbrains.annotations.NotNull;
import java.util.*;
/**
* List with no-op methods.
*/
public class DummyList<T> implements List<T> {
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return true;
}
@Override
public boolean contains(Object o) {
return false;
}
@NotNull
@Override
public Iterator<T> iterator() {
return Collections.emptyIterator();
}
@NotNull
@Override
public Object[] toArray() {
return new Object[0];
}
@NotNull
@Override
public <T1> T1[] toArray(@NotNull T1[] t1s) {
return Arrays.copyOf(t1s, 0);
}
@Override
public boolean add(T t) {
return false;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean containsAll(@NotNull Collection<?> collection) {
return false;
}
@Override
public boolean addAll(@NotNull Collection<? extends T> collection) {
return false;
}
@Override
public boolean addAll(int i, @NotNull Collection<? extends T> collection) {
return false;
}
@Override
public boolean removeAll(@NotNull Collection<?> collection) {
return false;
}
@Override
public boolean retainAll(@NotNull Collection<?> collection) {
return false;
}
@Override
public void clear() {
}
@Override
public T get(int i) {
return null;
}
@Override
public T set(int i, T t) {
return null;
}
@Override
public void add(int i, T t) {
}
@Override
public T remove(int i) {
return null;
}
@Override
public int indexOf(Object o) {
return -1;
}
@Override
public int lastIndexOf(Object o) {
return -1;
}
@NotNull
@Override
public ListIterator<T> listIterator() {
return Collections.emptyListIterator();
}
@NotNull
@Override
public ListIterator<T> listIterator(int i) {
return Collections.emptyListIterator();
}
@NotNull
@Override
public List<T> subList(int i, int i1) {
return new DummyList<>();
}
}