This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Re: CNI and interface methods
- From: Andrew Haley <aph at redhat dot com>
- To: Bryce McKinlay <bmckinlay at gmail dot com>
- Cc: Stephen Kell <srk31 at srcf dot ucam dot org>, java at gcc dot gnu dot org
- Date: Fri, 03 Apr 2009 11:43:52 +0100
- Subject: Re: CNI and interface methods
- References: <20090402193827.GD4939@font.cl.cam.ac.uk> <49D5CAD4.8040700@redhat.com> <7230133d0904030328o55069f0do9147f879bcbd5e4f@mail.gmail.com>
Bryce McKinlay wrote:
> On Fri, Apr 3, 2009 at 9:37 AM, Andrew Haley <aph@redhat.com> wrote:
>
>> Stephen Kell wrote:
>>
>>> I'm using CNI for the first time and have hit a query. What exactly is
>>> and isn't supposed to work when invoking interface methods through
>>> *object* references (from C++, so I mean pointers), and passing these
>>> references around?
>>>
>>> The CNI chapter in the gcj manual says a lot about interface references,
>>> but not about the case of using object references where that object's
>>> class implements one or more interfaces. One thing that would appear to
>>> be worth mentioning is that clearly, passing them to methods wanting an
>>> interface reference won't compile without some sort of cast, since the
>>> gcjh-generated headers don't encode the subtyping relationship between
>>> interfaces and their implementing classes. I'm guessing a simple static
>>> cast isn't the right thing to do though, because I'm getting segfaults
>>> when I try.
>
>> Right. To put it simply, we have never got around to implementing Java
>> interface calls in CNI. It wouldn't be enormously difficult, but it
>> needs some way to tell the C++ compiler about interface calls. We could
>> have implemented Java interfaces via C++ multiple inheritance but we
>> didn't, so we would need to invent some sort of notation to express the
>> idea of an interface to the C++ compiler.
>
> Actually we did implement a rather limited form of interface calls in CNI.
> Interfaces types are described in CNI headers with __attribute__
> ((java_interface)), and the C++ compiler knows how to call a method on a
> type declared as such.
>
> What is missing in the C++ compiler (and the CNI headers) is knowledge of
> interface inheritance, so you have to manually cast interface references if
> the method you want to call was declared in a super-interface.
>
> This limitation is described here:
>
> http://gcc.gnu.org/onlinedocs/gcj/Interfaces.html
Ah yes, thanks for the clarification.
Andrew.