< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
rev 54303 : 8221477: Inject os/cpu-specific constants into Unsafe from JVM
Summary: Initialize Unsafe os/cpu-specific constants using injection instead of native callouts
Reviewed-by: duke
*** 3988,3997 ****
--- 3988,4041 ----
int java_lang_System::in_offset_in_bytes() { return static_in_offset; }
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:
+ jint _address_size;
+ jint _page_size;
+ jboolean _big_endian;
+ jboolean _use_unaligned_access;
+ public:
+ UnsafeConstantsFixup(jint address_size, jint page_size, jboolean big_endian, jboolean use_unaligned_access)
+ : _address_size(address_size), _page_size(page_size), _big_endian(big_endian), _use_unaligned_access(use_unaligned_access) {}
+
+ void do_field(fieldDescriptor* fd) {
+ if (fd->name() == vmSymbols::address_size_name()) {
+ oop mirror = fd->field_holder()->java_mirror();
+ assert(fd->field_holder() == SystemDictionary::UnsafeConstants_klass(), "Should be UnsafeConstants");
+ assert(mirror != NULL, "UnsafeConstants must have mirror already");
+ mirror->int_field_put(fd->offset(), _address_size);
+ } else if (fd->name() == vmSymbols::page_size_name()) {
+ oop mirror = fd->field_holder()->java_mirror();
+ assert(fd->field_holder() == SystemDictionary::UnsafeConstants_klass(), "Should be UnsafeConstants");
+ assert(mirror != NULL, "UnsafeConstants must have mirror already");
+ mirror->int_field_put(fd->offset(), _page_size);
+ } else if (fd->name() == vmSymbols::big_endian_name()) {
+ oop mirror = fd->field_holder()->java_mirror();
+ assert(fd->field_holder() == SystemDictionary::UnsafeConstants_klass(), "Should be UnsafeConstants");
+ assert(mirror != NULL, "UnsafeConstants must have mirror already");
+ mirror->bool_field_put(fd->offset(), _big_endian);
+ } else if (fd->name() == vmSymbols::use_unaligned_access_name()) {
+ oop mirror = fd->field_holder()->java_mirror();
+ assert(fd->field_holder() == SystemDictionary::UnsafeConstants_klass(), "Should be UnsafeConstants");
+ assert(mirror != NULL, "UnsafeConstants must have mirror already");
+ mirror->bool_field_put(fd->offset(), _use_unaligned_access);
+ }else {
+ assert(false, "unexpected UnsafeConstants field");
+ }
+ }
+ };
+
+ void jdk_internal_misc_UnsafeConstants::set_unsafe_constants(jint address_size, jint page_size, jboolean big_endian, jboolean use_unaligned_access) {
+ UnsafeConstantsFixup fix(address_size, page_size, big_endian, use_unaligned_access);
+ InstanceKlass::cast(SystemDictionary::UnsafeConstants_klass())->do_local_static_fields(&fix);
+ }
+
int java_lang_Class::_klass_offset;
int java_lang_Class::_array_klass_offset;
int java_lang_Class::_oop_size_offset;
int java_lang_Class::_static_oop_field_count_offset;
int java_lang_Class::_class_loader_offset;
< prev index next >