[lworld] RFR: 8375306: [lworld] Investigate alternatives to flatArrayOopDesc::obj_at implementation [v4]

Ivan Walulya iwalulya at openjdk.org
Mon Feb 16 13:55:47 UTC 2026


On Fri, 13 Feb 2026 18:58:47 GMT, Frederic Parain <fparain at openjdk.org> wrote:

>> First batch of changes to remove potentially dangerous calls to objArrayOopDesc::obj_at().
>> Changes are more extensive than intended. In most cases, code modifications consist in using a refArrayOop type instead of a objArrayOop type, because most of the arrays the JVM deals with for its own purpose are always reference arrays (because they are arrays of identity type elements). The patch also adds a new API allowing the VM to request the allocation of a reference array.
>> Code dealing with user provided arrays must be ready to handle exceptions when accessing objArrays.
>> 
>> This is a short term fix, fixing a few bugs, and trying to make the code more robust using the meta-data types. For the long term, a better solution is needed. Accesses to both arrays and fields are becoming more and more complex because of the introduction of flattening, multiple layouts, additional properties. Forcing enforcement at each access would be expensive and wasteful, as the JVM usually operates on well-known objects or arrays. But because of the increasing complexity, having a way to quickly check the validity of an access would help making the VM code more robust.
>
> Frederic Parain has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - Fixes from Stefan's comments
>  - Fix more use sites and some TRAPS returns

Copyright year unchanged in some of the files.

src/hotspot/share/ci/ciArray.cpp line 66:

> 64:     {
> 65:       if (ary->is_refArray()) {
> 66:         refArrayOop refary = refArrayOopDesc::cast(ary);

oop_cast<refArrayOop>(ary);

src/hotspot/share/oops/oopCast.inline.hpp line 43:

> 41: template<>
> 42: inline bool is_oop_type<refArrayOop>(oop theOop) { return theOop->is_refArray(); }
> 43: template<>

add:

template<>
inline bool is_oop_type<flatArrayOop>(oop theOop) { return theOop->is_flatArray(); }


So we can get rid of `flatArrayOopDesc::cast`

src/hotspot/share/prims/foreignGlobals.inline.hpp line 36:

> 34: template<typename T>
> 35: void ForeignGlobals::parse_register_array(objArrayOop jarray, StorageType type_index, GrowableArray<T>& array, T (*converter)(int)) {
> 36:   refArrayOop refarray = refArrayOopDesc::cast(jarray);

why not use `oop_cast` as below? And probably remove `flatArrayOopDesc::cast` so we don't introduce new uses of `flatArrayOopDesc::cast`. Eventually get rid of `refArrayOopDesc::cast` (it is already used in so many places).

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

PR Review: https://git.openjdk.org/valhalla/pull/2033#pullrequestreview-3808558955
PR Review Comment: https://git.openjdk.org/valhalla/pull/2033#discussion_r2812405012
PR Review Comment: https://git.openjdk.org/valhalla/pull/2033#discussion_r2812411792
PR Review Comment: https://git.openjdk.org/valhalla/pull/2033#discussion_r2812364079


More information about the valhalla-dev mailing list