On Mon, 30 Jun 2025 23:27:49 GMT, David Beaumont <d...@openjdk.org> wrote:

> Refactoring `ImageReader` to make it easy to add preview mode functionality 
> for Valhalla.
> 
> This PR is a large change to `ImageReader` (effectively a rewrite) but 
> reduces the surface area of the API significantly, reduces code complexity 
> and increases performance/memory efficiency. The need for this sort of change 
> comes from the need to support "preview mode" in Valhalla for classes loaded 
> from core modules.
> 
> ### Preview Mode
> 
> In the proposed preview mode support for Valhalla, a resource with the name 
> `/modules/<module>/<path>` may come from one of two locations in the 
> underlying jimage file; `/<module>/<path>` or 
> `/<module>/META-INF/preview/<path>`. Furthermore, directories (represented as 
> directory nodes via the API) will have a potentially different number of 
> child nodes depending on whether preview mode is in effect, and some 
> directories may only exist at all in preview mode.
> 
> Furthermore, the directories and symbolic link nodes in `/packages/...` will 
> also be affected by the existence of new package directories. To retain 
> consistency and avoid "surprises" later, all of this needs to be taken into 
> account.
> 
> Below is a summary of the main changes for mainline JDK to better support 
> preview mode later:
> 
> ### 1: Improved encapsulation for preview mode
> 
> The current `ImageReader` code exposes the data from the jimage file in 
> several ways; via the `Node` abstraction, but also with methods which return 
> an `ImageLocation` instance directly. In preview mode it would not be 
> acceptable to return the `ImageLocation`, since that would leak the existence 
> of resources in the `META-INF/preview` namespace and lets users see resource 
> nodes with names that don't match the underlying `ImageLocation` from which 
> their contents come.
> 
> As such, the PR removes all methods which can leak `ImageLocation` or other 
> "underlying" semantics about the jimage file. Luckily most of these are 
> either used minimally and easily migrated to using nodes, or they were not 
> being used at all. This PR also removes any methods which were already unused 
> across the OpenJDK codebase (if I discover any issues with over-trimming of 
> the API during full CI testing, it will be easy to address).
> 
> ### 2. Simplification of directory child node handling
> 
> The current `ImageReader` code attempts to create parent directories "on 
> demand" for any child nodes it creates. This results in parent directories 
> having a non-empty but incomplete set of child nodes present. This is 
> referred to as the directory being "incomple...

src/java.base/share/classes/jdk/internal/jimage/ImageReader.java line 207:

> 205:             this.nodes = new HashMap<>();
> 206:             // TODO (review note): These should exist under all 
> circumstances, but there's
> 207:             //  probably a more robust way of getting it these offsets.

Suggestion:

            //  probably a more robust way of getting these offsets.

src/java.base/share/classes/jdk/internal/jimage/ImageReader.java line 211:

> 209:             this.packagesStringOffset = 
> findLocation("/packages/java.lang").getModuleOffset();
> 210: 
> 211:             // Node creation is very lazy, se can just make the 
> top-level directories

Typo:
Suggestion:

            // Node creation is very lazy, so can just make the top-level 
directories

src/java.base/share/classes/jdk/internal/jimage/ImageReader.java line 544:

> 542: 
> 543:         // A node is completed when all its direct children have been 
> built. As
> 544:         // such, non-directory nodes are always complete.

I think this might flow better:
Suggestion:

        // A node is completed when all its direct children have been built.
        // As such, non-directory nodes are always complete.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/26054#discussion_r2177769091
PR Review Comment: https://git.openjdk.org/jdk/pull/26054#discussion_r2177768332
PR Review Comment: https://git.openjdk.org/jdk/pull/26054#discussion_r2177779216

Reply via email to