45 #include "oops/method.hpp" |
45 #include "oops/method.hpp" |
46 #include "oops/oop.inline.hpp" |
46 #include "oops/oop.inline.hpp" |
47 #include "oops/symbol.hpp" |
47 #include "oops/symbol.hpp" |
48 #include "prims/jvmtiExport.hpp" |
48 #include "prims/jvmtiExport.hpp" |
49 #include "prims/jvmtiRedefineClassesTrace.hpp" |
49 #include "prims/jvmtiRedefineClassesTrace.hpp" |
|
50 #include "prims/methodComparator.hpp" |
50 #include "runtime/fieldDescriptor.hpp" |
51 #include "runtime/fieldDescriptor.hpp" |
51 #include "runtime/handles.inline.hpp" |
52 #include "runtime/handles.inline.hpp" |
52 #include "runtime/javaCalls.hpp" |
53 #include "runtime/javaCalls.hpp" |
53 #include "runtime/mutexLocker.hpp" |
54 #include "runtime/mutexLocker.hpp" |
54 #include "runtime/thread.inline.hpp" |
55 #include "runtime/thread.inline.hpp" |
600 // also sets rewritten |
601 // also sets rewritten |
601 this_oop->rewrite_class(CHECK_false); |
602 this_oop->rewrite_class(CHECK_false); |
602 } |
603 } |
603 |
604 |
604 // relocate jsrs and link methods after they are all rewritten |
605 // relocate jsrs and link methods after they are all rewritten |
605 this_oop->relocate_and_link_methods(CHECK_false); |
606 this_oop->link_methods(CHECK_false); |
606 |
607 |
607 // Initialize the vtable and interface table after |
608 // Initialize the vtable and interface table after |
608 // methods have been rewritten since rewrite may |
609 // methods have been rewritten since rewrite may |
609 // fabricate new Method*s. |
610 // fabricate new Method*s. |
610 // also does loader constraint checking |
611 // also does loader constraint checking |
648 } |
649 } |
649 |
650 |
650 // Now relocate and link method entry points after class is rewritten. |
651 // Now relocate and link method entry points after class is rewritten. |
651 // This is outside is_rewritten flag. In case of an exception, it can be |
652 // This is outside is_rewritten flag. In case of an exception, it can be |
652 // executed more than once. |
653 // executed more than once. |
653 void InstanceKlass::relocate_and_link_methods(TRAPS) { |
654 void InstanceKlass::link_methods(TRAPS) { |
654 assert(is_loaded(), "must be loaded"); |
655 int len = methods()->length(); |
655 instanceKlassHandle this_oop(THREAD, this); |
656 for (int i = len-1; i >= 0; i--) { |
656 Rewriter::relocate_and_link(this_oop, CHECK); |
657 methodHandle m(THREAD, methods()->at(i)); |
|
658 |
|
659 // Set up method entry points for compiler and interpreter . |
|
660 m->link_method(m, CHECK); |
|
661 |
|
662 // This is for JVMTI and unrelated to relocator but the last thing we do |
|
663 #ifdef ASSERT |
|
664 if (StressMethodComparator) { |
|
665 ResourceMark rm(THREAD); |
|
666 static int nmc = 0; |
|
667 for (int j = i; j >= 0 && j >= i-4; j--) { |
|
668 if ((++nmc % 1000) == 0) tty->print_cr("Have run MethodComparator %d times...", nmc); |
|
669 bool z = MethodComparator::methods_EMCP(m(), |
|
670 methods()->at(j)); |
|
671 if (j == i && !z) { |
|
672 tty->print("MethodComparator FAIL: "); m->print(); m->print_codes(); |
|
673 assert(z, "method must compare equal to itself"); |
|
674 } |
|
675 } |
|
676 } |
|
677 #endif //ASSERT |
|
678 } |
657 } |
679 } |
658 |
680 |
659 |
681 |
660 void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) { |
682 void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) { |
661 // Make sure klass is linked (verified) before initialization |
683 // Make sure klass is linked (verified) before initialization |