Parameterizing on incomplete types
Jamison Hope
jrh@theptrgroup.com
Thu Dec 1 22:16:00 GMT 2011
On Dec 1, 2011, at 4:28 PM, Per Bothner wrote:
> On 12/01/2011 01:21 PM, Jamison Hope wrote:
>>> It probably makes sense to generate the bridge methods at the same
>>> time as we check for missing implementations.
>>
>> Where are they generated now?
>
> My point is: they're not. That needs to be implemented.
At all? I thought you meant they weren't being generated here as a
result
of you commenting out the relevant part of ClassExp or because they
don't
yet work with this circular parameterization nonsense.
I just meant for the regular (non-parameterized) case. For instance,
when javac compiles:
> // A.java
> public class A
> {
> public A get() { return null; }
> }
>
> // B.java
> public class B extends A
> {
> public B get() { return null; }
> }
B.class ends up with an extra method:
> Compiled from "B.java"
> public class B extends A{
> public B();
> public B get();
> public A get();
> }
The third method is marked SYNTHETIC|PUBLIC|BRIDGE (0x1041) and its
implementation is
aload_0
invokevirtual 2 // call public B get()
areturn
and it exists so that B actually overrides A's get() method with an
identical signature.
But it turns out that when Kawa compiles the Scheme equivalent,
> (define-simple-class A ()
> ((get) ::A #!null))
>
> (define-simple-class B (A)
> ((get) ::B #!null))
B.class doesn't get the extra method:
> Compiled from "bridge.scm"
> public class bridge.B extends bridge.A{
> public bridge.B get();
> public bridge.B();
> }
But maybe that's not what you're referring to as a bridge method. I
can't
find any instance of the word "bridge" or 0x0040 as anything but
ACC_VOLATILE
in the JVM spec.
>> Is that what the recursive call to
>> ClassExp#getImplMethods() is doing?
>
> No, that just searches for possible implementation methods.
> This is done for each abstract method.
>
> The key parts of the logic is:
>
> methods = compiledType.getAbstractMethods();
> nmethods = methods.length;
> ...
> for (int i = 0; i < nmethods; i++)
> {
> Method meth = methods[i];
> ...
> Vector vec = new Vector();
> getImplMethods(compiledType, mname, ptypes, vec);
> if (vec.size() != 1)
> error(...)
>
> This logic needs to be made aware of parameterized types.
> --
> --Per Bothner
> per@bothner.com http://per.bothner.com/
--
Jamison Hope
The PTR Group
www.theptrgroup.com
More information about the Kawa
mailing list