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
