diff --git a/src/main/kotlin/app/revanced/patcher/resolver/MethodResolver.kt b/src/main/kotlin/app/revanced/patcher/resolver/MethodResolver.kt index 08f873ad..ae0b8683 100644 --- a/src/main/kotlin/app/revanced/patcher/resolver/MethodResolver.kt +++ b/src/main/kotlin/app/revanced/patcher/resolver/MethodResolver.kt @@ -1,15 +1,13 @@ package app.revanced.patcher.resolver -import mu.KotlinLogging import app.revanced.patcher.cache.MethodMap import app.revanced.patcher.cache.PatchData import app.revanced.patcher.cache.PatternScanData import app.revanced.patcher.signature.Signature import app.revanced.patcher.util.ExtraTypes +import mu.KotlinLogging import org.objectweb.asm.Type import org.objectweb.asm.tree.* -import kotlin.reflect.KType -import kotlin.reflect.typeOf private val logger = KotlinLogging.logger("MethodResolver") @@ -133,8 +131,8 @@ private fun InsnList.scanFor(pattern: IntArray): ScanResult { val n = this[i + occurrence] if ( !n.anyOf( - typeOf(), - typeOf() + LabelNode::class.java, + LineNumberNode::class.java ) && n.opcode != pattern[occurrence] ) break @@ -160,6 +158,5 @@ private fun Array.convertObjects(): Array { return this.map { it.convertObject() }.toTypedArray() } -private fun AbstractInsnNode.anyOf(vararg types: KType): Boolean { - return types.any { it.javaClass.isAssignableFrom(this.javaClass) } -} +private fun AbstractInsnNode.anyOf(vararg types: Class<*>): Boolean = + types.any { this@anyOf.javaClass == it } \ No newline at end of file diff --git a/src/test/kotlin/app/revanced/patcher/PatcherTest.kt b/src/test/kotlin/app/revanced/patcher/PatcherTest.kt index 0c146bda..00f3ebb5 100644 --- a/src/test/kotlin/app/revanced/patcher/PatcherTest.kt +++ b/src/test/kotlin/app/revanced/patcher/PatcherTest.kt @@ -39,8 +39,10 @@ internal class PatcherTest { ACC_PUBLIC or ACC_STATIC, arrayOf(ExtraTypes.ArrayAny), intArrayOf( + GETSTATIC, LDC, - INVOKEVIRTUAL + INVOKEVIRTUAL, + RETURN ) ) ) @@ -66,7 +68,19 @@ internal class PatcherTest { // Get the start index of our opcode pattern. // This will be the index of the LDC instruction. val startIndex = mainMethod.scanData.startIndex - TestUtil.assertNodeEqual(LdcInsnNode("Hello, world!"), instructions[startIndex]!!) + + // Ignore this, just testing if the method resolver works :) + TestUtil.assertNodeEqual( + FieldInsnNode( + GETSTATIC, + Type.getInternalName(System::class.java), + "out", + // for whatever reason, it adds an "L" and ";" to the node string + "L${Type.getInternalName(PrintStream::class.java)};" + ), + instructions[startIndex]!! + ) + // Create a new LDC node and replace the LDC instruction. val stringNode = LdcInsnNode("Hello, ReVanced! Editing bytecode.") instructions.setAt(startIndex, stringNode) @@ -82,7 +96,7 @@ internal class PatcherTest { GETSTATIC, Type.getInternalName(System::class.java), // "java/lang/System" "out", - "L" + Type.getInternalName(PrintStream::class.java) // "Ljava/io/PrintStream" + Type.getInternalName(PrintStream::class.java) // "java/io/PrintStream" ), LdcInsnNode("Hello, ReVanced! Adding bytecode."), MethodInsnNode(