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

Commit

Permalink
Merge pull request #1918 from Lucwousin/yeet
Browse files Browse the repository at this point in the history
deob: Make NonloadingClassWriter better at not loading classes
  • Loading branch information
Lucwousin authored Nov 8, 2019
2 parents ef97f94 + d2d671e commit f2c2681
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 177 deletions.
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.

0 comments on commit f2c2681

Please sign in to comment.