This fixes the reference implementation of getSimpleName and getCanonicalName which fail to handle some cases. Thanks to twisti and panzi's cacao test cases for spotting these.
ChangeLog: 2007-08-19 Andrew John Hughes <[EMAIL PROTECTED]> * vm/reference/java/lang/VMClass.java: (getCanonicalName(Class)): Fix handling of member classes so we don't fall out of the if block. (getSimpleName(Class)): Handle class names which include the $ sign to break up anonymous/inner/member classes. -- Andrew :-) Escape the Java Trap with GNU Classpath! http://www.gnu.org/philosophy/java-trap.html public class gcj extends Freedom implements Java { ... }
Index: vm/reference/java/lang/VMClass.java =================================================================== RCS file: /cvsroot/classpath/classpath/vm/reference/java/lang/VMClass.java,v retrieving revision 1.18 diff -u -3 -p -u -r1.18 VMClass.java --- vm/reference/java/lang/VMClass.java 28 Apr 2006 13:43:04 -0000 1.18 +++ vm/reference/java/lang/VMClass.java 20 Aug 2007 00:14:28 -0000 @@ -298,12 +298,27 @@ final class VMClass */ static String getSimpleName(Class klass) { + if (isAnonymousClass(klass)) + return ""; if (isArray(klass)) { return getComponentType(klass).getSimpleName() + "[]"; } String fullName = getName(klass); - return fullName.substring(fullName.lastIndexOf(".") + 1); + int pos = fullName.lastIndexOf("$"); + if (pos == -1) + pos = 0; + else + { + ++pos; + while (Character.isDigit(fullName.charAt(pos))) + ++pos; + } + int packagePos = fullName.lastIndexOf(".", pos); + if (packagePos == -1) + return fullName.substring(pos); + else + return fullName.substring(packagePos + 1); } /** @@ -357,6 +372,8 @@ final class VMClass */ static String getCanonicalName(Class klass) { + if (isLocalClass(klass) || isAnonymousClass(klass)) + return null; if (isArray(klass)) { String componentName = getComponentType(klass).getCanonicalName(); @@ -368,9 +385,9 @@ final class VMClass String memberName = getDeclaringClass(klass).getCanonicalName(); if (memberName != null) return memberName + "." + getSimpleName(klass); + else + return memberName; } - if (isLocalClass(klass) || isAnonymousClass(klass)) - return null; return getName(klass); }
signature.asc
Description: Digital signature