This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: eliminate gcjh?


Per Bothner wrote:
Tom Tromey wrote:

We're going to be facing some real problems with gcjh once we start
looking at 1.5.  For instance, 1.5 has covariant methods,

Are you sure? I can't find documentation on this. Is it considered part of one the other new features, such as Generics?

Covariance is an artifact of generics, and is (somewhat poorly) documented in JSR 14 (the latest document is jsr14-spec10.pdf, bundled with the 2.4 early access prototype implementation). Not only that, but the 1.5 JDK library uses covariant methods, so the 1.5 javac allows covariant methods for ALL -source levels (even though generics, varargs, foreach loops, static imports, autoboxing, and attributes are only valid at -source 1.5).


Binary compatibility also argues that covariant methods exist. Jacks has a couple of test cases that make sure the compiler doesn't crash when a covariant return type is acheived by a sequence of compilations, even in pre-1.5 compilers.

Covariance is implemented by bridge methods.  If I write:
class A {
  A foo() { return this; }
}
class B extends A {
  B foo() { return this; } // covariant!
}

The compiler generates:
class A {
  A foo() { return this; } // A.foo()LA;
}
class B {
  B foo() { return this; } // B.foo()LB;
  /*ACC_SYNTHETIC ACC_BRIDGE*/ A foo() { return <B.foo()LB;>; } //B.foo()LA;
}

And a third party class calls:

class C {
  void m()
  {
    A a = new A();
    B b = new B();
    a.foo(); // A.foo()LA;, call stack depth 1
    b.foo(); // B.foo()LB;, call stack depth 1
    a = b;
    a.foo(); // bytecode says A.foo()LA;, VM calls B.foo()LA;,
             // call stack depth 2
  }
}


> I don't think you can express this in C++.


C++ has covariant return types.

However, g++ currently does not correctly implement it in the complex corner cases. There are some issues if you try to mix multiple, virtual inheritance with covariance in C++. And other compilers out there (including some of the popular non-free ones) don't do covariance at all, even though it is in the standard, so portable C++ should not use covariance.


--
Someday, I might put a cute statement here.

Eric Blake ebb9@byu.net


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]