forked from openrs2/openrs2
parent
1338c80083
commit
fb18a7227d
@ -1,56 +0,0 @@ |
||||
package dev.openrs2.deob.transform; |
||||
|
||||
import java.util.HashMap; |
||||
|
||||
import dev.openrs2.asm.MemberDesc; |
||||
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.FieldInsnNode; |
||||
|
||||
public final class FieldOrderTransformer extends Transformer { |
||||
private static final String CONSTRUCTOR = "<init>"; |
||||
private static final String STATIC_CONSTRUCTOR = "<clinit>"; |
||||
|
||||
private static void sortFields(ClassNode clazz, String ctorName, int opcode) { |
||||
clazz.methods.stream() |
||||
.filter(m -> m.name.equals(ctorName)) |
||||
.findFirst() |
||||
.ifPresent(ctor -> { |
||||
var fields = new HashMap<MemberDesc, Integer>(); |
||||
var index = 0; |
||||
|
||||
for (var it = ctor.instructions.iterator(); it.hasNext(); ) { |
||||
var insn = it.next(); |
||||
if (insn.getOpcode() != opcode) { |
||||
continue; |
||||
} |
||||
|
||||
var putfield = (FieldInsnNode) insn; |
||||
if (!putfield.owner.equals(clazz.name)) { |
||||
continue; |
||||
} |
||||
|
||||
var desc = new MemberDesc(putfield); |
||||
if (!fields.containsKey(desc)) { |
||||
fields.put(desc, index++); |
||||
} |
||||
} |
||||
|
||||
clazz.fields.sort((a, b) -> { |
||||
var indexA = fields.getOrDefault(new MemberDesc(a), -1); |
||||
var indexB = fields.getOrDefault(new MemberDesc(b), -1); |
||||
return Integer.compare(indexA, indexB); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
@Override |
||||
public boolean transformClass(ClassPath classPath, Library library, ClassNode clazz) { |
||||
sortFields(clazz, CONSTRUCTOR, Opcodes.PUTFIELD); |
||||
sortFields(clazz, STATIC_CONSTRUCTOR, Opcodes.PUTSTATIC); |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,46 @@ |
||||
package dev.openrs2.deob.transform |
||||
|
||||
import dev.openrs2.asm.MemberDesc |
||||
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.FieldInsnNode |
||||
|
||||
class FieldOrderTransformer : Transformer() { |
||||
public override fun transformClass(classPath: ClassPath, library: Library, clazz: ClassNode): Boolean { |
||||
sortFields(clazz, CONSTRUCTOR, Opcodes.PUTFIELD) |
||||
sortFields(clazz, STATIC_CONSTRUCTOR, Opcodes.PUTSTATIC) |
||||
return false |
||||
} |
||||
|
||||
companion object { |
||||
private const val CONSTRUCTOR = "<init>" |
||||
private const val STATIC_CONSTRUCTOR = "<clinit>" |
||||
|
||||
private fun sortFields(clazz: ClassNode, ctorName: String, opcode: Int) { |
||||
val ctor = clazz.methods.find { it.name == ctorName } ?: return |
||||
|
||||
val fields = mutableMapOf<MemberDesc, Int>() |
||||
var index = 0 |
||||
for (insn in ctor.instructions) { |
||||
if (insn.opcode != opcode) { |
||||
continue |
||||
} |
||||
|
||||
val putfield = insn as FieldInsnNode |
||||
if (putfield.owner != clazz.name) { |
||||
continue |
||||
} |
||||
|
||||
val desc = MemberDesc(putfield) |
||||
if (!fields.containsKey(desc)) { |
||||
fields[desc] = index++ |
||||
} |
||||
} |
||||
|
||||
clazz.fields.sortBy { fields.getOrDefault(MemberDesc(it), -1) } |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue