`FieldClosure` is used for iterating fields in an object. For Valhalla, it has been enhanced to handle fields that are inside inlined fields. However, the current implementation has two problems:
[1] It type casts the address of an inlined field into an `oop` pointer. This is unsafe as many operations, such as getting the header of an `oop`, will not work with such an `oop` pointer: https://github.com/openjdk/jdk/blob/b1f975efa481bd5e20c1b7d58a87d0866df205e6/src/hotspot/share/runtime/fieldDescriptor.cpp#L216 [2] The parameter `base_offset` is used in many functions. Its meaning is unclear and inconsistent. https://github.com/openjdk/jdk/blob/b1f975efa481bd5e20c1b7d58a87d0866df205e6/src/hotspot/share/runtime/fieldDescriptor.cpp#L159 https://github.com/openjdk/jdk/blob/b1f975efa481bd5e20c1b7d58a87d0866df205e6/src/hotspot/share/oops/instanceKlass.hpp#L99-L101 This RFE refactors `FieldClosure` to avoid the above problems. `FieldClosure` now carries information about inlined fields. This information can be used by various field iteration code to simplify their operations. See `FieldClosure::inline_klass()` and `FieldClosure::inline_offset()`. This RFE also moves a few common operations into utility functions to avoid code duplication. Also: - Fixed a bug in `FlatArrayKlass::oop_print_elements_on()` in the handling of nullable elements. --------- - [x] I confirm that I make this contribution in accordance with the [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). ------------- Commit messages: - fixed windows build - refactoring Changes: https://git.openjdk.org/jdk/pull/32565/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32565&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8391720 Stats: 733 lines in 17 files changed: 548 ins; 85 del; 100 mod Patch: https://git.openjdk.org/jdk/pull/32565.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/32565/head:pull/32565 PR: https://git.openjdk.org/jdk/pull/32565
