From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30569 invoked by alias); 3 Apr 2009 10:35:12 -0000 Received: (qmail 30531 invoked by uid 22791); 3 Apr 2009 10:35:11 -0000 X-SWARE-Spam-Status: No, hits=0.5 required=5.0 tests=AWL,BAYES_40,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-bw0-f161.google.com (HELO mail-bw0-f161.google.com) (209.85.218.161) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 03 Apr 2009 10:35:06 +0000 Received: by bwz5 with SMTP id 5so886111bwz.8 for ; Fri, 03 Apr 2009 03:35:03 -0700 (PDT) MIME-Version: 1.0 Received: by 10.103.49.12 with SMTP id b12mr501581muk.98.1238754903301; Fri, 03 Apr 2009 03:35:03 -0700 (PDT) In-Reply-To: <49D5CAD4.8040700@redhat.com> References: <20090402193827.GD4939@font.cl.cam.ac.uk> <49D5CAD4.8040700@redhat.com> Date: Fri, 03 Apr 2009 10:35:00 -0000 Message-ID: <7230133d0904030335v7d07a9bflb476b24bb0d1e8fe@mail.gmail.com> Subject: Re: CNI and interface methods From: Bryce McKinlay To: Andrew Haley Cc: Stephen Kell , java@gcc.gnu.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact java-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: java-owner@gcc.gnu.org X-SW-Source: 2009-04/txt/msg00009.txt.bz2 On Fri, Apr 3, 2009 at 9:37 AM, Andrew Haley 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. =A0To put it simply, we have never got around to implementing Java > interface calls in CNI. =A0It wouldn't be enormously difficult, but it > needs some way to tell the C++ compiler about interface calls. =A0We 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 Bryce