diff --git a/src/net/ME1312/CBS/ASM/LibraryClassLoader.java b/src/net/ME1312/CBS/ASM/LibraryClassLoader.java index ce04562..9308c35 100644 --- a/src/net/ME1312/CBS/ASM/LibraryClassLoader.java +++ b/src/net/ME1312/CBS/ASM/LibraryClassLoader.java @@ -4,11 +4,11 @@ import java.net.URLClassLoader; public final class LibraryClassLoader extends ClassLoader { - private final Reload child; + private final Reloaded child; public LibraryClassLoader(URL[] urls, String[] overrides) { super(LibraryClassLoader.class.getClassLoader()); - child = new Reload(urls, overrides, new Wrapper(this.getParent())); + child = new Reloaded(urls, overrides, new Wrapped(this.getParent())); } @Override @@ -22,11 +22,11 @@ protected synchronized Class loadClass(String name, boolean resolve) throws C } } - private static final class Reload extends URLClassLoader { + private static final class Reloaded extends URLClassLoader { private final String[] whitelist; - private final Wrapper next; + private final Wrapped next; - private Reload(URL[] urls, String[] overrides, Wrapper next) { + private Reloaded(URL[] urls, String[] overrides, Wrapped next) { super(urls, null); this.next = next; whitelist = overrides; @@ -44,8 +44,8 @@ protected Class findClass(String name) throws ClassNotFoundException { } } - private static final class Wrapper extends ClassLoader { - private Wrapper(ClassLoader parent) { + private static final class Wrapped extends ClassLoader { + private Wrapped(ClassLoader parent) { super(parent); } diff --git a/src/net/ME1312/CBS/ASM/PlayerVisitor.java b/src/net/ME1312/CBS/ASM/PlayerVisitor.java index 3651c2f..d456e33 100644 --- a/src/net/ME1312/CBS/ASM/PlayerVisitor.java +++ b/src/net/ME1312/CBS/ASM/PlayerVisitor.java @@ -72,8 +72,8 @@ public byte[] export() { @Override public void visit(int version, int access, String name, String signature, String extended, String[] implemented) { if (flip) try { - if (implemented != null) for (String s : implemented) scan(s); if (extended != null) scan(extended); + if (implemented != null) for (String s : implemented) scan(s); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/net/ME1312/CBS/ASM/TranslationVisitor.java b/src/net/ME1312/CBS/ASM/TranslationVisitor.java index a426bf6..2a64a7a 100644 --- a/src/net/ME1312/CBS/ASM/TranslationVisitor.java +++ b/src/net/ME1312/CBS/ASM/TranslationVisitor.java @@ -139,7 +139,7 @@ public AnnotationVisitor visitAnnotation(String name, String descriptor) { @Override public void visitEnd() { - if ($name != null || $desc != null) { + if ($name != null || $desc != null || index != 0) { senders.add(new Sender(($name != null)? $name : name, ($desc != null)? $desc : desc, index, true)); } } @@ -147,7 +147,7 @@ public void visitEnd() { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { - if (((access & ACC_PUBLIC) != 0 || (access & ACC_PROTECTED) != 0) && (access & (ACC_STATIC | ACC_SYNTHETIC)) == 0) { + if (((access & (ACC_PUBLIC | ACC_FINAL)) == ACC_PUBLIC || (access & ACC_PROTECTED) != 0) && (access & (ACC_STATIC | ACC_SYNTHETIC)) == 0) { return new MethodVisitor(ASM9) { private final List senders = new LinkedList(); private boolean debug = true; @@ -183,7 +183,7 @@ public void visitEnd() { } for (Sender sender : senders) add(sender, translation); - if ((access & ACC_PUBLIC) != 0) add(new Sender(name, descriptor, 0, false), translation); + if ((access & ACC_FINAL) == 0) add(new Sender(name, descriptor, 0, false), translation); } }; } else { diff --git a/src/net/ME1312/CBS/EmulatedPlayer.java b/src/net/ME1312/CBS/EmulatedPlayer.java index 5148025..7fb5ed5 100644 --- a/src/net/ME1312/CBS/EmulatedPlayer.java +++ b/src/net/ME1312/CBS/EmulatedPlayer.java @@ -61,27 +61,14 @@ protected EmulatedPlayer(UUID uid) { msg.append(' '); int i = 0; do { - msg.append(params[i].getCanonicalName()); + msg.append(params[i].getTypeName()); msg.append(' '); } while (++i < params.length); } - msg.append("}\narguments: {"); - if (args.length != 0) { - msg.append(' '); - int i = 0; - do { - Object arg = args[i]; - if (arg == null) { - msg.append("null"); - } else { - msg.append(arg.getClass().getCanonicalName()) - .append('@').append(Integer.toHexString(arg.hashCode())); - } - msg.append(' '); - } while (++i < args.length); - } - msg.append("}\nreturns: ") - .append(returns.getCanonicalName()) + msg.append("}\narguments: "); + Unsafe.toString(msg, args); + msg.append("\nreturns: ") + .append(returns.getTypeName()) .append("\ncallers:"); int i = 2; do { diff --git a/src/net/ME1312/CBS/Unsafe.java b/src/net/ME1312/CBS/Unsafe.java index 8b6be13..a5f629f 100644 --- a/src/net/ME1312/CBS/Unsafe.java +++ b/src/net/ME1312/CBS/Unsafe.java @@ -1,5 +1,9 @@ package net.ME1312.CBS; +import com.google.common.primitives.Primitives; +import org.bukkit.ChatColor; + +import java.lang.reflect.Array; import java.util.function.Supplier; @SuppressWarnings({"unchecked", "unused"}) @@ -20,6 +24,7 @@ T get(int entry, Supplier supplier) { return unsafe; } + // Only misc utility methods beyond this point static RuntimeException rethrow(Throwable e) { return Unsafe.uncheck(e); } @@ -27,4 +32,51 @@ static RuntimeException rethrow(Throwable e) { private static T uncheck(Throwable e) throws T { throw (T) e; } + + public String toString() { + return toString(data); + } + + static String toString(Object[] array) { + StringBuilder builder = new StringBuilder(); + toString(builder, array); + return builder.toString(); + } + + static void toString(StringBuilder str, Object arr) { + str.append('{'); + int length = Array.getLength(arr); + if (length != 0) for (int i = 0;;) { + str.append(' '); + Object obj = Array.get(arr, i); + if (obj == null) { + str.append("null"); + } else if (obj instanceof Character) { + str.append('\'').append((char) obj).append('\''); + } else if (obj instanceof String) { + str.append('\"').append(obj.toString()).append('\"'); + } else if (obj instanceof Class) { + str.append(((Class) obj).getTypeName()).append(".class"); + } else { + Class type = obj.getClass(); + if (type.isArray()) { + if (i == 0) str.delete(str.length() - 1, str.length()); + toString(str, obj); + } else if (Primitives.isWrapperType(type)) { + str.append(obj.toString()); + } else { + str.append(type.getTypeName()).append('@').append(Integer.toHexString(obj.hashCode())); + } + } + + if (++i < length) { + str.append(','); + } else { + if (str.codePointAt(str.length() - 1) != '}') + str.append(' '); + break; + } + } + str.append('}'); + } }