forked from openrs2/openrs2
This is necessary for a future commit that will track the original indexes of AbstractInsnNodes throughout the deobfuscator, with the aim of using this information to track local variables in the decompiled code. I suspect this will also improve performance, as we don't need to re-allocate all of the tree objects.master
parent
d32de8537d
commit
6464f8dc77
@ -0,0 +1,86 @@ |
|||||||
|
package dev.openrs2.asm |
||||||
|
|
||||||
|
import org.objectweb.asm.commons.Remapper |
||||||
|
import org.objectweb.asm.tree.AbstractInsnNode |
||||||
|
import org.objectweb.asm.tree.ClassNode |
||||||
|
import org.objectweb.asm.tree.FieldInsnNode |
||||||
|
import org.objectweb.asm.tree.FrameNode |
||||||
|
import org.objectweb.asm.tree.InvokeDynamicInsnNode |
||||||
|
import org.objectweb.asm.tree.LdcInsnNode |
||||||
|
import org.objectweb.asm.tree.MethodInsnNode |
||||||
|
import org.objectweb.asm.tree.MultiANewArrayInsnNode |
||||||
|
import org.objectweb.asm.tree.TypeInsnNode |
||||||
|
|
||||||
|
fun ClassNode.remap(remapper: Remapper) { |
||||||
|
val originalName = name |
||||||
|
name = remapper.mapType(originalName) |
||||||
|
signature = remapper.mapSignature(signature, false) |
||||||
|
superName = remapper.mapType(superName) |
||||||
|
|
||||||
|
if (interfaces != null) { |
||||||
|
interfaces = interfaces.map(remapper::mapType) |
||||||
|
} |
||||||
|
|
||||||
|
for (field in fields) { |
||||||
|
field.name = remapper.mapFieldName(originalName, field.name, field.desc) |
||||||
|
field.desc = remapper.mapDesc(field.desc) |
||||||
|
field.signature = remapper.mapSignature(field.signature, true) |
||||||
|
|
||||||
|
if (field.value != null) { |
||||||
|
field.value = remapper.mapValue(field.value) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (method in methods) { |
||||||
|
method.name = remapper.mapMethodName(originalName, method.name, method.desc) |
||||||
|
method.desc = remapper.mapMethodDesc(method.desc) |
||||||
|
method.signature = remapper.mapSignature(method.signature, false) |
||||||
|
|
||||||
|
method.exceptions = method.exceptions.map(remapper::mapType) |
||||||
|
|
||||||
|
if (method.hasCode()) { |
||||||
|
ClassForNameUtils.remap(remapper, method) |
||||||
|
|
||||||
|
for (insn in method.instructions) { |
||||||
|
insn.remap(remapper) |
||||||
|
} |
||||||
|
|
||||||
|
for (tryCatch in method.tryCatchBlocks) { |
||||||
|
tryCatch.type = remapper.mapType(tryCatch.type) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private fun Remapper.mapFrameType(type: Any): Any { |
||||||
|
return if (type is String) { |
||||||
|
mapType(type) |
||||||
|
} else { |
||||||
|
type |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private fun AbstractInsnNode.remap(remapper: Remapper) { |
||||||
|
when (this) { |
||||||
|
is FrameNode -> { |
||||||
|
local = local.map(remapper::mapFrameType) |
||||||
|
stack = stack.map(remapper::mapFrameType) |
||||||
|
} |
||||||
|
is FieldInsnNode -> { |
||||||
|
val originalOwner = owner |
||||||
|
owner = remapper.mapType(originalOwner) |
||||||
|
name = remapper.mapFieldName(originalOwner, name, desc) |
||||||
|
desc = remapper.mapDesc(desc) |
||||||
|
} |
||||||
|
is MethodInsnNode -> { |
||||||
|
val originalOwner = owner |
||||||
|
owner = remapper.mapType(originalOwner) |
||||||
|
name = remapper.mapMethodName(originalOwner, name, desc) |
||||||
|
desc = remapper.mapDesc(desc) |
||||||
|
} |
||||||
|
is InvokeDynamicInsnNode -> throw UnsupportedOperationException() |
||||||
|
is TypeInsnNode -> desc = remapper.mapType(desc) |
||||||
|
is LdcInsnNode -> cst = remapper.mapValue(cst) |
||||||
|
is MultiANewArrayInsnNode -> desc = remapper.mapType(desc) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue