Wed, 16 Dec 2009 14:27:50 -0800
6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
Reviewed-by: dholmes, acorn, jrose
1.1 --- a/src/share/vm/oops/instanceKlass.cpp Wed Dec 16 13:16:08 2009 -0800 1.2 +++ b/src/share/vm/oops/instanceKlass.cpp Wed Dec 16 14:27:50 2009 -0800 1.3 @@ -2045,8 +2045,9 @@ 1.4 // As we walk along, look for equalities between outer1 and class2. 1.5 // Eventually, the walks will terminate as outer1 stops 1.6 // at the top-level class around the original class. 1.7 - symbolOop ignore_name; 1.8 - klassOop next = outer1->compute_enclosing_class(ignore_name, CHECK_false); 1.9 + bool ignore_inner_is_member; 1.10 + klassOop next = outer1->compute_enclosing_class(&ignore_inner_is_member, 1.11 + CHECK_false); 1.12 if (next == NULL) break; 1.13 if (next == class2()) return true; 1.14 outer1 = instanceKlassHandle(THREAD, next); 1.15 @@ -2055,8 +2056,9 @@ 1.16 // Now do the same for class2. 1.17 instanceKlassHandle outer2 = class2; 1.18 for (;;) { 1.19 - symbolOop ignore_name; 1.20 - klassOop next = outer2->compute_enclosing_class(ignore_name, CHECK_false); 1.21 + bool ignore_inner_is_member; 1.22 + klassOop next = outer2->compute_enclosing_class(&ignore_inner_is_member, 1.23 + CHECK_false); 1.24 if (next == NULL) break; 1.25 // Might as well check the new outer against all available values. 1.26 if (next == class1()) return true;
2.1 --- a/src/share/vm/oops/instanceKlass.hpp Wed Dec 16 13:16:08 2009 -0800 2.2 +++ b/src/share/vm/oops/instanceKlass.hpp Wed Dec 16 14:27:50 2009 -0800 2.3 @@ -337,12 +337,12 @@ 2.4 static bool is_same_class_package(oop class_loader1, symbolOop class_name1, oop class_loader2, symbolOop class_name2); 2.5 2.6 // find an enclosing class (defined where original code was, in jvm.cpp!) 2.7 - klassOop compute_enclosing_class(symbolOop& simple_name_result, TRAPS) { 2.8 + klassOop compute_enclosing_class(bool* inner_is_member, TRAPS) { 2.9 instanceKlassHandle self(THREAD, this->as_klassOop()); 2.10 - return compute_enclosing_class_impl(self, simple_name_result, THREAD); 2.11 + return compute_enclosing_class_impl(self, inner_is_member, THREAD); 2.12 } 2.13 static klassOop compute_enclosing_class_impl(instanceKlassHandle self, 2.14 - symbolOop& simple_name_result, TRAPS); 2.15 + bool* inner_is_member, TRAPS); 2.16 2.17 // tell if two classes have the same enclosing class (at package level) 2.18 bool is_same_package_member(klassOop class2, TRAPS) {
3.1 --- a/src/share/vm/prims/jvm.cpp Wed Dec 16 13:16:08 2009 -0800 3.2 +++ b/src/share/vm/prims/jvm.cpp Wed Dec 16 14:27:50 2009 -0800 3.3 @@ -1318,19 +1318,20 @@ 3.4 return NULL; 3.5 } 3.6 3.7 - symbolOop simple_name = NULL; 3.8 + bool inner_is_member = false; 3.9 klassOop outer_klass 3.10 = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)) 3.11 - )->compute_enclosing_class(simple_name, CHECK_NULL); 3.12 + )->compute_enclosing_class(&inner_is_member, CHECK_NULL); 3.13 if (outer_klass == NULL) return NULL; // already a top-level class 3.14 - if (simple_name == NULL) return NULL; // an anonymous class (inside a method) 3.15 + if (!inner_is_member) return NULL; // an anonymous class (inside a method) 3.16 return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror()); 3.17 } 3.18 JVM_END 3.19 3.20 // should be in instanceKlass.cpp, but is here for historical reasons 3.21 klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k, 3.22 - symbolOop& simple_name_result, TRAPS) { 3.23 + bool* inner_is_member, 3.24 + TRAPS) { 3.25 Thread* thread = THREAD; 3.26 const int inner_class_info_index = inner_class_inner_class_info_offset; 3.27 const int outer_class_info_index = inner_class_outer_class_info_offset; 3.28 @@ -1347,8 +1348,7 @@ 3.29 bool found = false; 3.30 klassOop ok; 3.31 instanceKlassHandle outer_klass; 3.32 - bool inner_is_member = false; 3.33 - int simple_name_index = 0; 3.34 + *inner_is_member = false; 3.35 3.36 // Find inner_klass attribute 3.37 for (int i = 0; i < i_length && !found; i += inner_class_next_offset) { 3.38 @@ -1364,8 +1364,7 @@ 3.39 if (found && ooff != 0) { 3.40 ok = i_cp->klass_at(ooff, CHECK_NULL); 3.41 outer_klass = instanceKlassHandle(thread, ok); 3.42 - simple_name_index = noff; 3.43 - inner_is_member = true; 3.44 + *inner_is_member = true; 3.45 } 3.46 } 3.47 } 3.48 @@ -1377,7 +1376,7 @@ 3.49 if (encl_method_class_idx != 0) { 3.50 ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL); 3.51 outer_klass = instanceKlassHandle(thread, ok); 3.52 - inner_is_member = false; 3.53 + *inner_is_member = false; 3.54 } 3.55 } 3.56 3.57 @@ -1387,9 +1386,7 @@ 3.58 // Throws an exception if outer klass has not declared k as an inner klass 3.59 // We need evidence that each klass knows about the other, or else 3.60 // the system could allow a spoof of an inner class to gain access rights. 3.61 - Reflection::check_for_inner_class(outer_klass, k, inner_is_member, CHECK_NULL); 3.62 - 3.63 - simple_name_result = (inner_is_member ? i_cp->symbol_at(simple_name_index) : symbolOop(NULL)); 3.64 + Reflection::check_for_inner_class(outer_klass, k, *inner_is_member, CHECK_NULL); 3.65 return outer_klass(); 3.66 } 3.67