--- 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;