1.1 --- a/src/share/vm/oops/instanceKlass.cpp Thu Mar 19 09:13:24 2009 -0700 1.2 +++ b/src/share/vm/oops/instanceKlass.cpp Fri Mar 20 23:19:36 2009 -0700 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. 1.6 + * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -1813,6 +1813,8 @@ 1.11 oop class_loader2, symbolOop class_name2) { 1.12 if (class_loader1 != class_loader2) { 1.13 return false; 1.14 + } else if (class_name1 == class_name2) { 1.15 + return true; // skip painful bytewise comparison 1.16 } else { 1.17 ResourceMark rm; 1.18 1.19 @@ -1859,6 +1861,55 @@ 1.20 } 1.21 } 1.22 1.23 +/* defined for now in jvm.cpp, for historical reasons *-- 1.24 +klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle self, 1.25 + symbolOop& simple_name_result, TRAPS) { 1.26 + ... 1.27 +} 1.28 +*/ 1.29 + 1.30 +// tell if two classes have the same enclosing class (at package level) 1.31 +bool instanceKlass::is_same_package_member_impl(instanceKlassHandle class1, 1.32 + klassOop class2_oop, TRAPS) { 1.33 + if (class2_oop == class1->as_klassOop()) return true; 1.34 + if (!Klass::cast(class2_oop)->oop_is_instance()) return false; 1.35 + instanceKlassHandle class2(THREAD, class2_oop); 1.36 + 1.37 + // must be in same package before we try anything else 1.38 + if (!class1->is_same_class_package(class2->class_loader(), class2->name())) 1.39 + return false; 1.40 + 1.41 + // As long as there is an outer1.getEnclosingClass, 1.42 + // shift the search outward. 1.43 + instanceKlassHandle outer1 = class1; 1.44 + for (;;) { 1.45 + // As we walk along, look for equalities between outer1 and class2. 1.46 + // Eventually, the walks will terminate as outer1 stops 1.47 + // at the top-level class around the original class. 1.48 + symbolOop ignore_name; 1.49 + klassOop next = outer1->compute_enclosing_class(ignore_name, CHECK_false); 1.50 + if (next == NULL) break; 1.51 + if (next == class2()) return true; 1.52 + outer1 = instanceKlassHandle(THREAD, next); 1.53 + } 1.54 + 1.55 + // Now do the same for class2. 1.56 + instanceKlassHandle outer2 = class2; 1.57 + for (;;) { 1.58 + symbolOop ignore_name; 1.59 + klassOop next = outer2->compute_enclosing_class(ignore_name, CHECK_false); 1.60 + if (next == NULL) break; 1.61 + // Might as well check the new outer against all available values. 1.62 + if (next == class1()) return true; 1.63 + if (next == outer1()) return true; 1.64 + outer2 = instanceKlassHandle(THREAD, next); 1.65 + } 1.66 + 1.67 + // If by this point we have not found an equality between the 1.68 + // two classes, we know they are in separate package members. 1.69 + return false; 1.70 +} 1.71 + 1.72 1.73 jint instanceKlass::compute_modifier_flags(TRAPS) const { 1.74 klassOop k = as_klassOop(); 1.75 @@ -1996,9 +2047,11 @@ 1.76 1.77 // Printing 1.78 1.79 +#define BULLET " - " 1.80 + 1.81 void FieldPrinter::do_field(fieldDescriptor* fd) { 1.82 - if (fd->is_static() == (_obj == NULL)) { 1.83 - _st->print(" - "); 1.84 + _st->print(BULLET); 1.85 + if (fd->is_static() || (_obj == NULL)) { 1.86 fd->print_on(_st); 1.87 _st->cr(); 1.88 } else { 1.89 @@ -2019,7 +2072,7 @@ 1.90 value->is_typeArray() && 1.91 offset <= (juint) value->length() && 1.92 offset + length <= (juint) value->length()) { 1.93 - st->print("string: "); 1.94 + st->print(BULLET"string: "); 1.95 Handle h_obj(obj); 1.96 java_lang_String::print(h_obj, st); 1.97 st->cr(); 1.98 @@ -2027,23 +2080,26 @@ 1.99 } 1.100 } 1.101 1.102 - st->print_cr("fields:"); 1.103 + st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj)); 1.104 FieldPrinter print_nonstatic_field(st, obj); 1.105 do_nonstatic_fields(&print_nonstatic_field); 1.106 1.107 if (as_klassOop() == SystemDictionary::class_klass()) { 1.108 + st->print(BULLET"signature: "); 1.109 + java_lang_Class::print_signature(obj, st); 1.110 + st->cr(); 1.111 klassOop mirrored_klass = java_lang_Class::as_klassOop(obj); 1.112 - st->print(" - fake entry for mirror: "); 1.113 + st->print(BULLET"fake entry for mirror: "); 1.114 mirrored_klass->print_value_on(st); 1.115 st->cr(); 1.116 - st->print(" - fake entry resolved_constructor: "); 1.117 + st->print(BULLET"fake entry resolved_constructor: "); 1.118 methodOop ctor = java_lang_Class::resolved_constructor(obj); 1.119 ctor->print_value_on(st); 1.120 klassOop array_klass = java_lang_Class::array_klass(obj); 1.121 - st->print(" - fake entry for array: "); 1.122 + st->cr(); 1.123 + st->print(BULLET"fake entry for array: "); 1.124 array_klass->print_value_on(st); 1.125 st->cr(); 1.126 - st->cr(); 1.127 } 1.128 } 1.129 1.130 @@ -2051,6 +2107,28 @@ 1.131 st->print("a "); 1.132 name()->print_value_on(st); 1.133 obj->print_address_on(st); 1.134 + if (as_klassOop() == SystemDictionary::string_klass() 1.135 + && java_lang_String::value(obj) != NULL) { 1.136 + ResourceMark rm; 1.137 + int len = java_lang_String::length(obj); 1.138 + int plen = (len < 24 ? len : 12); 1.139 + char* str = java_lang_String::as_utf8_string(obj, 0, plen); 1.140 + st->print(" = \"%s\"", str); 1.141 + if (len > plen) 1.142 + st->print("...[%d]", len); 1.143 + } else if (as_klassOop() == SystemDictionary::class_klass()) { 1.144 + klassOop k = java_lang_Class::as_klassOop(obj); 1.145 + st->print(" = "); 1.146 + if (k != NULL) { 1.147 + k->print_value_on(st); 1.148 + } else { 1.149 + const char* tname = type2name(java_lang_Class::primitive_type(obj)); 1.150 + st->print("%s", tname ? tname : "type?"); 1.151 + } 1.152 + } else if (java_lang_boxing_object::is_instance(obj)) { 1.153 + st->print(" = "); 1.154 + java_lang_boxing_object::print(obj, st); 1.155 + } 1.156 } 1.157 1.158 #endif // ndef PRODUCT