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