diff --git a/bundler/src/main/java/dev/openrs2/bundler/transform/LoadLibraryTransformer.kt b/bundler/src/main/java/dev/openrs2/bundler/transform/LoadLibraryTransformer.kt index 7957cefc..680e1529 100644 --- a/bundler/src/main/java/dev/openrs2/bundler/transform/LoadLibraryTransformer.kt +++ b/bundler/src/main/java/dev/openrs2/bundler/transform/LoadLibraryTransformer.kt @@ -5,7 +5,9 @@ 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.JumpInsnNode import org.objectweb.asm.tree.LdcInsnNode import org.objectweb.asm.tree.MethodNode import javax.inject.Singleton @@ -14,10 +16,12 @@ import javax.inject.Singleton class LoadLibraryTransformer : Transformer() { private var jnilibs = 0 private var amd64Checks = 0 + private var sunOsChecks = 0 override fun preTransform(classPath: ClassPath) { jnilibs = 0 amd64Checks = 0 + sunOsChecks = 0 } override fun transformCode(classPath: ClassPath, library: Library, clazz: ClassNode, method: MethodNode): Boolean { @@ -34,16 +38,35 @@ class LoadLibraryTransformer : Transformer() { } } + for (match in SUNOS_CHECK_MATCHER.match(method)) { + val ldc = match[1] as LdcInsnNode + if (ldc.cst == "sunos") { + method.instructions.remove(match[0]) + method.instructions.remove(match[1]) + method.instructions.remove(match[2]) + + val jump = match[3] as JumpInsnNode + if (jump.opcode == Opcodes.IFEQ) { + method.instructions.set(jump, JumpInsnNode(Opcodes.GOTO, jump.label)) + } else { + method.instructions.remove(jump) + } + sunOsChecks++ + } + } + return false } override fun postTransform(classPath: ClassPath) { - logger.info { "Replaced $jnilibs jnilibs with dylibs and removed $amd64Checks amd64 jagmisc checks" } + logger.info { "Replaced $jnilibs jnilibs with dylibs" } + logger.info { "Removed $amd64Checks amd64 jagmisc and $sunOsChecks SunOS checks" } } private companion object { private val logger = InlineLogger() private val AMD64_CHECK_MATCHER = InsnMatcher.compile("GETSTATIC LDC INVOKEVIRTUAL IFNE GETSTATIC LDC INVOKEVIRTUAL IFNE") + private val SUNOS_CHECK_MATCHER = InsnMatcher.compile("GETSTATIC LDC INVOKEVIRTUAL (IFNE | IFEQ)") } }