Use protected as the minimum visibilty in open classes #132

Closed
Ghost wants to merge 1 commits from <deleted>:master into master
  1. 2
      deob-bytecode/src/main/kotlin/org/openrs2/deob/bytecode/BytecodeDeobfuscatorModule.kt
  2. 18
      deob-bytecode/src/main/kotlin/org/openrs2/deob/bytecode/transform/VisibilityTransformer.kt

@ -70,8 +70,8 @@ public object BytecodeDeobfuscatorModule : AbstractModule() {
binder.addBinding().to(ResetTransformer::class.java) binder.addBinding().to(ResetTransformer::class.java)
binder.addBinding().to(EmptyClassTransformer::class.java) binder.addBinding().to(EmptyClassTransformer::class.java)
binder.addBinding().to(MethodOrderTransformer::class.java) binder.addBinding().to(MethodOrderTransformer::class.java)
binder.addBinding().to(VisibilityTransformer::class.java)
binder.addBinding().to(FinalTransformer::class.java) binder.addBinding().to(FinalTransformer::class.java)
binder.addBinding().to(VisibilityTransformer::class.java)
binder.addBinding().to(FinalFieldTransformer::class.java) binder.addBinding().to(FinalFieldTransformer::class.java)
binder.addBinding().to(OverrideTransformer::class.java) binder.addBinding().to(OverrideTransformer::class.java)
binder.addBinding().to(RedundantGotoTransformer::class.java) binder.addBinding().to(RedundantGotoTransformer::class.java)

@ -54,7 +54,8 @@ public class VisibilityTransformer @Inject constructor(private val profile: Prof
references: Multimap<DisjointSet.Partition<MemberRef>, String>, references: Multimap<DisjointSet.Partition<MemberRef>, String>,
disjointSet: DisjointSet<MemberRef>, disjointSet: DisjointSet<MemberRef>,
member: MemberRef, member: MemberRef,
access: Int access: Int,
classAccess: Int
): Int { ): Int {
val method = Type.getType(member.desc).sort == Type.METHOD val method = Type.getType(member.desc).sort == Type.METHOD
if (method) { if (method) {
@ -72,6 +73,7 @@ public class VisibilityTransformer @Inject constructor(private val profile: Prof
val overridable = method && member.name != "<init>" val overridable = method && member.name != "<init>"
val hasOverride = overridable && partition.count { classPath[it.owner]!!.methods.contains(MemberDesc(it)) } > 1 val hasOverride = overridable && partition.count { classPath[it.owner]!!.methods.contains(MemberDesc(it)) } > 1
val abstract = method && access and Opcodes.ACC_ABSTRACT != 0 val abstract = method && access and Opcodes.ACC_ABSTRACT != 0
val finalClass = classAccess and Opcodes.ACC_FINAL != 0
val partitionReferences = references[partition] val partitionReferences = references[partition]
val partitionOwners = partition.mapTo(mutableSetOf(), MemberRef::owner) val partitionOwners = partition.mapTo(mutableSetOf(), MemberRef::owner)
@ -82,7 +84,13 @@ public class VisibilityTransformer @Inject constructor(private val profile: Prof
// pick the weakest access level based on references in our own code // pick the weakest access level based on references in our own code
val visibility = when { val visibility = when {
partitionReferences.all { it == member.owner } && !hasOverride && !abstract -> Opcodes.ACC_PRIVATE !hasOverride && !abstract && partitionReferences.all { it == member.owner } -> {
if (finalClass) {
Opcodes.ACC_PRIVATE
} else {
Opcodes.ACC_PROTECTED
}
}
partitionReferences.all { partitionOwners.contains(it) } -> Opcodes.ACC_PROTECTED partitionReferences.all { partitionOwners.contains(it) } -> Opcodes.ACC_PROTECTED
else -> Opcodes.ACC_PUBLIC else -> Opcodes.ACC_PUBLIC
} }
@ -118,7 +126,8 @@ public class VisibilityTransformer @Inject constructor(private val profile: Prof
fieldReferences, fieldReferences,
inheritedFieldSets, inheritedFieldSets,
MemberRef(clazz, field), MemberRef(clazz, field),
access access,
clazz.access
) )
field.access = (access and VISIBILITY_FLAGS.inv()) or visibility field.access = (access and VISIBILITY_FLAGS.inv()) or visibility
@ -135,7 +144,8 @@ public class VisibilityTransformer @Inject constructor(private val profile: Prof
methodReferences, methodReferences,
inheritedMethodSets, inheritedMethodSets,
MemberRef(clazz, method), MemberRef(clazz, method),
access access,
clazz.access
) )
method.access = (access and VISIBILITY_FLAGS.inv()) or visibility method.access = (access and VISIBILITY_FLAGS.inv()) or visibility

Loading…
Cancel
Save