[PATCH] Simplification proposal regarding TYPE-field initialization in primitive wrappers

Сергей Цыпанов sergei.tsypanov at yandex.ru
Tue Nov 26 19:56:44 UTC 2019


Hello Remi,

> int.class is compiled by javac as Integer.TYPE

so this is the reason why assertion works in the test.

> the opcode ldc only works with an object/interface class, not with a primitive type [1].

Thanks for pointing this out, I think I should read that whole chapter again.

Regards,
Sergey Tsypanov

26.11.2019, 21:45, "Remi Forax" <forax at univ-mlv.fr>:
> 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