Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8263595

Remove oop type punning in JavaCallArguments

    XMLWordPrintable

Details

    • Enhancement
    • Resolution: Fixed
    • P4
    • 17
    • None
    • hotspot
    • None
    • b14

    Description

      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.

      Attachments

        Issue Links

          Activity

            People

              stefank Stefan Karlsson
              stefank Stefan Karlsson
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: