Open-source multiplayer game server compatible with the RuneScape client
https://www.openrs2.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.1 KiB
68 lines
2.1 KiB
package dev.openrs2.bundler.transform;
|
|
|
|
import dev.openrs2.asm.InsnMatcher;
|
|
import dev.openrs2.asm.classpath.ClassPath;
|
|
import dev.openrs2.asm.classpath.Library;
|
|
import dev.openrs2.asm.transform.Transformer;
|
|
import org.objectweb.asm.Opcodes;
|
|
import org.objectweb.asm.tree.ClassNode;
|
|
import org.objectweb.asm.tree.FieldInsnNode;
|
|
import org.objectweb.asm.tree.JumpInsnNode;
|
|
import org.objectweb.asm.tree.LdcInsnNode;
|
|
import org.objectweb.asm.tree.MethodInsnNode;
|
|
import org.objectweb.asm.tree.MethodNode;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
public final class MacResizeTransformer extends Transformer {
|
|
private static final Logger logger = LoggerFactory.getLogger(MacResizeTransformer.class);
|
|
|
|
private static final InsnMatcher DETECT_MAC_MATCHER = InsnMatcher.compile("GETSTATIC LDC INVOKEVIRTUAL (IFEQ | IFNE)");
|
|
|
|
private int branchesRemoved;
|
|
|
|
@Override
|
|
protected void preTransform(ClassPath classPath) {
|
|
branchesRemoved = 0;
|
|
}
|
|
|
|
@Override
|
|
protected boolean transformCode(ClassPath classPath, Library library, ClassNode clazz, MethodNode method) {
|
|
DETECT_MAC_MATCHER.match(method).forEach(match -> {
|
|
var getstatic = (FieldInsnNode) match.get(0);
|
|
if (getstatic.owner.equals("loader") || getstatic.owner.equals(clazz.name) || !getstatic.desc.equals("Ljava/lang/String;")) {
|
|
return;
|
|
}
|
|
|
|
var ldc = (LdcInsnNode) match.get(1);
|
|
if (!ldc.cst.equals("mac")) {
|
|
return;
|
|
}
|
|
|
|
var invokevirtual = (MethodInsnNode) match.get(2);
|
|
if (!invokevirtual.owner.equals("java/lang/String") || !invokevirtual.name.equals("startsWith") || !invokevirtual.desc.equals("(Ljava/lang/String;)Z")) {
|
|
return;
|
|
}
|
|
|
|
method.instructions.remove(getstatic);
|
|
method.instructions.remove(ldc);
|
|
method.instructions.remove(invokevirtual);
|
|
|
|
var branch = (JumpInsnNode) match.get(3);
|
|
if (branch.getOpcode() == Opcodes.IFEQ) {
|
|
branch.setOpcode(Opcodes.GOTO);
|
|
} else {
|
|
method.instructions.remove(branch);
|
|
}
|
|
|
|
branchesRemoved++;
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
protected void postTransform(ClassPath classPath) {
|
|
logger.info("Removed {} branches to macOS-specific resize logic", branchesRemoved);
|
|
}
|
|
}
|
|
|