--- old/src/share/vm/oops/instanceKlass.cpp Fri Mar 18 14:58:49 2011 +++ new/src/share/vm/oops/instanceKlass.cpp Fri Mar 18 14:58:49 2011 @@ -37,6 +37,7 @@ #include "memory/oopFactory.hpp" #include "memory/permGen.hpp" #include "oops/instanceKlass.hpp" +#include "oops/instanceMirrorKlass.hpp" #include "oops/instanceOop.hpp" #include "oops/methodOop.hpp" #include "oops/objArrayKlassKlass.hpp" @@ -649,6 +650,7 @@ } instanceOop instanceKlass::allocate_instance(TRAPS) { + assert(!oop_is_instanceMirror(), "wrong allocation path"); bool has_finalizer_flag = has_finalizer(); // Query before possible GC int size = size_helper(); // Query before forming handle. @@ -669,6 +671,7 @@ // instances so simply disallow finalizable perm objects. This can // be relaxed if a need for it is found. assert(!has_finalizer(), "perm objects not allowed to have finalizers"); + assert(!oop_is_instanceMirror(), "wrong allocation path"); int size = size_helper(); // Query before forming handle. KlassHandle h_k(THREAD, as_klassOop()); instanceOop i = (instanceOop) @@ -898,6 +901,7 @@ } } + void instanceKlass::do_local_static_fields(FieldClosure* cl) { fieldDescriptor fd; int length = fields()->length(); @@ -1609,36 +1613,6 @@ // The following macros call specialized macros, passing either oop or // narrowOop as the specialization type. These test the UseCompressedOops // flag. -#define InstanceKlass_OOP_ITERATE(start_p, count, \ - do_oop, assert_fn) \ -{ \ - if (UseCompressedOops) { \ - InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop, \ - start_p, count, \ - do_oop, assert_fn) \ - } else { \ - InstanceKlass_SPECIALIZED_OOP_ITERATE(oop, \ - start_p, count, \ - do_oop, assert_fn) \ - } \ -} - -#define InstanceKlass_BOUNDED_OOP_ITERATE(start_p, count, low, high, \ - do_oop, assert_fn) \ -{ \ - if (UseCompressedOops) { \ - InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, \ - start_p, count, \ - low, high, \ - do_oop, assert_fn) \ - } else { \ - InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop, \ - start_p, count, \ - low, high, \ - do_oop, assert_fn) \ - } \ -} - #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn) \ { \ /* Compute oopmap block range. The common case \ @@ -1711,38 +1685,6 @@ } \ } -void instanceKlass::follow_static_fields() { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - MarkSweep::mark_and_push(p), \ - assert_is_in_closed_subset) -} - -#ifndef SERIALGC -void instanceKlass::follow_static_fields(ParCompactionManager* cm) { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - PSParallelCompact::mark_and_push(cm, p), \ - assert_is_in) -} -#endif // SERIALGC - -void instanceKlass::adjust_static_fields() { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - MarkSweep::adjust_pointer(p), \ - assert_nothing) -} - -#ifndef SERIALGC -void instanceKlass::update_static_fields() { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - PSParallelCompact::adjust_pointer(p), \ - assert_nothing) -} -#endif // SERIALGC - void instanceKlass::oop_follow_contents(oop obj) { assert(obj != NULL, "can't follow the content of NULL object"); obj->follow_header(); @@ -1829,22 +1771,6 @@ ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) #endif // !SERIALGC -void instanceKlass::iterate_static_fields(OopClosure* closure) { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - closure->do_oop(p), \ - assert_is_in_reserved) -} - -void instanceKlass::iterate_static_fields(OopClosure* closure, - MemRegion mr) { - InstanceKlass_BOUNDED_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - mr.start(), mr.end(), \ - (closure)->do_oop_v(p), \ - assert_is_in_closed_subset) -} - int instanceKlass::oop_adjust_pointers(oop obj) { int size = size_helper(); InstanceKlass_OOP_MAP_ITERATE( \ @@ -1873,21 +1799,6 @@ return size_helper(); } -void instanceKlass::push_static_fields(PSPromotionManager* pm) { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - if (PSScavenge::should_scavenge(p)) { \ - pm->claim_or_forward_depth(p); \ - }, \ - assert_nothing ) -} - -void instanceKlass::copy_static_fields(ParCompactionManager* cm) { - InstanceKlass_OOP_ITERATE( \ - start_of_static_fields(), static_oop_field_size(), \ - PSParallelCompact::adjust_pointer(p), \ - assert_is_in) -} #endif // SERIALGC // This klass is alive but the implementor link is not followed/updated. @@ -2002,6 +1913,11 @@ if (_source_debug_extension != NULL) _source_debug_extension->increment_refcount(); } +address instanceKlass::static_field_addr(int offset) { + return (address)(offset + instanceMirrorKlass::offset_of_static_fields() + (intptr_t)java_mirror()); +} + + const char* instanceKlass::signature_name() const { const char* src = (const char*) (name()->as_C_string()); const int src_length = (int)strlen(src); @@ -2369,7 +2285,7 @@ void FieldPrinter::do_field(fieldDescriptor* fd) { _st->print(BULLET); - if (fd->is_static() || (_obj == NULL)) { + if (_obj == NULL) { fd->print_on(_st); _st->cr(); } else { @@ -2399,8 +2315,8 @@ } st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj)); - FieldPrinter print_nonstatic_field(st, obj); - do_nonstatic_fields(&print_nonstatic_field); + FieldPrinter print_field(st, obj); + do_nonstatic_fields(&print_field); if (as_klassOop() == SystemDictionary::Class_klass()) { st->print(BULLET"signature: "); @@ -2418,6 +2334,12 @@ st->print(BULLET"fake entry for array: "); array_klass->print_value_on(st); st->cr(); + st->print_cr(BULLET"fake entry for oop_size: %d", java_lang_Class::oop_size(obj)); + st->print_cr(BULLET"fake entry for static_oop_field_count: %d", java_lang_Class::static_oop_field_count(obj)); + klassOop real_klass = java_lang_Class::as_klassOop(obj); + if (real_klass && real_klass->klass_part()->oop_is_instance()) { + instanceKlass::cast(real_klass)->do_local_static_fields(&print_field); + } } else if (as_klassOop() == SystemDictionary::MethodType_klass()) { st->print(BULLET"signature: "); java_lang_invoke_MethodType::print_signature(obj, st); @@ -2560,7 +2482,7 @@ void JNIid::verify(klassOop holder) { - int first_field_offset = instanceKlass::cast(holder)->offset_of_static_fields(); + int first_field_offset = instanceMirrorKlass::offset_of_static_fields(); int end_field_offset; end_field_offset = first_field_offset + (instanceKlass::cast(holder)->static_field_size() * wordSize);