Bug 34444 - Class.getEnclosingClass() returns null on enclosed class
Summary: Class.getEnclosingClass() returns null on enclosed class
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libgcj (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: ---
Assignee: Andrew Haley
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2007-12-12 10:49 UTC by Matthew Johnson
Modified: 2008-01-04 17:19 UTC (History)
3 users (show)

See Also:
Host: i486-linux-gnu
Target: i486-linux-gnu
Build: i486-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2008-01-04 14:42:41


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Matthew Johnson 2007-12-12 10:49:12 UTC
Class.getEnclosingClass() returns null on enclosed class.

Specifically:

   c = class org.freedesktop.DBus$Local$Disconnected
   c.getEnclosingClass() = null

   (followed by a null pointer exception on the next line)

Code which prints that:

   if (Debug.debug) Debug.print(Debug.VERBOSE, "c = "+c);
        if (Debug.debug) Debug.print(Debug.VERBOSE, "c.getEnclosingClass() = "+c.getEnclosingClass());
        if (Debug.debug) Debug.print(Debug.VERBOSE, "c.getEnclosingClass().getAnnotation(DBusInterfaceName.class) = "+c.getEnclosingClass().getAnnotation(DBusInterfaceName.class));
         if (null != c.getEnclosingClass().getAnnotation(DBusInterfaceName.class))

Source for DBus$Local$Disconnected:

public interface DBus extends DBusInterface
{

 ....

   /**
    * Messages generated locally in the application.
    */
   public interface Local extends DBusInterface
   {
      public class Disconnected extends DBusSignal
      {
         public Disconnected(String path) throws DBusException
         {
            super(path);
         }
      }
   }

  ....
}

GCC version:

gcc (GCC) 4.2.3 20071123 (prerelease) (Debian 4.2.2-4)

(Also happens in 4.2.2)

This code works as expected in Sun JDK 5 and 6

Matt
Comment 1 Tom Tromey 2007-12-12 16:28:59 UTC
Here's a complete test case.
The .class file does have the InnerClasses attribute,
we just don't seem to read it properly.

public class p
{
  public interface DBI { }

  public interface Local extends DBI {
    public class Disconnected
    {
      public Disconnected()
      {
      }
    }
  }

  public static void main(String[] args) throws Throwable {
    Class c = Local.Disconnected.class;
    System.out.println(c.getEnclosingClass());
  }
}
Comment 2 Andrew Haley 2008-01-04 17:19:16 UTC
Another case where Sun's javadoc was rather vague.
Comment 3 Andrew Haley 2008-01-04 17:19:35 UTC
Subject: Bug 34444

Author: aph
Date: Fri Jan  4 17:18:56 2008
New Revision: 131326

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=131326
Log:
2008-01-04  Andrew Haley  <aph@redhat.com>

	PR libgcj/34444
	* java/lang/natClass.cc (Class::getEnclosingClass): Call
	getDeclaringClass().

Modified:
    trunk/libjava/ChangeLog
    trunk/libjava/java/lang/natClass.cc