Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/jvm.cpp @ 5967:f7c4174b33ba
7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
Summary: Fold instanceKlass::_enclosing_method_class_index and instanceKlass::_enclosing_method_method_index into the instanceKlass::_inner_classes array.
Reviewed-by: never, coleenp
Contributed-by: Jiangli Zhou <jiangli.zhou@oracle.com>
author | jiangli |
---|---|
date | Tue, 13 Mar 2012 13:50:48 -0400 |
parents | aa3d708d67c4 |
children | 3f1ab0c19c30 8150fa46d2ed |
comparison
equal
deleted
inserted
replaced
5933:fde683df4c27 | 5967:f7c4174b33ba |
---|---|
1299 | 1299 |
1300 | 1300 |
1301 // Inner class reflection /////////////////////////////////////////////////////////////////////////////// | 1301 // Inner class reflection /////////////////////////////////////////////////////////////////////////////// |
1302 | 1302 |
1303 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)) | 1303 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)) |
1304 const int inner_class_info_index = 0; | |
1305 const int outer_class_info_index = 1; | |
1306 | |
1307 JvmtiVMObjectAllocEventCollector oam; | 1304 JvmtiVMObjectAllocEventCollector oam; |
1308 // ofClass is a reference to a java_lang_Class object. The mirror object | 1305 // ofClass is a reference to a java_lang_Class object. The mirror object |
1309 // of an instanceKlass | 1306 // of an instanceKlass |
1310 | 1307 |
1311 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || | 1308 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || |
1313 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); | 1310 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); |
1314 return (jobjectArray)JNIHandles::make_local(env, result); | 1311 return (jobjectArray)JNIHandles::make_local(env, result); |
1315 } | 1312 } |
1316 | 1313 |
1317 instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass))); | 1314 instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass))); |
1318 | 1315 InnerClassesIterator iter(k); |
1319 if (k->inner_classes()->length() == 0) { | 1316 |
1317 if (iter.length() == 0) { | |
1320 // Neither an inner nor outer class | 1318 // Neither an inner nor outer class |
1321 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); | 1319 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); |
1322 return (jobjectArray)JNIHandles::make_local(env, result); | 1320 return (jobjectArray)JNIHandles::make_local(env, result); |
1323 } | 1321 } |
1324 | 1322 |
1325 // find inner class info | 1323 // find inner class info |
1326 typeArrayHandle icls(thread, k->inner_classes()); | |
1327 constantPoolHandle cp(thread, k->constants()); | 1324 constantPoolHandle cp(thread, k->constants()); |
1328 int length = icls->length(); | 1325 int length = iter.length(); |
1329 | 1326 |
1330 // Allocate temp. result array | 1327 // Allocate temp. result array |
1331 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL); | 1328 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL); |
1332 objArrayHandle result (THREAD, r); | 1329 objArrayHandle result (THREAD, r); |
1333 int members = 0; | 1330 int members = 0; |
1334 | 1331 |
1335 for(int i = 0; i < length; i += 4) { | 1332 for (; !iter.done(); iter.next()) { |
1336 int ioff = icls->ushort_at(i + inner_class_info_index); | 1333 int ioff = iter.inner_class_info_index(); |
1337 int ooff = icls->ushort_at(i + outer_class_info_index); | 1334 int ooff = iter.outer_class_info_index(); |
1338 | 1335 |
1339 if (ioff != 0 && ooff != 0) { | 1336 if (ioff != 0 && ooff != 0) { |
1340 // Check to see if the name matches the class we're looking for | 1337 // Check to see if the name matches the class we're looking for |
1341 // before attempting to find the class. | 1338 // before attempting to find the class. |
1342 if (cp->klass_name_at_matches(k, ooff)) { | 1339 if (cp->klass_name_at_matches(k, ooff)) { |
1390 // should be in instanceKlass.cpp, but is here for historical reasons | 1387 // should be in instanceKlass.cpp, but is here for historical reasons |
1391 klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k, | 1388 klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k, |
1392 bool* inner_is_member, | 1389 bool* inner_is_member, |
1393 TRAPS) { | 1390 TRAPS) { |
1394 Thread* thread = THREAD; | 1391 Thread* thread = THREAD; |
1395 const int inner_class_info_index = inner_class_inner_class_info_offset; | 1392 InnerClassesIterator iter(k); |
1396 const int outer_class_info_index = inner_class_outer_class_info_offset; | 1393 if (iter.length() == 0) { |
1397 | |
1398 if (k->inner_classes()->length() == 0) { | |
1399 // No inner class info => no declaring class | 1394 // No inner class info => no declaring class |
1400 return NULL; | 1395 return NULL; |
1401 } | 1396 } |
1402 | 1397 |
1403 typeArrayHandle i_icls(thread, k->inner_classes()); | |
1404 constantPoolHandle i_cp(thread, k->constants()); | 1398 constantPoolHandle i_cp(thread, k->constants()); |
1405 int i_length = i_icls->length(); | |
1406 | 1399 |
1407 bool found = false; | 1400 bool found = false; |
1408 klassOop ok; | 1401 klassOop ok; |
1409 instanceKlassHandle outer_klass; | 1402 instanceKlassHandle outer_klass; |
1410 *inner_is_member = false; | 1403 *inner_is_member = false; |
1411 | 1404 |
1412 // Find inner_klass attribute | 1405 // Find inner_klass attribute |
1413 for (int i = 0; i < i_length && !found; i += inner_class_next_offset) { | 1406 for (; !iter.done() && !found; iter.next()) { |
1414 int ioff = i_icls->ushort_at(i + inner_class_info_index); | 1407 int ioff = iter.inner_class_info_index(); |
1415 int ooff = i_icls->ushort_at(i + outer_class_info_index); | 1408 int ooff = iter.outer_class_info_index(); |
1416 int noff = i_icls->ushort_at(i + inner_class_inner_name_offset); | 1409 int noff = iter.inner_name_index(); |
1417 if (ioff != 0) { | 1410 if (ioff != 0) { |
1418 // Check to see if the name matches the class we're looking for | 1411 // Check to see if the name matches the class we're looking for |
1419 // before attempting to find the class. | 1412 // before attempting to find the class. |
1420 if (i_cp->klass_name_at_matches(k, ioff)) { | 1413 if (i_cp->klass_name_at_matches(k, ioff)) { |
1421 klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL); | 1414 klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL); |