Mercurial > hg > truffle
comparison src/share/vm/runtime/reflection.cpp @ 665:c89f86385056
6814659: separable cleanups and subroutines for 6655638
Summary: preparatory but separable changes for method handles
Reviewed-by: kvn, never
author | jrose |
---|---|
date | Fri, 20 Mar 2009 23:19:36 -0700 |
parents | a45484ea312d |
children | 4ce7240d622c |
comparison
equal
deleted
inserted
replaced
647:bd441136a5ce | 665: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 |