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