On Mon, 1 Jun 2026 09:11:30 GMT, David Simms <[email protected]> wrote:

>> This is a "*sub-review pull request*" for the first 
>> [preview](https://openjdk.org/jeps/12) of [JEP 401: Value Classes and 
>> Objects](https://openjdk.org/jeps/401), specifically 
>> [JDK-8317279](https://bugs.openjdk.org/browse/JDK-8317279): Standard library 
>> implementation of value classes and objects 
>> 
>>> [!NOTE]
>>> This pull request and the other sub-review pull requests listed below are 
>>> based on the "*master pull request*" 
>>> (https://github.com/openjdk/jdk/pull/31120). It contains the same full set 
>>> of code changes as the "*master pull request*" to preserve the full 
>>> implementation context; the language compiler, JVM, and standard library 
>>> changes are intertwined. This separate pull requests exist only to 
>>> subdivide the review and related discussion by area.
>> 
>> Other areas for review:
>> 
>> - [JDK-8317277](https://bugs.openjdk.org/browse/JDK-8317277): Java language 
>> implementation of value classes and objects
>>   - https://github.com/openjdk/jdk/pull/31121
>> - [JDK-8317278](https://bugs.openjdk.org/browse/JDK-8317278): JVM 
>> implementation of value classes and objects
>>   - https://github.com/openjdk/jdk/pull/31122
>> 
>> Code changes resulting from the review process should be made in 
>> [`valhalla/lworld`](https://github.com/openjdk/valhalla/).
>> 
>> `valhalla/lworld` is currently updated from `jdk/master` whenever a weekly 
>> [`jdk` tag](https://github.com/openjdk/jdk/tags) is created. At that time, 
>> code changes from `valhalla/lworld` will be propagated to the master pull 
>> request and to all sub-review pull requests, including this one.
>> 
>> Ultimately, review sign-off will be recorded on the "*master pull request*", 
>> and this pull request will be closed without integration.
>> 
>> This pull request has a large code surface area and often conflicts with 
>> `jdk/master` on a daily basis. Refer to 
>> [`valhalla/lworld`](https://github.com/openjdk/valhalla/) for the latest 
>> state of the project code, keeping in mind that it may lag several days 
>> behind `jdk/master`. Both repositories may be needed as references during 
>> review.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> David Simms has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains 2754 commits:
> 
>  - Merge remote-tracking branch 'valhalla/lworld' into 
> jep401_sub_review_8317279
>  - Merge
>    
>    Merge jdk-27+24
>  - 8385674: [lworld] TestNullableInlineTypes.java fails after JDK-8325632
>    
>    Reviewed-by: mchevalier
>  - 8385652: [lworld] RedefineClasses should use stack map frame name
>    
>    Reviewed-by: fparain
>  - 8384107: [lworld] Update runtime/contended tests to run the same testing 
> for value classes
>    
>    Reviewed-by: fparain, lmesnik
>  - 8385600: [lworld] DA/DU issues with strict fields
>    
>    Reviewed-by: vromero
>  - 8384897: [lworld] this.staticField should be restricted in early 
> construction context
>    
>    Reviewed-by: liach, vromero
>  - 8385601: [lworld] Update testing documentation for the ValueClassPlugin 
> jtreg option
>    
>    Reviewed-by: lmesnik
>  - 8385569: [lworld] Apply JDK-8343767 to Valhalla specific StubRoutines
>    
>    Reviewed-by: fparain, vlivanov
>  - 8385581: [lworld] Remove the experimental JVMCI feature
>    8382708: [lworld] JVMCI support for Value Objects
>    8372605: [lworld] 
> compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJava*.java
>  fail with --enable-preview
>    
>    Reviewed-by: thartmann
>  - ... and 2744 more: https://git.openjdk.org/jdk/compare/2c7efc08...9e804255

# JEP 401 Core library change overview

## Serialization
Value classes/strict init instance field classes need alternative deserialize
mechanism (no allocate-and-fill); required for wrapper classes

- Spec clarifications
- Alternative mechanism implementation (no plan for general availability)

## ClassFile API
- `InnerClasses` attributes now must emit `ACC_IDENTITY` in preview and must not
  emit `ACC_IDENTITY` out of preview; same for core reflection
  `Class.getModifiers()`, may be confusing.
- `LoadableDescriptors` allows but does not require class loading otherwise not
  legal per JVMS; trivial representation in ClassFile API and trivial impact
  on actual bytecode generation
  - Only useful for method signature or field signature types in identity
    classes known possibly unloaded before, so not used in Proxy/LmF etc. at all
- New `early_larval_frame` in `StackMapTable` attribute, related stack map
  generation logic (and `WritableField` for that etc.) and non-static
  `ACC_STRICT_INIT`

## MethodHandle and VarHandle Friends and Family
Most of the java.lang.invoke changes are not just for JEP 401, but for the
friends and family null restriction and non atomic prototypes (Friends and
Family).

- Introduced null restricted field lambda forms/MH/VH etc, pregeneration
- Arrays have null restricted/allowed * atomic/non-atomic flat, 4 ways
  - Array reflection uses 1 `Class` for all 4 way arrays
  - Only null-allowed atomic-flat in JEP 401 for small value objects (in
    addition to traditional reference arrays)

## Strict statics
Some DirectMethodHandle and Unsafe changes are for strict statics, including
the updates to Field accessors in `jdk.internal.reflect`. Use-before-assign
results in an `IllegalStateException`.

## Reference
Trivial doc update and `requireIdentity` addition.

## Reflection
- `AccessFlag` remodeled: The VM only has one uniform representation of flags
  regardless of class file version. So core reflection is also remodeled;
  extracted `AccessFlagSet` for general reflective object use.
- Field null restriction modeling (Friends and Family)
- Some old comments might be rolled back.

## ValueObjectMethods
Implements `==` "substitutability test", originally in `runtime` to use 
utilities
from `ObjectMethods`, might move later.

## Wrapper classes and other java.lang
- General `@MigratedValueClass` migration
- `IdentityException` for value object use (maybe `NoIdentityException` is 
better?)
- Other `System.identityHashCode` updates

## java.time and chrono
- General `@MigratedValueClass` migration

## java.util.Arrays
- Friends and Family for advanced arrays

## Other java.util
- General `@MigratedValueClass` migration
- identity restriction for `IdentityHashMap` and `WeakHashMap`

## `jdk.internal.access`
For `AccessFlag` remodeling.

## `classfile.impl`
- Hotspot verifier parity
- Class file version validation for access flags
- Strict init instance field support
- Recognition of new LoadableDescriptorAttribute

## Unsafe
- Friends and Family

## jrtfs, module, and Preview jimage
- ???

## jdk.internal.reflect
- AccessFlag remodeling
- Strict static support for field accessors

## Other annotations
- Internal F&F and other support

## jdeps
- javap: Better access flag and stack map writing
- jdeprscan: Changes from jimage stuff

## Array.c, jfr EventClassBuilder
- Old change, should be reverted

## sun.misc.Unsafe
Barricade hack APIs against value classes/objects

-------------

PR Comment: https://git.openjdk.org/jdk/pull/31123#issuecomment-4624101747

Reply via email to