diff -r acdec92db672 -r cb67307942f3 src/hotspot/share/classfile/javaClasses.cpp --- a/src/hotspot/share/classfile/javaClasses.cpp Tue Mar 19 16:16:39 2019 +0100 +++ b/src/hotspot/share/classfile/javaClasses.cpp Wed Apr 10 08:15:45 2019 +0200 @@ -65,6 +65,7 @@ #include "runtime/vframe.inline.hpp" #include "utilities/align.hpp" #include "utilities/preserveException.hpp" +#include "utilities/utf8.hpp" #if INCLUDE_JVMCI #include "jvmci/jvmciJavaClasses.hpp" #endif @@ -217,7 +218,7 @@ void java_lang_String::set_compact_strings(bool value) { CompactStringsFixup fix(value); - InstanceKlass::cast(SystemDictionary::String_klass())->do_local_static_fields(&fix); + SystemDictionary::String_klass()->do_local_static_fields(&fix); } Handle java_lang_String::basic_create(int length, bool is_latin1, TRAPS) { @@ -4056,6 +4057,48 @@ int java_lang_System::out_offset_in_bytes() { return static_out_offset; } int java_lang_System::err_offset_in_bytes() { return static_err_offset; } +// Support for jdk_internal_misc_UnsafeConstants +// +class UnsafeConstantsFixup : public FieldClosure { +private: + int _address_size; + int _page_size; + bool _big_endian; + bool _use_unaligned_access; +public: + UnsafeConstantsFixup() { + // round up values for all static final fields + _address_size = sizeof(void*); + _page_size = os::vm_page_size(); + _big_endian = LITTLE_ENDIAN_ONLY(false) BIG_ENDIAN_ONLY(true); + _use_unaligned_access = UseUnalignedAccesses; + } + + void do_field(fieldDescriptor* fd) { + oop mirror = fd->field_holder()->java_mirror(); + assert(mirror != NULL, "UnsafeConstants must have mirror already"); + assert(fd->field_holder() == SystemDictionary::UnsafeConstants_klass(), "Should be UnsafeConstants"); + assert(fd->is_final(), "fields of UnsafeConstants must be final"); + assert(fd->is_static(), "fields of UnsafeConstants must be static"); + if (fd->name() == vmSymbols::address_size_name()) { + mirror->int_field_put(fd->offset(), _address_size); + } else if (fd->name() == vmSymbols::page_size_name()) { + mirror->int_field_put(fd->offset(), _page_size); + } else if (fd->name() == vmSymbols::big_endian_name()) { + mirror->bool_field_put(fd->offset(), _big_endian); + } else if (fd->name() == vmSymbols::use_unaligned_access_name()) { + mirror->bool_field_put(fd->offset(), _use_unaligned_access); + } else { + assert(false, "unexpected UnsafeConstants field"); + } + } +}; + +void jdk_internal_misc_UnsafeConstants::set_unsafe_constants() { + UnsafeConstantsFixup fixup; + SystemDictionary::UnsafeConstants_klass()->do_local_static_fields(&fixup); +} + int java_lang_Class::_klass_offset; int java_lang_Class::_array_klass_offset; int java_lang_Class::_oop_size_offset;