From a3ec4ec3228fdd4bc5b5919b5b3f0d6ea5f7067b Mon Sep 17 00:00:00 2001 From: Graham Date: Wed, 27 May 2020 22:04:22 +0100 Subject: [PATCH] Add getFieldInitializer to ExtendedRemapper My rough plan for combining static scrambling and remapping is to split Library::remap into three passes: * Remove static methods, fields and initializers from the library, storing them in a temporary location. * Pass all classes through ClassNodeRemapper, as we do now. * Add static methods, fields and initializers to their new classes, remapping as we do so. This ensures a ClassNode is never in a state where it has a mixture of remapped and non-remapped fields, methods or instructions. This is important to ensure no conflicts can occur when we use the refactored names from the NameMap, rather than the auto-generated names. It means TypedRemapper needs the ability to provide the instructions that make up a field's initializer, such that Library::remap can move these instructions to a different InsnList. The new getFieldInitializer method and FieldInitializer type support this. Signed-off-by: Graham --- .../dev/openrs2/asm/classpath/ExtendedRemapper.kt | 4 ++++ .../dev/openrs2/asm/classpath/FieldInitializer.kt | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 asm/src/main/java/dev/openrs2/asm/classpath/FieldInitializer.kt diff --git a/asm/src/main/java/dev/openrs2/asm/classpath/ExtendedRemapper.kt b/asm/src/main/java/dev/openrs2/asm/classpath/ExtendedRemapper.kt index beb3253b..b9e17ce0 100644 --- a/asm/src/main/java/dev/openrs2/asm/classpath/ExtendedRemapper.kt +++ b/asm/src/main/java/dev/openrs2/asm/classpath/ExtendedRemapper.kt @@ -3,6 +3,10 @@ package dev.openrs2.asm.classpath import org.objectweb.asm.commons.Remapper abstract class ExtendedRemapper : Remapper() { + open fun getFieldInitializer(owner: String, name: String, descriptor: String): FieldInitializer? { + return null + } + open fun mapFieldOwner(owner: String, name: String, descriptor: String): String { return mapType(owner) } diff --git a/asm/src/main/java/dev/openrs2/asm/classpath/FieldInitializer.kt b/asm/src/main/java/dev/openrs2/asm/classpath/FieldInitializer.kt new file mode 100644 index 00000000..3b64da40 --- /dev/null +++ b/asm/src/main/java/dev/openrs2/asm/classpath/FieldInitializer.kt @@ -0,0 +1,14 @@ +package dev.openrs2.asm.classpath + +import dev.openrs2.asm.MemberRef +import org.objectweb.asm.Opcodes +import org.objectweb.asm.tree.AbstractInsnNode +import org.objectweb.asm.tree.FieldInsnNode + +class FieldInitializer(val instructions: List, val version: Int, val maxStack: Int) { + val dependencies = instructions.asSequence() + .filterIsInstance() + .filter { it.opcode == Opcodes.GETSTATIC } + .map(::MemberRef) + .toSet() +}