Arrays.copyOf does not work with value type arrays

John Rose john.r.rose at oracle.com
Wed Mar 15 17:48:12 UTC 2017


On Mar 15, 2017, at 7:51 AM, Tobias Hartmann <tobias.hartmann at oracle.com> wrote:
> 
> Hi,
> 
> I'm looking into C2 intrinsic support for value types and noticed that below code fails with:
> 
> Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
> 	at java.lang.invoke.CallSite.makeSite(CallSite.java:347)
> 	at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:247)
> 	at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:237)
> 	at Test.main(Test.java:23)
> Caused by: java.lang.ClassNotFoundException: java/util/Arrays$copyOf$433071630$${QPoint;}
> 	at java.lang.Class.forName0(Native Method)
> 	at java.lang.Class.forName(Class.java:372)
> 	at java.lang.invoke.GenericStaticDispatch.metafactory(GenericStaticDispatch.java:14)
> 	at java.lang.invoke.CallSite.makeSite(CallSite.java:308)
> 	... 3 more
> 
> Is this supposed to work with MVT1.0?

This is not supposed to work in MVT1.0 because __ByValue and __Make keywords
introduce source-level types not present in MVT1.0.  The type "array-of-Q-Point" is
going to be confusing to existing library code, until it is properly generified.

(The type "array-of-L-Point" would not be problematic, but it is undesirable since
each Point is boxed as an L-Point.  Such are the tradeoffs of MVT1.0.)

MVT1.0 allows the user to work with "flat" arrays of values ("array-of-Q-Foo")
but *only* through method handles, not directly in source code.

To get the source code story straightened out, we need to formulate the rules
for distinguishing "array-of-Q-Foo" from "array-of-L-Foo".  The latter type, is
relatively useless and perhaps can be omitted totally, but I think that legacy
code might have an occasional need to work with it.  In any case it's an open
issue, and MVT1.0 avoids it.

— John


More information about the valhalla-dev mailing list