[PATCH] Simplification proposal regarding TYPE-field initialization in primitive wrappers
Remi Forax
forax at univ-mlv.fr
Tue Nov 26 19:45:07 UTC 2019
Hi Sergey,
hum, it doesn't work :)
int.class is compiled by javac as Integer.TYPE,
the opcode ldc only works with an object/interface class, not with a primitive type [1].
regards,
Rémi
[1] https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-6.html#jvms-6.5.ldc
----- Mail original -----
> De: "Сергей Цыпанов" <sergei.tsypanov at yandex.ru>
> À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
> Envoyé: Mardi 26 Novembre 2019 20:29:06
> Objet: [PATCH] Simplification proposal regarding TYPE-field initialization in primitive wrappers
> Hello,
>
> while using java.lang.Integer.TYPE I've found out that currently wrapper classes
> for primitives initialize their own TYPE-fields by calling native method
> java.lang.Class.getPrimitiveClass().
>
> This can be simplified by changing existing declaration (here for
> java.lang.Integer)
>
> @SuppressWarnings("unchecked")
> public static final Class<Integer> TYPE = (Class<Integer>)
> Class.getPrimitiveClass("int");
>
> to
>
> public static final Class<Integer> TYPE = int.class;
>
> This is likely to improve start-up time as Class.getPrimitiveClass() is called 9
> times (8 primitive type wrappers + java.lang.Void), after the change this
> method is not called at all and thus can be removed along with its backing C++
> code on VM-side. The fields are initialized purely on Java side.
>
> I've verified correctness of the substitution with this test run on JDK 11
>
> @Test
> void name() {
> assert void.class == Void.TYPE;
> assert boolean.class == Boolean.TYPE;
> assert byte.class == Byte.TYPE;
> assert char.class == Character.TYPE;
> assert short.class == Short.TYPE;
> assert int.class == Integer.TYPE;
> assert long.class == Long.TYPE;
> assert float.class == Float.TYPE;
> assert double.class == Double.TYPE;
> }
>
> The patch is attached.
>
> Regards,
> Sergey Tsypanov
More information about the core-libs-dev
mailing list