Skip to content
This repository has been archived by the owner on Apr 8, 2023. It is now read-only.

deob: Make NonloadingClassWriter better at not loading classes #1918

Merged
merged 1 commit into from
Nov 8, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,21 @@ public NonloadingClassWriter(ClassGroup group, int flags)
@Override
protected String getCommonSuperClass(String type1, String type2)
{
ClassFile cf1 = group.findClass(type1),
cf2 = group.findClass(type2);
// Checking more than this wouldn't make any sense
// Object has no super class, and RS api is guaranteed to be interfaces, which always extend from Object
// some rl api classes however ARE actual classes, so we can't just assume interface, for the slim chance
// we've got rl api on classpath. We could check all implemented interfaces in group, but that means you end up
// with Object as super class anyway, just like if you just let the Class.forName call throw.
// (maybe we could if we had a better package structure...)
if (type1.equals("java/lang/Object")
|| type2.equals("java/lang/Object")
|| type1.startsWith("net/runelite/rs/api/RS")
|| type2.startsWith("net/runelite/rs/api/RS")
)
return "java/lang/Object";

ClassFile cf1 = group.findClass(type1);
ClassFile cf2 = group.findClass(type2);

if (cf1 == null && cf2 == null)
{
Expand All @@ -62,10 +75,11 @@ protected String getCommonSuperClass(String type1, String type2)

if (cf1 != null && cf2 != null)
{
for (ClassFile c = cf1; c != null; c = c.getParent())
for (ClassFile c2 = cf2; c2 != null; c2 = c2.getParent())
if (c == c2)
return c.getName();
if (!(cf1.isInterface() || cf2.isInterface()))
for (ClassFile c = cf1; c != null; c = c.getParent())
for (ClassFile c2 = cf2; c2 != null; c2 = c2.getParent())
if (c == c2)
return c.getName();

return "java/lang/Object";
}
Expand All @@ -80,21 +94,17 @@ protected String getCommonSuperClass(String type1, String type2)
}
else
{
assert cf2 == null;
found = cf1;
other = type2;
}

ClassFile prev = null;

for (ClassFile c = found; c != null; c = c.getParent())
{
prev = c;

if (c.getName().equals(other))
if ((prev = c).getSuperName().equals(other))
return other;
}

// This should pretty much never be hit, right?
return super.getCommonSuperClass(prev.getSuperName(), other);
}
}
165 changes: 0 additions & 165 deletions deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java

This file was deleted.