Make NonloadingClassWriter better at not loading classes

This commit is contained in:
Lucwousin
2019-11-07 15:43:32 +01:00
parent af8d9d5565
commit d2d671ec88
2 changed files with 22 additions and 177 deletions

View File

@@ -43,8 +43,21 @@ public class NonloadingClassWriter extends ClassWriter
@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)
{
@@ -62,10 +75,11 @@ public class NonloadingClassWriter extends ClassWriter
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";
}
@@ -80,7 +94,6 @@ public class NonloadingClassWriter extends ClassWriter
}
else
{
assert cf2 == null;
found = cf1;
other = type2;
}
@@ -88,13 +101,10 @@ public class NonloadingClassWriter extends ClassWriter
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);
}
}