Civilizer - let's civilize those primitive types !

Remi Forax forax at univ-mlv.fr
Tue Jan 10 22:38:25 UTC 2023


Hi all,
i've developed a small prototype of what the semantics for the next round could be
  https://github.com/forax/civilizer/

The prototype works with the latest valhalla early access build
  https://jdk.java.net/valhalla/

Basically, everything is an object, using @Value in front of a class or a record transforms it to a value class, a class with no identity
(== compares the fields, synchronized throws an IllegalMonitorStateException, new WeakRef<>(...) throws an IdentityException).
Adding @ZeroDefault means that the default value of the value class which is not null is all fields filled with zero.

@NonNull allows to declare a non-null type (there is also @Nullable which is the default if there is no null aware annotation).
For parameters, like Kotlin, sending null to a parameter of a method annotated with @NonNull throws a NPE.
For a field a zero-default annotated with @NonNull ask for flattening, trying to store null also throws a NPE.
For a field which is not a zero-default, even if declared @NonNull, the runtime will *not* throw a NPE because the field is null before reaching its initialization assignment in the constructor (and a constructor can call any methods).

>From the VM POV, a Q-type never appears inside a method descriptor. It appears inside field descriptor but putfield, getfield and withfield allows a field declared as a Q-type to be accessed as a L-type (this is currently simulated for getfield and putfield with an invokedynamic). This is very similar to the way the VM deals with arrays. And the VM knows if a parameter is a Q-type or not despite the fact that only L-type appears in the method descriptor because the Q-type are declared in the Preload table of the class. 

It means that if a class/record is not accessed directly by a constructor but by some static factories (like Optional) then moving in between an identity type, a value type (with zero-default or not) are backward compatible changes.

regards,
Rémi



More information about the valhalla-dev mailing list