specializing generic methods

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Fri Aug 29 20:42:27 UTC 2014


Hi,
as you can see from recent commits, we are starting to tackle the 
problem of specialized generic method calls; Brian and I were thinking 
about the following corner-case:

  class Box<any T> {
      T t;

      static <any U> Box<U> make(U u) { return null; }
  }


  class Client {

      <any Z> void testAny(Z z) {
          Z z2 = Box.make(z).t;
      }

      <Z> void testNonAny(Z z) {
          Z z2 = Box.make(z).t;
      }
  }

There are several layers of decisions to be made here:

1) Which of the two generic calls above should receive special treatment 
and be rewritten as indy?

2) Which field access should receive special treatment and get a 
corresponding BytecodeMapping attribute? Recall that, currently, the 
specializer needs BytecodeMapping on member accesses in order to quickly 
identify those members whose constant pool entries are likely to become 
'stale' after specialization - i.e. because the entry would need to go 
from Box.t to Box${T=I}.t.

3) Consider the case where the first method is called as follows:

testAny(1)

How is the specializer supposed to specialize the body of the generic 
'testAny' method? Does this involve replaying inference where Z=int?


Our answers so far:

1) Only the call in testAny should be specialized using indy - the 
second generic call is always a reference instantiation - therefore can 
be safely skipped. In principle we could even get away with leaving the 
first call untouched, but this will mean the specializer will have to be 
replacing invokestatic with indy - which seems a bit too on the heavy side.

2) The first field access (in testAny) should get a corresponding 
BytecodeMapping, as the field owner in the CP might need rewriting.

3) Our current thinking is that a simple type substitution all we need - 
i.e. we see that the inferred return type is Box<Z> and we replace Z for 
int, obtaining Box<int> - which is then mangled into Box${0=I}. Can you 
think of cases where this approach would be insufficient - i.e. where 
replaying inference would lead to a substantially different result 
w.r.t. the one obtained through substitution?

Questions, questions, questions...

Maurizio





More information about the valhalla-dev mailing list