RFR JDK-8134329: TeeOpTest.java fails across platforms after fix for JDK-8129547

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Aug 25 11:40:24 UTC 2015


Hello,

This is a fix for:

https://bugs.openjdk.java.net/browse/JDK-8134329

which has been introduced by the recent fix for JDK-8129547.

The problem is that the recent fix changed the hashCode/equals 
properties of a BSM key object; such properties used to be identical to 
those of the corresponding CONSTANT_InvokeDynamic_info entry, where 
dynamic arguments are also taken into account. The fix changed that to 
only consider static arguments for BSM key hashCode/equals computation.

While this is the correct behavior, this led to an issue in 
ClassWriter.writePool, as the following code:

poolbuf.appendByte(CONSTANT_InvokeDynamic);
poolbuf.appendChar(bootstrapMethods.size() - 1);
poolbuf.appendChar(pool.put(nameType(dynSym)));

Makes the implicit assumption that, whenever a new 
CONSTANT_InvokeDynamic_info entry is being added, a new BSM entry will 
also be added (so that the index of the indy entry is set to point to 
the last element of the BSM array).

Now that hashCode/equals for BSM keys is different than that of the 
corresponding CONSTANT_InvokeDynamic_info entry, there could be cases in 
which a new CONSTANT_InvokeDynamic_info is added, but no new BSM key is 
created (as an existing key can be reused). This happens for instance 
when the invokedynamic associated with the capture of two method 
references features same static arguments but different dynamic 
arguments (see test).

A webrev with the fix is here:

http://cr.openjdk.java.net/~mcimadamore/8134329/

Feedback welcome.

Cheers
Maurizio


More information about the compiler-dev mailing list