--- old/src/hotspot/share/classfile/javaClasses.inline.hpp 2017-11-28 17:15:09.821889084 +0100 +++ new/src/hotspot/share/classfile/javaClasses.inline.hpp 2017-11-28 17:15:09.561889093 +0100 @@ -26,6 +26,7 @@ #define SHARE_VM_CLASSFILE_JAVACLASSES_INLINE_HPP #include "classfile/javaClasses.hpp" +#include "oops/access.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/oopsHierarchy.hpp" @@ -53,6 +54,12 @@ assert(is_instance(java_string), "must be java_string"); return (typeArrayOop) java_string->obj_field(value_offset); } +typeArrayOop java_lang_String::value_no_keepalive(oop java_string) { + assert(initialized && (value_offset > 0), "Must be initialized"); + assert(is_instance(java_string), "must be java_string"); + oop value = HeapAccess::oop_load_at(java_string, value_offset); + return (typeArrayOop)value; +} unsigned int java_lang_String::hash(oop java_string) { assert(initialized && (hash_offset > 0), "Must be initialized"); assert(is_instance(java_string), "must be java_string"); @@ -66,13 +73,13 @@ return coder == CODER_LATIN1; } int java_lang_String::length(oop java_string) { + typeArrayOop value = java_lang_String::value_no_keepalive(java_string); assert(initialized, "Must be initialized"); assert(is_instance(java_string), "must be java_string"); - typeArrayOop value_array = ((typeArrayOop)java_string->obj_field(value_offset)); - if (value_array == NULL) { + if (value == NULL) { return 0; } - int arr_length = value_array->length(); + int arr_length = value->length(); if (!is_latin1(java_string)) { assert((arr_length & 1) == 0, "should be even for UTF16 string"); arr_length >>= 1; // convert number of bytes to number of elements