src/share/vm/runtime/reflection.cpp

changeset 1100
c89f86385056
parent 866
a45484ea312d
child 1577
4ce7240d622c
equal deleted inserted replaced
1082:bd441136a5ce 1100:c89f86385056
1 /* 1 /*
2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. 2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
552 552
553 bool Reflection::is_same_class_package(klassOop class1, klassOop class2) { 553 bool Reflection::is_same_class_package(klassOop class1, klassOop class2) {
554 return instanceKlass::cast(class1)->is_same_class_package(class2); 554 return instanceKlass::cast(class1)->is_same_class_package(class2);
555 } 555 }
556 556
557 bool Reflection::is_same_package_member(klassOop class1, klassOop class2, TRAPS) {
558 return instanceKlass::cast(class1)->is_same_package_member(class2, THREAD);
559 }
560
557 561
558 // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not, 562 // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not,
559 // throw an incompatible class change exception 563 // throw an incompatible class change exception
560 void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner, TRAPS) { 564 // If inner_is_member, require the inner to be a member of the outer.
565 // If !inner_is_member, require the inner to be anonymous (a non-member).
566 // Caller is responsible for figuring out in advance which case must be true.
567 void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner,
568 bool inner_is_member, TRAPS) {
561 const int inner_class_info_index = 0; 569 const int inner_class_info_index = 0;
562 const int outer_class_info_index = 1; 570 const int outer_class_info_index = 1;
563 571
564 typeArrayHandle icls (THREAD, outer->inner_classes()); 572 typeArrayHandle icls (THREAD, outer->inner_classes());
565 constantPoolHandle cp (THREAD, outer->constants()); 573 constantPoolHandle cp (THREAD, outer->constants());
566 for(int i = 0; i < icls->length(); i += 4) { 574 for(int i = 0; i < icls->length(); i += 4) {
567 int ioff = icls->ushort_at(i + inner_class_info_index); 575 int ioff = icls->ushort_at(i + inner_class_info_index);
568 int ooff = icls->ushort_at(i + outer_class_info_index); 576 int ooff = icls->ushort_at(i + outer_class_info_index);
569 577
570 if (ioff != 0 && ooff != 0) { 578 if (inner_is_member && ioff != 0 && ooff != 0) {
571 klassOop o = cp->klass_at(ooff, CHECK); 579 klassOop o = cp->klass_at(ooff, CHECK);
572 if (o == outer()) { 580 if (o == outer()) {
573 klassOop i = cp->klass_at(ioff, CHECK); 581 klassOop i = cp->klass_at(ioff, CHECK);
574 if (i == inner()) { 582 if (i == inner()) {
575 return; 583 return;
576 } 584 }
585 }
586 }
587 if (!inner_is_member && ioff != 0 && ooff == 0 &&
588 cp->klass_name_at_matches(inner, ioff)) {
589 klassOop i = cp->klass_at(ioff, CHECK);
590 if (i == inner()) {
591 return;
577 } 592 }
578 } 593 }
579 } 594 }
580 595
581 // 'inner' not declared as an inner klass in outer 596 // 'inner' not declared as an inner klass in outer

mercurial