Skip to content

Commit

Permalink
fix(MethodResolver): fix cd57a8c
Browse files Browse the repository at this point in the history
  • Loading branch information
Sculas committed Mar 24, 2022
1 parent 14f7667 commit 1af31b2
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 11 deletions.
13 changes: 5 additions & 8 deletions 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")

Expand Down Expand Up @@ -133,8 +131,8 @@ private fun InsnList.scanFor(pattern: IntArray): ScanResult {
val n = this[i + occurrence]
if (
!n.anyOf(
typeOf<LabelNode>(),
typeOf<LineNumberNode>()
LabelNode::class.java,
LineNumberNode::class.java
) &&
n.opcode != pattern[occurrence]
) break
Expand All @@ -160,6 +158,5 @@ private fun Array<Type>.convertObjects(): Array<Type> {
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 }
20 changes: 17 additions & 3 deletions src/test/kotlin/app/revanced/patcher/PatcherTest.kt
Expand Up @@ -39,8 +39,10 @@ internal class PatcherTest {
ACC_PUBLIC or ACC_STATIC,
arrayOf(ExtraTypes.ArrayAny),
intArrayOf(
GETSTATIC,
LDC,
INVOKEVIRTUAL
INVOKEVIRTUAL,
RETURN
)
)
)
Expand All @@ -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)
Expand All @@ -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(
Expand Down

0 comments on commit 1af31b2

Please sign in to comment.