hotspot/src/share/vm/classfile/javaClasses.cpp

Print this page
rev 611 : Merge

*** 1,10 **** #ifdef USE_PRAGMA_IDENT_SRC #pragma ident "@(#)javaClasses.cpp 1.250 08/01/17 09:41:13 JVM" #endif /* ! * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,10 ---- #ifdef USE_PRAGMA_IDENT_SRC #pragma ident "@(#)javaClasses.cpp 1.250 08/01/17 09:41:13 JVM" #endif /* ! * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 26,54 **** */ # include "incls/_precompiled.incl" # include "incls/_javaClasses.cpp.incl" ! // Helpful macro for computing field offsets at run time rather than hardcoding them ! #define COMPUTE_OFFSET(klass_name_as_C_str, dest_offset, klass_oop, name_symbol, signature_symbol) \ ! { \ ! fieldDescriptor fd; \ ! instanceKlass* ik = instanceKlass::cast(klass_oop); \ ! if (!ik->find_local_field(name_symbol, signature_symbol, &fd)) { \ ! fatal("Invalid layout of " klass_name_as_C_str); \ ! } \ ! dest_offset = fd.offset(); \ } // Same as above but for "optional" offsets that might not be present in certain JDK versions ! #define COMPUTE_OPTIONAL_OFFSET(klass_name_as_C_str, dest_offset, klass_oop, name_symbol, signature_symbol) \ ! { \ ! fieldDescriptor fd; \ ! instanceKlass* ik = instanceKlass::cast(klass_oop); \ ! if (ik->find_local_field(name_symbol, signature_symbol, &fd)) { \ ! dest_offset = fd.offset(); \ ! } \ } Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { // Create the String object first, so there's a chance that the String // and the char array it points to end up in the same cache line. --- 26,58 ---- */ # include "incls/_precompiled.incl" # include "incls/_javaClasses.cpp.incl" ! // Helpful routine for computing field offsets at run time rather than hardcoding them ! static void ! compute_offset(int &dest_offset, ! klassOop klass_oop, symbolOop name_symbol, symbolOop signature_symbol) { ! fieldDescriptor fd; ! instanceKlass* ik = instanceKlass::cast(klass_oop); ! if (!ik->find_local_field(name_symbol, signature_symbol, &fd)) { ! ResourceMark rm; ! tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string()); ! fatal("Invalid layout of preloaded class"); ! } ! dest_offset = fd.offset(); } // Same as above but for "optional" offsets that might not be present in certain JDK versions ! static void ! compute_optional_offset(int& dest_offset, ! klassOop klass_oop, symbolOop name_symbol, symbolOop signature_symbol) { ! fieldDescriptor fd; ! instanceKlass* ik = instanceKlass::cast(klass_oop); ! if (ik->find_local_field(name_symbol, signature_symbol, &fd)) { ! dest_offset = fd.offset(); ! } } Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { // Create the String object first, so there's a chance that the String // and the char array it points to end up in the same cache line.
*** 446,456 **** offsets_computed = true; klassOop k = SystemDictionary::class_klass(); // The classRedefinedCount field is only present starting in 1.5, // so don't go fatal. ! COMPUTE_OPTIONAL_OFFSET("java.lang.Class", classRedefinedCount_offset, k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); } int java_lang_Class::classRedefinedCount(oop the_class_mirror) { if (!JDK_Version::is_gte_jdk15x_version() --- 450,460 ---- offsets_computed = true; klassOop k = SystemDictionary::class_klass(); // The classRedefinedCount field is only present starting in 1.5, // so don't go fatal. ! compute_optional_offset(classRedefinedCount_offset, k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); } int java_lang_Class::classRedefinedCount(oop the_class_mirror) { if (!JDK_Version::is_gte_jdk15x_version()
*** 500,540 **** void java_lang_Thread::compute_offsets() { assert(_group_offset == 0, "offsets should be initialized only once"); klassOop k = SystemDictionary::thread_klass(); ! COMPUTE_OFFSET("java.lang.Thread", _name_offset, k, vmSymbols::name_name(), vmSymbols::char_array_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _eetop_offset, k, vmSymbols::eetop_name(), vmSymbols::long_signature()); ! COMPUTE_OFFSET("java.lang.Thread", _stillborn_offset, k, vmSymbols::stillborn_name(), vmSymbols::bool_signature()); // The stackSize field is only present starting in 1.4, so don't go fatal. ! COMPUTE_OPTIONAL_OFFSET("java.lang.Thread", _stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::long_signature()); // The tid and thread_status fields are only present starting in 1.5, so don't go fatal. ! COMPUTE_OPTIONAL_OFFSET("java.lang.Thread", _tid_offset, k, vmSymbols::thread_id_name(), vmSymbols::long_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.Thread", _thread_status_offset, k, vmSymbols::thread_status_name(), vmSymbols::int_signature()); // The parkBlocker field is only present starting in 1.6, so don't go fatal. ! COMPUTE_OPTIONAL_OFFSET("java.lang.Thread", _park_blocker_offset, k, vmSymbols::park_blocker_name(), vmSymbols::object_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.Thread", _park_event_offset, k, vmSymbols::park_event_name(), vmSymbols::long_signature()); } JavaThread* java_lang_Thread::thread(oop java_thread) { ! return (JavaThread*) java_thread->obj_field(_eetop_offset); } void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) { ! // We are storing a JavaThread* (malloc'ed data) into a long field in the thread ! // object. The store has to be 64-bit wide so we use a pointer store, but we ! // cannot call oopDesc::obj_field_put since it includes a write barrier! ! oop* addr = java_thread->obj_field_addr(_eetop_offset); ! *addr = (oop) thread; } typeArrayOop java_lang_Thread::name(oop java_thread) { oop name = java_thread->obj_field(_name_offset); --- 504,540 ---- void java_lang_Thread::compute_offsets() { assert(_group_offset == 0, "offsets should be initialized only once"); klassOop k = SystemDictionary::thread_klass(); ! compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::char_array_signature()); ! compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature()); ! compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature()); ! compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature()); ! compute_offset(_priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature()); ! compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature()); ! compute_offset(_eetop_offset, k, vmSymbols::eetop_name(), vmSymbols::long_signature()); ! compute_offset(_stillborn_offset, k, vmSymbols::stillborn_name(), vmSymbols::bool_signature()); // The stackSize field is only present starting in 1.4, so don't go fatal. ! compute_optional_offset(_stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::long_signature()); // The tid and thread_status fields are only present starting in 1.5, so don't go fatal. ! compute_optional_offset(_tid_offset, k, vmSymbols::thread_id_name(), vmSymbols::long_signature()); ! compute_optional_offset(_thread_status_offset, k, vmSymbols::thread_status_name(), vmSymbols::int_signature()); // The parkBlocker field is only present starting in 1.6, so don't go fatal. ! compute_optional_offset(_park_blocker_offset, k, vmSymbols::park_blocker_name(), vmSymbols::object_signature()); ! compute_optional_offset(_park_event_offset, k, vmSymbols::park_event_name(), vmSymbols::long_signature()); } JavaThread* java_lang_Thread::thread(oop java_thread) { ! return (JavaThread*)java_thread->address_field(_eetop_offset); } void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) { ! java_thread->address_field_put(_eetop_offset, (address)thread); } typeArrayOop java_lang_Thread::name(oop java_thread) { oop name = java_thread->obj_field(_name_offset);
*** 650,661 **** return 0; } } oop java_lang_Thread::park_blocker(oop java_thread) { ! assert(JDK_Version::supports_thread_park_blocker() && _park_blocker_offset != 0, ! "Must support parkBlocker field"); if (_park_blocker_offset > 0) { return java_thread->obj_field(_park_blocker_offset); } --- 650,661 ---- return 0; } } oop java_lang_Thread::park_blocker(oop java_thread) { ! assert(JDK_Version::current().supports_thread_park_blocker() && ! _park_blocker_offset != 0, "Must support parkBlocker field"); if (_park_blocker_offset > 0) { return java_thread->obj_field(_park_blocker_offset); }
*** 764,783 **** void java_lang_ThreadGroup::compute_offsets() { assert(_parent_offset == 0, "offsets should be initialized only once"); klassOop k = SystemDictionary::threadGroup_klass(); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _parent_offset, k, vmSymbols::parent_name(), vmSymbols::threadgroup_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _threads_offset, k, vmSymbols::threads_name(), vmSymbols::thread_array_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _groups_offset, k, vmSymbols::groups_name(), vmSymbols::threadgroup_array_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _maxPriority_offset, k, vmSymbols::maxPriority_name(), vmSymbols::int_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _destroyed_offset, k, vmSymbols::destroyed_name(), vmSymbols::bool_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _vmAllowSuspension_offset, k, vmSymbols::vmAllowSuspension_name(), vmSymbols::bool_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _nthreads_offset, k, vmSymbols::nthreads_name(), vmSymbols::int_signature()); ! COMPUTE_OFFSET("java.lang.ThreadGroup", _ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature()); } oop java_lang_Throwable::backtrace(oop throwable) { return throwable->obj_field_acquire(backtrace_offset); } --- 764,783 ---- void java_lang_ThreadGroup::compute_offsets() { assert(_parent_offset == 0, "offsets should be initialized only once"); klassOop k = SystemDictionary::threadGroup_klass(); ! compute_offset(_parent_offset, k, vmSymbols::parent_name(), vmSymbols::threadgroup_signature()); ! compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); ! compute_offset(_threads_offset, k, vmSymbols::threads_name(), vmSymbols::thread_array_signature()); ! compute_offset(_groups_offset, k, vmSymbols::groups_name(), vmSymbols::threadgroup_array_signature()); ! compute_offset(_maxPriority_offset, k, vmSymbols::maxPriority_name(), vmSymbols::int_signature()); ! compute_offset(_destroyed_offset, k, vmSymbols::destroyed_name(), vmSymbols::bool_signature()); ! compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature()); ! compute_offset(_vmAllowSuspension_offset, k, vmSymbols::vmAllowSuspension_name(), vmSymbols::bool_signature()); ! compute_offset(_nthreads_offset, k, vmSymbols::nthreads_name(), vmSymbols::int_signature()); ! compute_offset(_ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature()); } oop java_lang_Throwable::backtrace(oop throwable) { return throwable->obj_field_acquire(backtrace_offset); }
*** 1016,1026 **** objArrayOop _head; objArrayOop _methods; typeArrayOop _bcis; int _index; bool _dirty; - bool _done; No_Safepoint_Verifier _nsv; public: enum { --- 1016,1025 ----
*** 1030,1053 **** trace_size = java_lang_Throwable::trace_size, trace_chunk_size = java_lang_Throwable::trace_chunk_size }; // constructor for new backtrace ! BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL) { expand(CHECK); _backtrace = _head; _index = 0; - _dirty = false; - _done = false; } void flush() { if (_dirty && _methods != NULL) { BarrierSet* bs = Universe::heap()->barrier_set(); assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt"); ! bs->write_ref_array(MemRegion((HeapWord*)_methods->obj_at_addr(0), ! _methods->length() * HeapWordsPerOop)); _dirty = false; } } void expand(TRAPS) { --- 1029,1050 ---- trace_size = java_lang_Throwable::trace_size, trace_chunk_size = java_lang_Throwable::trace_chunk_size }; // constructor for new backtrace ! BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL), _dirty(false) { expand(CHECK); _backtrace = _head; _index = 0; } void flush() { if (_dirty && _methods != NULL) { BarrierSet* bs = Universe::heap()->barrier_set(); assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt"); ! bs->write_ref_array(MemRegion((HeapWord*)_methods->base(), ! _methods->array_size())); _dirty = false; } } void expand(TRAPS) {
*** 1087,1098 **** methodHandle mhandle(THREAD, method); expand(CHECK); method = mhandle(); } ! // _methods->obj_at_put(_index, method); ! *_methods->obj_at_addr(_index) = method; _bcis->ushort_at_put(_index, bci); _index++; _dirty = true; } --- 1084,1096 ---- methodHandle mhandle(THREAD, method); expand(CHECK); method = mhandle(); } ! _methods->obj_at_put(_index, method); ! // bad for UseCompressedOops ! // *_methods->obj_at_addr(_index) = method; _bcis->ushort_at_put(_index, bci); _index++; _dirty = true; }
*** 1368,1377 **** --- 1366,1376 ---- // SystemDictionary::stackTraceElement_klass() will be null for pre-1.4 JDKs assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4"); // Allocate java.lang.StackTraceElement instance klassOop k = SystemDictionary::stackTraceElement_klass(); + assert(k != NULL, "must be loaded in 1.4+"); instanceKlassHandle ik (THREAD, k); if (ik->should_be_initialized()) { ik->initialize(CHECK_0); }
*** 1405,1415 **** } void java_lang_reflect_AccessibleObject::compute_offsets() { klassOop k = SystemDictionary::reflect_accessible_object_klass(); ! COMPUTE_OFFSET("java.lang.reflect.AccessibleObject", override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); } jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); return (jboolean) reflect->bool_field(override_offset); --- 1404,1414 ---- } void java_lang_reflect_AccessibleObject::compute_offsets() { klassOop k = SystemDictionary::reflect_accessible_object_klass(); ! compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); } jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); return (jboolean) reflect->bool_field(override_offset);
*** 1420,1445 **** reflect->bool_field_put(override_offset, (int) value); } void java_lang_reflect_Method::compute_offsets() { klassOop k = SystemDictionary::reflect_method_klass(); ! COMPUTE_OFFSET("java.lang.reflect.Method", clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Method", name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Method", returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Method", parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Method", exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Method", slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Method", modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); // The generic signature and annotations fields are only present in 1.5 signature_offset = -1; annotations_offset = -1; parameter_annotations_offset = -1; annotation_default_offset = -1; ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Method", signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Method", annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Method", parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Method", annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature()); } Handle java_lang_reflect_Method::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); klassOop klass = SystemDictionary::reflect_method_klass(); --- 1419,1444 ---- reflect->bool_field_put(override_offset, (int) value); } void java_lang_reflect_Method::compute_offsets() { klassOop k = SystemDictionary::reflect_method_klass(); ! compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); ! compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); ! compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); ! compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); ! compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); ! compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); ! compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); // The generic signature and annotations fields are only present in 1.5 signature_offset = -1; annotations_offset = -1; parameter_annotations_offset = -1; annotation_default_offset = -1; ! compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature()); ! compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature()); ! compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature()); ! compute_optional_offset(annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature()); } Handle java_lang_reflect_Method::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); klassOop klass = SystemDictionary::reflect_method_klass();
*** 1583,1604 **** method->obj_field_put(annotation_default_offset, value); } void java_lang_reflect_Constructor::compute_offsets() { klassOop k = SystemDictionary::reflect_constructor_klass(); ! COMPUTE_OFFSET("java.lang.reflect.Constructor", clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Constructor", parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Constructor", exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Constructor", slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Constructor", modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); // The generic signature and annotations fields are only present in 1.5 signature_offset = -1; annotations_offset = -1; parameter_annotations_offset = -1; ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Constructor", signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Constructor", annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Constructor", parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature()); } Handle java_lang_reflect_Constructor::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); symbolHandle name = vmSymbolHandles::java_lang_reflect_Constructor(); --- 1582,1603 ---- method->obj_field_put(annotation_default_offset, value); } void java_lang_reflect_Constructor::compute_offsets() { klassOop k = SystemDictionary::reflect_constructor_klass(); ! compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); ! compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); ! compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); ! compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); ! compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); // The generic signature and annotations fields are only present in 1.5 signature_offset = -1; annotations_offset = -1; parameter_annotations_offset = -1; ! compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature()); ! compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature()); ! compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature()); } Handle java_lang_reflect_Constructor::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); symbolHandle name = vmSymbolHandles::java_lang_reflect_Constructor();
*** 1707,1726 **** method->obj_field_put(parameter_annotations_offset, value); } void java_lang_reflect_Field::compute_offsets() { klassOop k = SystemDictionary::reflect_field_klass(); ! COMPUTE_OFFSET("java.lang.reflect.Field", clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Field", name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Field", type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Field", slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); ! COMPUTE_OFFSET("java.lang.reflect.Field", modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); // The generic signature and annotations fields are only present in 1.5 signature_offset = -1; annotations_offset = -1; ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Field", signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature()); ! COMPUTE_OPTIONAL_OFFSET("java.lang.reflect.Field", annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature()); } Handle java_lang_reflect_Field::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); symbolHandle name = vmSymbolHandles::java_lang_reflect_Field(); --- 1706,1725 ---- method->obj_field_put(parameter_annotations_offset, value); } void java_lang_reflect_Field::compute_offsets() { klassOop k = SystemDictionary::reflect_field_klass(); ! compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); ! compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); ! compute_offset(type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature()); ! compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); ! compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); // The generic signature and annotations fields are only present in 1.5 signature_offset = -1; annotations_offset = -1; ! compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature()); ! compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature()); } Handle java_lang_reflect_Field::create(TRAPS) { assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); symbolHandle name = vmSymbolHandles::java_lang_reflect_Field();
*** 1816,1826 **** void sun_reflect_ConstantPool::compute_offsets() { klassOop k = SystemDictionary::reflect_constant_pool_klass(); // This null test can be removed post beta if (k != NULL) { ! COMPUTE_OFFSET("sun.reflect.ConstantPool", _cp_oop_offset, k, vmSymbols::constantPoolOop_name(), vmSymbols::object_signature()); } } Handle sun_reflect_ConstantPool::create(TRAPS) { --- 1815,1825 ---- void sun_reflect_ConstantPool::compute_offsets() { klassOop k = SystemDictionary::reflect_constant_pool_klass(); // This null test can be removed post beta if (k != NULL) { ! compute_offset(_cp_oop_offset, k, vmSymbols::constantPoolOop_name(), vmSymbols::object_signature()); } } Handle sun_reflect_ConstantPool::create(TRAPS) {
*** 1846,2019 **** void sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() { klassOop k = SystemDictionary::reflect_unsafe_static_field_accessor_impl_klass(); // This null test can be removed post beta if (k != NULL) { ! COMPUTE_OFFSET("sun.reflect.UnsafeStaticFieldAccessorImpl", _base_offset, k, vmSymbols::base_name(), vmSymbols::object_signature()); } } ! oop java_lang_boxing_object::initialize_and_allocate(klassOop k, TRAPS) { instanceKlassHandle h (THREAD, k); if (!h->is_initialized()) h->initialize(CHECK_0); return h->allocate_instance(THREAD); } oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) { ! oop box; switch (type) { case T_BOOLEAN: - box = initialize_and_allocate(SystemDictionary::boolean_klass(), CHECK_0); box->bool_field_put(value_offset, value->z); break; case T_CHAR: - box = initialize_and_allocate(SystemDictionary::char_klass(), CHECK_0); box->char_field_put(value_offset, value->c); break; case T_FLOAT: - box = initialize_and_allocate(SystemDictionary::float_klass(), CHECK_0); box->float_field_put(value_offset, value->f); break; case T_DOUBLE: ! box = initialize_and_allocate(SystemDictionary::double_klass(), CHECK_0); ! box->double_field_put(value_offset, value->d); break; case T_BYTE: - box = initialize_and_allocate(SystemDictionary::byte_klass(), CHECK_0); box->byte_field_put(value_offset, value->b); break; case T_SHORT: - box = initialize_and_allocate(SystemDictionary::short_klass(), CHECK_0); box->short_field_put(value_offset, value->s); break; case T_INT: - box = initialize_and_allocate(SystemDictionary::int_klass(), CHECK_0); box->int_field_put(value_offset, value->i); break; case T_LONG: ! box = initialize_and_allocate(SystemDictionary::long_klass(), CHECK_0); ! box->long_field_put(value_offset, value->j); break; default: return NULL; } return box; } BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) { ! klassOop k = box->klass(); ! if (k == SystemDictionary::boolean_klass()) { value->z = box->bool_field(value_offset); ! return T_BOOLEAN; ! } ! if (k == SystemDictionary::char_klass()) { value->c = box->char_field(value_offset); ! return T_CHAR; ! } ! if (k == SystemDictionary::float_klass()) { value->f = box->float_field(value_offset); ! return T_FLOAT; ! } ! if (k == SystemDictionary::double_klass()) { ! value->d = box->double_field(value_offset); ! return T_DOUBLE; ! } ! if (k == SystemDictionary::byte_klass()) { value->b = box->byte_field(value_offset); ! return T_BYTE; ! } ! if (k == SystemDictionary::short_klass()) { value->s = box->short_field(value_offset); ! return T_SHORT; ! } ! if (k == SystemDictionary::int_klass()) { value->i = box->int_field(value_offset); ! return T_INT; ! } ! if (k == SystemDictionary::long_klass()) { ! value->j = box->long_field(value_offset); ! return T_LONG; ! } return T_ILLEGAL; } BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) { ! klassOop k = box->klass(); ! if (k == SystemDictionary::boolean_klass()) { box->bool_field_put(value_offset, value->z); ! return T_BOOLEAN; ! } ! if (k == SystemDictionary::char_klass()) { box->char_field_put(value_offset, value->c); ! return T_CHAR; ! } ! if (k == SystemDictionary::float_klass()) { box->float_field_put(value_offset, value->f); ! return T_FLOAT; ! } ! if (k == SystemDictionary::double_klass()) { ! box->double_field_put(value_offset, value->d); ! return T_DOUBLE; ! } ! if (k == SystemDictionary::byte_klass()) { box->byte_field_put(value_offset, value->b); ! return T_BYTE; ! } ! if (k == SystemDictionary::short_klass()) { box->short_field_put(value_offset, value->s); ! return T_SHORT; ! } ! if (k == SystemDictionary::int_klass()) { box->int_field_put(value_offset, value->i); ! return T_INT; ! } ! if (k == SystemDictionary::long_klass()) { ! box->long_field_put(value_offset, value->j); ! return T_LONG; ! } return T_ILLEGAL; } // Support for java_lang_ref_Reference ! ! void java_lang_ref_Reference::set_referent(oop ref, oop value) { ! ref->obj_field_put(referent_offset, value); ! } ! ! oop* java_lang_ref_Reference::referent_addr(oop ref) { ! return ref->obj_field_addr(referent_offset); ! } ! ! void java_lang_ref_Reference::set_next(oop ref, oop value) { ! ref->obj_field_put(next_offset, value); ! } ! ! oop* java_lang_ref_Reference::next_addr(oop ref) { ! return ref->obj_field_addr(next_offset); ! } ! ! void java_lang_ref_Reference::set_discovered(oop ref, oop value) { ! ref->obj_field_put(discovered_offset, value); ! } ! ! oop* java_lang_ref_Reference::discovered_addr(oop ref) { ! return ref->obj_field_addr(discovered_offset); } ! oop* java_lang_ref_Reference::pending_list_lock_addr() { instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass()); ! return (oop*)(((char *)ik->start_of_static_fields()) + static_lock_offset); } ! oop* java_lang_ref_Reference::pending_list_addr() { ! instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass()); ! return (oop *)(((char *)ik->start_of_static_fields()) + static_pending_offset); } // Support for java_lang_ref_SoftReference --- 1845,2005 ---- void sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() { klassOop k = SystemDictionary::reflect_unsafe_static_field_accessor_impl_klass(); // This null test can be removed post beta if (k != NULL) { ! compute_offset(_base_offset, k, vmSymbols::base_name(), vmSymbols::object_signature()); } } ! oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) { ! klassOop k = SystemDictionary::box_klass(type); ! if (k == NULL) return NULL; instanceKlassHandle h (THREAD, k); if (!h->is_initialized()) h->initialize(CHECK_0); return h->allocate_instance(THREAD); } oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) { ! oop box = initialize_and_allocate(type, CHECK_0); ! if (box == NULL) return NULL; switch (type) { case T_BOOLEAN: box->bool_field_put(value_offset, value->z); break; case T_CHAR: box->char_field_put(value_offset, value->c); break; case T_FLOAT: box->float_field_put(value_offset, value->f); break; case T_DOUBLE: ! box->double_field_put(long_value_offset, value->d); break; case T_BYTE: box->byte_field_put(value_offset, value->b); break; case T_SHORT: box->short_field_put(value_offset, value->s); break; case T_INT: box->int_field_put(value_offset, value->i); break; case T_LONG: ! box->long_field_put(long_value_offset, value->j); break; default: return NULL; } return box; } + BasicType java_lang_boxing_object::basic_type(oop box) { + if (box == NULL) return T_ILLEGAL; + BasicType type = SystemDictionary::box_klass_type(box->klass()); + if (type == T_OBJECT) // 'unknown' value returned by SD::bkt + return T_ILLEGAL; + return type; + } + + BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) { ! BasicType type = SystemDictionary::box_klass_type(box->klass()); ! switch (type) { ! case T_BOOLEAN: value->z = box->bool_field(value_offset); ! break; ! case T_CHAR: value->c = box->char_field(value_offset); ! break; ! case T_FLOAT: value->f = box->float_field(value_offset); ! break; ! case T_DOUBLE: ! value->d = box->double_field(long_value_offset); ! break; ! case T_BYTE: value->b = box->byte_field(value_offset); ! break; ! case T_SHORT: value->s = box->short_field(value_offset); ! break; ! case T_INT: value->i = box->int_field(value_offset); ! break; ! case T_LONG: ! value->j = box->long_field(long_value_offset); ! break; ! default: return T_ILLEGAL; + } // end switch + return type; } BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) { ! BasicType type = SystemDictionary::box_klass_type(box->klass()); ! switch (type) { ! case T_BOOLEAN: box->bool_field_put(value_offset, value->z); ! break; ! case T_CHAR: box->char_field_put(value_offset, value->c); ! break; ! case T_FLOAT: box->float_field_put(value_offset, value->f); ! break; ! case T_DOUBLE: ! box->double_field_put(long_value_offset, value->d); ! break; ! case T_BYTE: box->byte_field_put(value_offset, value->b); ! break; ! case T_SHORT: box->short_field_put(value_offset, value->s); ! break; ! case T_INT: box->int_field_put(value_offset, value->i); ! break; ! case T_LONG: ! box->long_field_put(long_value_offset, value->j); ! break; ! default: return T_ILLEGAL; + } // end switch + return type; } // Support for java_lang_ref_Reference ! oop java_lang_ref_Reference::pending_list_lock() { ! instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass()); ! char *addr = (((char *)ik->start_of_static_fields()) + static_lock_offset); ! if (UseCompressedOops) { ! return oopDesc::load_decode_heap_oop((narrowOop *)addr); ! } else { ! return oopDesc::load_decode_heap_oop((oop*)addr); ! } } ! HeapWord *java_lang_ref_Reference::pending_list_addr() { instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass()); ! char *addr = (((char *)ik->start_of_static_fields()) + static_pending_offset); ! // XXX This might not be HeapWord aligned, almost rather be char *. ! return (HeapWord*)addr; } ! oop java_lang_ref_Reference::pending_list() { ! char *addr = (char *)pending_list_addr(); ! if (UseCompressedOops) { ! return oopDesc::load_decode_heap_oop((narrowOop *)addr); ! } else { ! return oopDesc::load_decode_heap_oop((oop*)addr); ! } } // Support for java_lang_ref_SoftReference
*** 2178,2187 **** --- 2164,2174 ---- int java_lang_reflect_Field::slot_offset; int java_lang_reflect_Field::modifiers_offset; int java_lang_reflect_Field::signature_offset; int java_lang_reflect_Field::annotations_offset; int java_lang_boxing_object::value_offset; + int java_lang_boxing_object::long_value_offset; int java_lang_ref_Reference::referent_offset; int java_lang_ref_Reference::queue_offset; int java_lang_ref_Reference::next_offset; int java_lang_ref_Reference::discovered_offset; int java_lang_ref_Reference::static_lock_offset;
*** 2258,2268 **** } void java_nio_Buffer::compute_offsets() { klassOop k = SystemDictionary::java_nio_Buffer_klass(); ! COMPUTE_OFFSET("java.nio.Buffer", _limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); } // Support for intrinsification of sun.misc.AtomicLongCSImpl.attemptUpdate int sun_misc_AtomicLongCSImpl::value_offset() { assert(SystemDictionary::sun_misc_AtomicLongCSImpl_klass() != NULL, "can't call this"); --- 2245,2256 ---- } void java_nio_Buffer::compute_offsets() { klassOop k = SystemDictionary::java_nio_Buffer_klass(); ! assert(k != NULL, "must be loaded in 1.4+"); ! compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); } // Support for intrinsification of sun.misc.AtomicLongCSImpl.attemptUpdate int sun_misc_AtomicLongCSImpl::value_offset() { assert(SystemDictionary::sun_misc_AtomicLongCSImpl_klass() != NULL, "can't call this");
*** 2272,2292 **** void sun_misc_AtomicLongCSImpl::compute_offsets() { klassOop k = SystemDictionary::sun_misc_AtomicLongCSImpl_klass(); // If this class is not present, its value field offset won't be referenced. if (k != NULL) { ! COMPUTE_OFFSET("sun.misc.AtomicLongCSImpl", _value_offset, k, vmSymbols::value_name(), vmSymbols::long_signature()); } } void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { if (_owner_offset != 0) return; assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later"); SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK); klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass(); ! COMPUTE_OFFSET("java.util.concurrent.locks.AbstractOwnableSynchronizer", _owner_offset, k, vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature()); } oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { assert(_owner_offset != 0, "Must be initialized"); --- 2260,2280 ---- void sun_misc_AtomicLongCSImpl::compute_offsets() { klassOop k = SystemDictionary::sun_misc_AtomicLongCSImpl_klass(); // If this class is not present, its value field offset won't be referenced. if (k != NULL) { ! compute_offset(_value_offset, k, vmSymbols::value_name(), vmSymbols::long_signature()); } } void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { if (_owner_offset != 0) return; assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later"); SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK); klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass(); ! compute_offset(_owner_offset, k, vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature()); } oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { assert(_owner_offset != 0, "Must be initialized");
*** 2295,2306 **** // Compute hard-coded offsets // Invoked before SystemDictionary::initialize, so pre-loaded classes // are not available to determine the offset_of_static_fields. void JavaClasses::compute_hard_coded_offsets() { ! const int x = wordSize; ! const int header = instanceOopDesc::header_size_in_bytes(); // Do the String Class java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header; java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header; java_lang_String::count_offset = java_lang_String::offset_offset + sizeof (jint); --- 2283,2294 ---- // Compute hard-coded offsets // Invoked before SystemDictionary::initialize, so pre-loaded classes // are not available to determine the offset_of_static_fields. void JavaClasses::compute_hard_coded_offsets() { ! const int x = heapOopSize; ! const int header = instanceOopDesc::base_offset_in_bytes(); // Do the String Class java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header; java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header; java_lang_String::count_offset = java_lang_String::offset_offset + sizeof (jint);
*** 2319,2329 **** java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; java_lang_Throwable::cause_offset = java_lang_Throwable::hc_cause_offset * x + header; java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header; // java_lang_boxing_object ! java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset * x + header; // java_lang_ref_Reference: java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header; java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header; java_lang_ref_Reference::next_offset = java_lang_ref_Reference::hc_next_offset * x + header; --- 2307,2318 ---- java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; java_lang_Throwable::cause_offset = java_lang_Throwable::hc_cause_offset * x + header; java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header; // java_lang_boxing_object ! java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header; ! java_lang_boxing_object::long_value_offset = align_size_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong); // java_lang_ref_Reference: java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header; java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header; java_lang_ref_Reference::next_offset = java_lang_ref_Reference::hc_next_offset * x + header;
*** 2333,2343 **** // Artificial fields for java_lang_ref_Reference // The first field is for the discovered field added in 1.4 java_lang_ref_Reference::number_of_fake_oop_fields = 1; // java_lang_ref_SoftReference Class ! java_lang_ref_SoftReference::timestamp_offset = java_lang_ref_SoftReference::hc_timestamp_offset * x + header; // Don't multiply static fields because they are always in wordSize units java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x; // java_lang_ClassLoader java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header; --- 2322,2332 ---- // Artificial fields for java_lang_ref_Reference // The first field is for the discovered field added in 1.4 java_lang_ref_Reference::number_of_fake_oop_fields = 1; // java_lang_ref_SoftReference Class ! java_lang_ref_SoftReference::timestamp_offset = align_size_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong); // Don't multiply static fields because they are always in wordSize units java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x; // java_lang_ClassLoader java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
*** 2442,2462 **** --- 2431,2487 ---- return false; } } + bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) { + EXCEPTION_MARK; + fieldDescriptor fd; + symbolHandle klass_sym = oopFactory::new_symbol_handle(klass_name, CATCH); + klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); + instanceKlassHandle h_klass (THREAD, k); + symbolHandle f_name = oopFactory::new_symbol_handle(field_name, CATCH); + symbolHandle f_sig = oopFactory::new_symbol_handle(field_sig, CATCH); + if (!h_klass->find_local_field(f_name(), f_sig(), &fd)) { + tty->print_cr("Static field %s.%s not found", klass_name, field_name); + return false; + } + if (!fd.is_static() || !fd.has_initial_value()) { + tty->print_cr("Static field %s.%s appears to be non-constant", klass_name, field_name); + return false; + } + if (!fd.initial_value_tag().is_int()) { + tty->print_cr("Static field %s.%s is not an int", klass_name, field_name); + return false; + } + jint field_value = fd.int_initial_value(); + if (field_value == hardcoded_constant) { + return true; + } else { + tty->print_cr("Constant value of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_constant, field_value); + return false; + } + } + + // Check the hard-coded field offsets of all the classes in this file void JavaClasses::check_offsets() { bool valid = true; #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) + #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ + valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig) + #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig) + #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \ + valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig) + // java.lang.String CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C"); CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
*** 2479,2493 **** // Boxed primitive objects (java_lang_boxing_object) CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z"); CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C"); CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F"); ! CHECK_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D"); CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B"); CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S"); CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I"); ! CHECK_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J"); // java.lang.ClassLoader CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent, "Ljava/lang/ClassLoader;"); --- 2504,2518 ---- // Boxed primitive objects (java_lang_boxing_object) CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z"); CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C"); CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F"); ! CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D"); CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B"); CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S"); CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I"); ! CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J"); // java.lang.ClassLoader CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent, "Ljava/lang/ClassLoader;");