Patch to enable libgcj.dll for MinGW

Andrew Haley aph@redhat.com
Tue Sep 6 17:27:00 GMT 2005


TJ Laurenzo writes:
 > > Why? It's a simple optimization that works perfectly well on most
 > > platforms. We could have a target-specific diable for this.
 > I don't see any place in libgcj where this is being used (I haven't
 > done an exhaustive search) outside of natLogger.cc, which is where I
 > was experiencing the problem.
OK.
 > In any case, inlining virtual methods like this doesn't seem right.
 > What if I wanted to override the getter in a subclass.
Here's a test case:
public class a
{
 int foo = 9;
 public int getFoo() { return foo; }
}
public class b extends a
{
 int bar = 3;
 public int getFoo() { return bar; }
}
public class f
{
 static native int getFoo (a anInstance);
 public static void main (String[] s) throws Throwable
 {
 a anInstance = new a();
 System.out.println(anInstance.getFoo());
 System.out.println(getFoo(anInstance));
 anInstance = new b();
 System.out.println(anInstance.getFoo());
 System.out.println(getFoo(anInstance));
 }
}
and some native code:
#include <f.h>
#include <a.h>
jint f::getFoo (::a *anInstance)
{
 return anInstance->getFoo();
}
Running it returns:
9
9
3
3
This is because the function getFoo is declared virtual:
class a : public ::java::lang::Object
{
public:
 virtual jint getFoo () { return foo; }
even though an inline body is provided. If the C++ compiler can prove
that an object is an instance of a and not one of its subclasses, it
can inline the body. If it can't prove that, it won't do the
inlining.
Andrew.


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /