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.
 
 
 
 
openrs2/bundler/src/main/java/dev/openrs2/bundler/transform/MacResizeTransformer.kt

75 lines
2.4 KiB

package dev.openrs2.bundler.transform
import com.github.michaelbull.logging.InlineLogger
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 javax.inject.Singleton
@Singleton
class MacResizeTransformer : Transformer() {
private var branchesRemoved = 0
override fun preTransform(classPath: ClassPath) {
branchesRemoved = 0
}
override fun transformCode(classPath: ClassPath, library: Library, clazz: ClassNode, method: MethodNode): Boolean {
for (match in DETECT_MAC_MATCHER.match(method)) {
val getstatic = match[0] as FieldInsnNode
if (
getstatic.owner == "loader" ||
getstatic.owner == clazz.name ||
getstatic.desc != "Ljava/lang/String;"
) {
continue
}
val ldc = match[1] as LdcInsnNode
if (ldc.cst != "mac") {
continue
}
val invokevirtual = match[2] as MethodInsnNode
if (
invokevirtual.owner != "java/lang/String" ||
invokevirtual.name != "startsWith" ||
invokevirtual.desc != "(Ljava/lang/String;)Z"
) {
continue
}
method.instructions.remove(getstatic)
method.instructions.remove(ldc)
method.instructions.remove(invokevirtual)
val branch = match[3] as JumpInsnNode
if (branch.opcode == Opcodes.IFEQ) {
branch.opcode = Opcodes.GOTO
} else {
method.instructions.remove(branch)
}
branchesRemoved++
}
return false
}
override fun postTransform(classPath: ClassPath) {
logger.info { "Removed $branchesRemoved branches to macOS-specific resize logic" }
}
private companion object {
private val logger = InlineLogger()
private val DETECT_MAC_MATCHER = InsnMatcher.compile("GETSTATIC LDC INVOKEVIRTUAL (IFEQ | IFNE)")
}
}