C++ patch: Add support for calling Java interfaces
Bryce McKinlay
bryce@albatross.co.nz
Tue Mar 20 20:11:00 GMT 2001
The following patch adds partial support for Java interfaces to the
C++ compiler. This means that cases like the following are now
possible with CNI:
// Java
interface Iface
{
void a();
}
public class Impl implements Iface
{
native void callA(Iface i);
public void a()
{
System.out.println ("a ok");
}
public static void main(String[] args)
{
Impl i = new Impl();
i.callA(i);
}
}
// C++
#include <Iface.h>
#include <Impl.h>
void
Impl::callA (Iface i)
{
i->a();
}
Until now, code like this would compile but tended to crash the java
runtime, because C++ would attempt a normal vtbl method lookup which
Java does not use for interface dispatch.
C++ doesn't yet understand inheritence among Java interfaces, and gcjh
does not attempt to express this in the generated header file -
currently a cast will be needed in order to call a method declared in
a superinterface. To support this properly might, I suspect, require
more extensive changes to C++ to ensure it remove interface types from
consideration when calculating vtable offsets for non-interface calls.
Calls to java.lang.Object methods are handled correctly.
I would also like to commit this to branch, because it fixes at least
one crash bug in the java runtime (in the File.list(FilenameFilter)
method) and will allow me to finish a complete Java 2 implementation
of the File class without ugly kludges. It doesn't touch much code and
ought to not break anything.
C++ testsuite looks ok. Bootstrapped i686-linux. OK to commit?
regards
[ bryce ]
More information about the Java-patches
mailing list