Evolving the wrapper classes
Dan Smith
daniel.smith at oracle.com
Wed Jun 17 22:37:18 UTC 2020
> On Jun 17, 2020, at 4:13 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
>
>> - Where necessary (depending on the operations being performed), the compiler generates conversions between 'I' and 'java/lang/Integer$val'. 'I' is preferred wherever possible.
>
> We have to use QInteger$val whenever we use int as a type parameter, the rest of the time, we can use I.
Right. Specifically, if we support inline types as type arguments before we get to specialization, we'll use erasure, which looks like:
new java/util/ArrayList;
// dup, init
astore 1
aload 1
iconst_0
invokestatic Qjava/lang/Integer$val;.<new>(I)Qjava/lang/Integer$val; // <-- conversion
invokevirtual java/util/ArrayList.add:(Ljava/lang/Object;)Z
pop
aload1
iconst_0
invokevirtual java/util/ArrayList.get(I)Ljava/lang/Object;
checkcast Qjava/lang/Integer$val;
invokevirtual Qjava/lang/Integer$val;.intValue()I // <-- conversion
And then there's also instance method invocations:
iconst_0
invokestatic Qjava/lang/Integer$val;.<new>(I)Qjava/lang/Integer$val; // <-- conversion
invokevirtual Qjava/lang/Integer$val;.floatValue()F
(Note that none of these conversions are "boxing" or "unboxing". They're strictly compilation artifacts. It may be useful to come up with a new word for them.)
More information about the valhalla-spec-observers
mailing list