Mercurial > hg > truffle
comparison src/share/vm/oops/method.cpp @ 12823:ac9cb1d5a202
8009130: Lambda: Fix access controls, loader constraints.
Summary: New default methods list with inherited superinterface methods
Reviewed-by: minqi, sspitsyn, coleenp
author | acorn |
---|---|
date | Mon, 07 Oct 2013 12:20:28 -0400 |
parents | 510fbd28919c |
children | bd3237e0e18d |
comparison
equal
deleted
inserted
replaced
12822:cc4f5f8d885e | 12823:ac9cb1d5a202 |
---|---|
509 return _access_flags.has_loops(); | 509 return _access_flags.has_loops(); |
510 } | 510 } |
511 | 511 |
512 bool Method::is_final_method(AccessFlags class_access_flags) const { | 512 bool Method::is_final_method(AccessFlags class_access_flags) const { |
513 // or "does_not_require_vtable_entry" | 513 // or "does_not_require_vtable_entry" |
514 // overpass can occur, is not final (reuses vtable entry) | 514 // default method or overpass can occur, is not final (reuses vtable entry) |
515 // private methods get vtable entries for backward class compatibility. | 515 // private methods get vtable entries for backward class compatibility. |
516 if (is_overpass()) return false; | 516 if (is_overpass() || is_default_method()) return false; |
517 return is_final() || class_access_flags.is_final(); | 517 return is_final() || class_access_flags.is_final(); |
518 } | 518 } |
519 | 519 |
520 bool Method::is_final_method() const { | 520 bool Method::is_final_method() const { |
521 return is_final_method(method_holder()->access_flags()); | 521 return is_final_method(method_holder()->access_flags()); |
522 } | |
523 | |
524 bool Method::is_default_method() const { | |
525 if (method_holder() != NULL && | |
526 method_holder()->is_interface() && | |
527 !is_abstract()) { | |
528 return true; | |
529 } else { | |
530 return false; | |
531 } | |
522 } | 532 } |
523 | 533 |
524 bool Method::can_be_statically_bound(AccessFlags class_access_flags) const { | 534 bool Method::can_be_statically_bound(AccessFlags class_access_flags) const { |
525 if (is_final_method(class_access_flags)) return true; | 535 if (is_final_method(class_access_flags)) return true; |
526 #ifdef ASSERT | 536 #ifdef ASSERT |
537 ResourceMark rm; | |
527 bool is_nonv = (vtable_index() == nonvirtual_vtable_index); | 538 bool is_nonv = (vtable_index() == nonvirtual_vtable_index); |
528 if (class_access_flags.is_interface()) assert(is_nonv == is_static(), err_msg("is_nonv=%s", is_nonv)); | 539 if (class_access_flags.is_interface()) { |
540 assert(is_nonv == is_static(), err_msg("is_nonv=%s", name_and_sig_as_C_string())); | |
541 } | |
529 #endif | 542 #endif |
530 assert(valid_vtable_index() || valid_itable_index(), "method must be linked before we ask this question"); | 543 assert(valid_vtable_index() || valid_itable_index(), "method must be linked before we ask this question"); |
531 return vtable_index() == nonvirtual_vtable_index; | 544 return vtable_index() == nonvirtual_vtable_index; |
532 } | 545 } |
533 | 546 |
1369 static int method_comparator(Method* a, Method* b) { | 1382 static int method_comparator(Method* a, Method* b) { |
1370 return a->name()->fast_compare(b->name()); | 1383 return a->name()->fast_compare(b->name()); |
1371 } | 1384 } |
1372 | 1385 |
1373 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array | 1386 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array |
1374 void Method::sort_methods(Array<Method*>* methods, bool idempotent) { | 1387 // default_methods also uses this without the ordering for fast find_method |
1388 void Method::sort_methods(Array<Method*>* methods, bool idempotent, bool set_idnums) { | |
1375 int length = methods->length(); | 1389 int length = methods->length(); |
1376 if (length > 1) { | 1390 if (length > 1) { |
1377 { | 1391 { |
1378 No_Safepoint_Verifier nsv; | 1392 No_Safepoint_Verifier nsv; |
1379 QuickSort::sort<Method*>(methods->data(), length, method_comparator, idempotent); | 1393 QuickSort::sort<Method*>(methods->data(), length, method_comparator, idempotent); |
1380 } | 1394 } |
1381 // Reset method ordering | 1395 // Reset method ordering |
1382 for (int i = 0; i < length; i++) { | 1396 if (set_idnums) { |
1383 Method* m = methods->at(i); | 1397 for (int i = 0; i < length; i++) { |
1384 m->set_method_idnum(i); | 1398 Method* m = methods->at(i); |
1385 } | 1399 m->set_method_idnum(i); |
1386 } | 1400 } |
1387 } | 1401 } |
1388 | 1402 } |
1403 } | |
1389 | 1404 |
1390 //----------------------------------------------------------------------------------- | 1405 //----------------------------------------------------------------------------------- |
1391 // Non-product code unless JVM/TI needs it | 1406 // Non-product code unless JVM/TI needs it |
1392 | 1407 |
1393 #if !defined(PRODUCT) || INCLUDE_JVMTI | 1408 #if !defined(PRODUCT) || INCLUDE_JVMTI |