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);
   }
 

Attachment: signature.asc
Description: Digital signature

Reply via email to