Add ExtendedRemapper type with support for moving fields/methods

Signed-off-by: Graham <gpe@openrs2.dev>
pull/109/head
Graham 4 years ago
parent 64dc49e15b
commit 113820a9a2
  1. 10
      asm/src/main/java/dev/openrs2/asm/ClassNodeRemapper.kt
  2. 3
      asm/src/main/java/dev/openrs2/asm/classpath/ClassPath.kt
  3. 13
      asm/src/main/java/dev/openrs2/asm/classpath/ExtendedRemapper.kt
  4. 3
      asm/src/main/java/dev/openrs2/asm/classpath/Library.kt
  5. 31
      deob/src/main/java/dev/openrs2/deob/remap/PrefixRemapper.kt
  6. 4
      deob/src/main/java/dev/openrs2/deob/remap/TypedRemapper.kt

@ -1,6 +1,6 @@
package dev.openrs2.asm package dev.openrs2.asm
import org.objectweb.asm.commons.Remapper import dev.openrs2.asm.classpath.ExtendedRemapper
import org.objectweb.asm.tree.AbstractInsnNode import org.objectweb.asm.tree.AbstractInsnNode
import org.objectweb.asm.tree.ClassNode import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.FieldInsnNode import org.objectweb.asm.tree.FieldInsnNode
@ -11,7 +11,7 @@ import org.objectweb.asm.tree.MethodInsnNode
import org.objectweb.asm.tree.MultiANewArrayInsnNode import org.objectweb.asm.tree.MultiANewArrayInsnNode
import org.objectweb.asm.tree.TypeInsnNode import org.objectweb.asm.tree.TypeInsnNode
fun ClassNode.remap(remapper: Remapper) { fun ClassNode.remap(remapper: ExtendedRemapper) {
val originalName = name val originalName = name
name = remapper.mapType(originalName) name = remapper.mapType(originalName)
signature = remapper.mapSignature(signature, false) signature = remapper.mapSignature(signature, false)
@ -45,18 +45,18 @@ fun ClassNode.remap(remapper: Remapper) {
} }
} }
private fun AbstractInsnNode.remap(remapper: Remapper) { private fun AbstractInsnNode.remap(remapper: ExtendedRemapper) {
when (this) { when (this) {
is FrameNode -> throw UnsupportedOperationException("SKIP_FRAMES and COMPUTE_FRAMES must be used") is FrameNode -> throw UnsupportedOperationException("SKIP_FRAMES and COMPUTE_FRAMES must be used")
is FieldInsnNode -> { is FieldInsnNode -> {
val originalOwner = owner val originalOwner = owner
owner = remapper.mapType(originalOwner) owner = remapper.mapFieldOwner(originalOwner, name, desc)
name = remapper.mapFieldName(originalOwner, name, desc) name = remapper.mapFieldName(originalOwner, name, desc)
desc = remapper.mapDesc(desc) desc = remapper.mapDesc(desc)
} }
is MethodInsnNode -> { is MethodInsnNode -> {
val originalOwner = owner val originalOwner = owner
owner = remapper.mapType(originalOwner) owner = remapper.mapMethodOwner(originalOwner, name, desc)
name = remapper.mapMethodName(originalOwner, name, desc) name = remapper.mapMethodName(originalOwner, name, desc)
desc = remapper.mapDesc(desc) desc = remapper.mapDesc(desc)
} }

@ -6,7 +6,6 @@ import dev.openrs2.asm.toBinaryClassName
import dev.openrs2.util.collect.DisjointSet import dev.openrs2.util.collect.DisjointSet
import dev.openrs2.util.collect.ForestDisjointSet import dev.openrs2.util.collect.ForestDisjointSet
import org.objectweb.asm.Opcodes import org.objectweb.asm.Opcodes
import org.objectweb.asm.commons.Remapper
import org.objectweb.asm.tree.AbstractInsnNode import org.objectweb.asm.tree.AbstractInsnNode
import org.objectweb.asm.tree.ClassNode import org.objectweb.asm.tree.ClassNode
@ -76,7 +75,7 @@ class ClassPath(
return null return null
} }
fun remap(remapper: Remapper) { fun remap(remapper: ExtendedRemapper) {
for (library in libraries) { for (library in libraries) {
library.remap(remapper) library.remap(remapper)
} }

@ -0,0 +1,13 @@
package dev.openrs2.asm.classpath
import org.objectweb.asm.commons.Remapper
abstract class ExtendedRemapper : Remapper() {
open fun mapFieldOwner(owner: String, name: String, desc: String): String {
return mapType(owner)
}
open fun mapMethodOwner(owner: String, name: String, desc: String): String {
return mapType(owner)
}
}

@ -4,7 +4,6 @@ import com.github.michaelbull.logging.InlineLogger
import dev.openrs2.asm.io.LibraryReader import dev.openrs2.asm.io.LibraryReader
import dev.openrs2.asm.io.LibraryWriter import dev.openrs2.asm.io.LibraryWriter
import dev.openrs2.asm.remap import dev.openrs2.asm.remap
import org.objectweb.asm.commons.Remapper
import org.objectweb.asm.tree.ClassNode import org.objectweb.asm.tree.ClassNode
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
@ -41,7 +40,7 @@ class Library() : Iterable<ClassNode> {
return classes.values.iterator() return classes.values.iterator()
} }
fun remap(remapper: Remapper) { fun remap(remapper: ExtendedRemapper) {
for (clazz in classes.values) { for (clazz in classes.values) {
clazz.remap(remapper) clazz.remap(remapper)
} }

@ -1,22 +1,29 @@
package dev.openrs2.deob.remap package dev.openrs2.deob.remap
import dev.openrs2.asm.classpath.ExtendedRemapper
import dev.openrs2.asm.classpath.Library import dev.openrs2.asm.classpath.Library
import dev.openrs2.asm.filter.ClassFilter import dev.openrs2.asm.filter.ClassFilter
import org.objectweb.asm.commons.Remapper
import org.objectweb.asm.commons.SimpleRemapper
object PrefixRemapper { class PrefixRemapper(private val prefix: String, private val classes: Set<String>) : ExtendedRemapper() {
fun create(library: Library, prefix: String, excluded: ClassFilter): Remapper { override fun map(internalName: String): String {
val mapping = mutableMapOf<String, String>() return if (classes.contains(internalName)) {
prefix + internalName
} else {
internalName
}
}
companion object {
fun create(library: Library, prefix: String, excluded: ClassFilter): ExtendedRemapper {
val classes = mutableSetOf<String>()
for (clazz in library) { for (clazz in library) {
if (excluded.matches(clazz.name)) { if (!excluded.matches(clazz.name)) {
mapping[clazz.name] = clazz.name classes += clazz.name
} else { }
mapping[clazz.name] = prefix + clazz.name
} }
}
return SimpleRemapper(mapping) return PrefixRemapper(prefix, classes)
}
} }
} }

@ -5,6 +5,7 @@ import dev.openrs2.asm.MemberDesc
import dev.openrs2.asm.MemberRef import dev.openrs2.asm.MemberRef
import dev.openrs2.asm.classpath.ClassMetadata import dev.openrs2.asm.classpath.ClassMetadata
import dev.openrs2.asm.classpath.ClassPath import dev.openrs2.asm.classpath.ClassPath
import dev.openrs2.asm.classpath.ExtendedRemapper
import dev.openrs2.asm.filter.ClassFilter import dev.openrs2.asm.filter.ClassFilter
import dev.openrs2.asm.filter.MemberFilter import dev.openrs2.asm.filter.MemberFilter
import dev.openrs2.deob.Profile import dev.openrs2.deob.Profile
@ -12,13 +13,12 @@ import dev.openrs2.util.collect.DisjointSet
import dev.openrs2.util.indefiniteArticle import dev.openrs2.util.indefiniteArticle
import org.objectweb.asm.Opcodes import org.objectweb.asm.Opcodes
import org.objectweb.asm.Type import org.objectweb.asm.Type
import org.objectweb.asm.commons.Remapper
class TypedRemapper private constructor( class TypedRemapper private constructor(
private val classes: Map<String, String>, private val classes: Map<String, String>,
private val fields: Map<MemberRef, String>, private val fields: Map<MemberRef, String>,
private val methods: Map<MemberRef, String> private val methods: Map<MemberRef, String>
) : Remapper() { ) : ExtendedRemapper() {
override fun map(internalName: String): String { override fun map(internalName: String): String {
return classes.getOrDefault(internalName, internalName) return classes.getOrDefault(internalName, internalName)
} }

Loading…
Cancel
Save