comparison src/share/vm/code/dependencies.cpp @ 5998:49036505ab5f

7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass. Summary: Change implementor to embedded instanceKlass field. Reviewed-by: sspitsyn, minqi, coleenp
author jiangli
date Thu, 29 Mar 2012 22:18:56 -0400
parents 8f8b94305aff
children da91efe96a93
comparison
equal deleted inserted replaced
5970:0698f5ef5535 5998:49036505ab5f
1 /* 1 /*
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2005, 2012, Oracle and/or its affiliates. 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.
1031 // when interface 'I' was the starting point. 1031 // when interface 'I' was the starting point.
1032 // %%% Until this is fixed more systematically, bail out. 1032 // %%% Until this is fixed more systematically, bail out.
1033 // (Old CHA had the same limitation.) 1033 // (Old CHA had the same limitation.)
1034 return context_type; 1034 return context_type;
1035 } 1035 }
1036 for (int i = 0; i < nof_impls; i++) { 1036 if (nof_impls > 0) {
1037 klassOop impl = instanceKlass::cast(context_type)->implementor(i); 1037 klassOop impl = instanceKlass::cast(context_type)->implementor();
1038 if (impl == NULL) { 1038 assert(impl != NULL, "just checking");
1039 // implementors array overflowed => no exact info. 1039 // If impl is the same as the context_type, then more than one
1040 // implementor has seen. No exact info in this case.
1041 if (impl == context_type) {
1040 return context_type; // report an inexact witness to this sad affair 1042 return context_type; // report an inexact witness to this sad affair
1041 } 1043 }
1042 if (do_counts) 1044 if (do_counts)
1043 { NOT_PRODUCT(deps_find_witness_steps++); } 1045 { NOT_PRODUCT(deps_find_witness_steps++); }
1044 if (is_participant(impl)) { 1046 if (is_participant(impl)) {
1045 if (participants_hide_witnesses) continue; 1047 if (!participants_hide_witnesses) {
1046 // else fall through to process this guy's subclasses 1048 ADD_SUBCLASS_CHAIN(impl);
1049 }
1047 } else if (is_witness(impl) && !ignore_witness(impl)) { 1050 } else if (is_witness(impl) && !ignore_witness(impl)) {
1048 return impl; 1051 return impl;
1049 } 1052 } else {
1050 ADD_SUBCLASS_CHAIN(impl); 1053 ADD_SUBCLASS_CHAIN(impl);
1054 }
1051 } 1055 }
1052 1056
1053 // Recursively process each non-trivial sibling chain. 1057 // Recursively process each non-trivial sibling chain.
1054 while (chaini > 0) { 1058 while (chaini > 0) {
1055 Klass* chain = chains[--chaini]; 1059 Klass* chain = chains[--chaini];
1172 if (sub != NULL) { 1176 if (sub != NULL) {
1173 return sub->as_klassOop(); 1177 return sub->as_klassOop();
1174 } else if (ctx->nof_implementors() != 0) { 1178 } else if (ctx->nof_implementors() != 0) {
1175 // if it is an interface, it must be unimplemented 1179 // if it is an interface, it must be unimplemented
1176 // (if it is not an interface, nof_implementors is always zero) 1180 // (if it is not an interface, nof_implementors is always zero)
1177 klassOop impl = ctx->implementor(0); 1181 klassOop impl = ctx->implementor();
1178 return (impl != NULL)? impl: ctxk; 1182 assert(impl != NULL, "must be set");
1183 return impl;
1179 } else { 1184 } else {
1180 return NULL; 1185 return NULL;
1181 } 1186 }
1182 } 1187 }
1183 1188