Miranda methods and Methods added by Code Generators

Andrew Dinn adinn at redhat.com
Fri Aug 6 08:21:07 PDT 2010


Dear Compiler Devs,

The JBoss AOP team recently ran in to a problem when transforming an 
abstract class offline (see https://jira.jboss.org/browse/JBAOP-731 for 
details). The AOP transform operation loads the bytecode for a class, 
call it X, manipulates it to insert, inter alia, a getAdvisor() method 
then rewrites the classfile. Method getAdvisor is SYNTHETIC and has a 
Code attribute. It is _NOT_ ABSTRACT.

When javac subsequently tries to compile the source for Y extends X it 
complains that Y does not implement getAdvisor(). It turns out that 
javac is assuming that the SYNTHETIC implementation found in the 
transformed classfile for X is a Miranda method even though it is not 
ABSTRACT. The relevant code is in method

com.sun.tools.javac.code.Types.implementation(MethodSymbol ms, 
TypeSymbol, Types, boolean)

The offending code is

1967
1968    MethodSymbol impl = cache.get(origin);
. . .   if (impl == null) {
             for (Type t = origin.type; t.tag == CLASS || t.tag == 
TYPEVAR; t = types.supertype(t)) {
                 while (t.tag == TYPEVAR)
                     t = t.getUpperBound();
                 TypeSymbol c = t.tsym;
                 for (Scope.Entry e = c.members().lookup(ms.name);
                      e.scope != null;
                      e = e.next()) {
                     if (e.sym.kind == Kinds.MTH) {
                         MethodSymbol m = (MethodSymbol) e.sym;
                         if (m.overrides(ms, origin, types, checkResult) &&
                             (m.flags() & SYNTHETIC) == 0) {
                             impl = m;
                             cache.put(origin, m);
                             return impl;
                         }
                     }
                 }
             }
         }


My contention is that this is a bug. javac should only regard ABSTRACT 
SYNTHETIC methods as Miranda methods. After all, Miranda methods are all 
abstract are they not?

Is there some good reason why _ANY_ SYNTHETIC method has to be rejected? 
If not then the recommended patch would be to change the 'if' condition 
at line 1978/9 above to

                         if (m.overrides(ms, origin, types, checkResult) &&
                             (m.flags() & (SYNTHETIC|ABSTRACT)) != 
(SYNTHETIC|ABSTRACT) {

regards,


Andrew Dinn
-----------
Senior Software Engineer, JBoss
Red Hat UK Ltd
Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod 
Street, Windsor, Berkshire,
SI4 1TE, United Kingdom.
Registered in UK and Wales under Company Registration No. 3798903
Directors: Michael Cunningham (USA), Charlie Peters (USA), Matt Parsons
(USA)  and Brendan Lane (Ireland)





More information about the compiler-dev mailing list