RFR: 8263595: Remove oop type punning in JavaCallArguments

Stefan Karlsson stefank at openjdk.java.net
Mon Mar 15 14:40:23 UTC 2021


JavaCallArguments has this code and comment:

// Helper for push_oop and the like. The value argument is a
// "handle" that refers to an oop. We record the address of the
// handle rather than the designated oop. The handle is later
// resolved to the oop by parameters(). This delays the exposure of
// naked oops until it is GC-safe.
template<typename T>
inline int push_oop_impl(T handle, int size) {
  // JNITypes::put_obj expects an oop value, so we play fast and
  // loose with the type system. The cast from handle type to oop
  // *must* use a C-style cast. In a product build it performs a
  // reinterpret_cast. In a debug build (more accurately, in a
  // CHECK_UNHANDLED_OOPS build) it performs a static_cast, invoking
  // the debug-only oop class's conversion from void* constructor.
  JNITypes::put_obj((oop)handle, _value, size); // Updates size.
  return size; // Return the updated size.
}
The type T is either an oop* or jobject (JNI handle). This puts something that isn't an oop inside an oop.

I propose that we don't do this. Instead we could pass the handle (address containing the oop), and then in put_obj convert that address to an intptr_t, which matches well with the `to` argument of those functions.

I've been running this (and some other changes) with ZGC on Linux x64 through tier1-tier7.

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

Commit messages:
 - 8263595: Remove oop type punning in JavaCallArguments

Changes: https://git.openjdk.java.net/jdk/pull/3014/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=3014&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8263595
  Stats: 46 lines in 8 files changed: 2 ins; 26 del; 18 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3014.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3014/head:pull/3014

PR: https://git.openjdk.java.net/jdk/pull/3014


More information about the hotspot-dev mailing list