comparison src/share/vm/c1/c1_Runtime1.cpp @ 1602:136b78722a08

6939203: JSR 292 needs method handle constants Summary: Add new CP types CONSTANT_MethodHandle, CONSTANT_MethodType; extend 'ldc' bytecode. Reviewed-by: twisti, never
author jrose
date Wed, 09 Jun 2010 18:50:45 -0700
parents b812ff5abc73
children d93949c5bdcc
comparison
equal deleted inserted replaced
1585:49fac4acd688 1602:136b78722a08
599 } 599 }
600 JRT_END 600 JRT_END
601 601
602 602
603 static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) { 603 static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) {
604 Bytecode_field* field_access = Bytecode_field_at(caller(), caller->bcp_from(bci)); 604 Bytecode_field* field_access = Bytecode_field_at(caller, bci);
605 // This can be static or non-static field access 605 // This can be static or non-static field access
606 Bytecodes::Code code = field_access->code(); 606 Bytecodes::Code code = field_access->code();
607 607
608 // We must load class, initialize class and resolvethe field 608 // We must load class, initialize class and resolvethe field
609 FieldAccessInfo result; // initialize class if needed 609 FieldAccessInfo result; // initialize class if needed
719 int patch_field_offset = -1; 719 int patch_field_offset = -1;
720 KlassHandle init_klass(THREAD, klassOop(NULL)); // klass needed by access_field_patching code 720 KlassHandle init_klass(THREAD, klassOop(NULL)); // klass needed by access_field_patching code
721 Handle load_klass(THREAD, NULL); // oop needed by load_klass_patching code 721 Handle load_klass(THREAD, NULL); // oop needed by load_klass_patching code
722 if (stub_id == Runtime1::access_field_patching_id) { 722 if (stub_id == Runtime1::access_field_patching_id) {
723 723
724 Bytecode_field* field_access = Bytecode_field_at(caller_method(), caller_method->bcp_from(bci)); 724 Bytecode_field* field_access = Bytecode_field_at(caller_method, bci);
725 FieldAccessInfo result; // initialize class if needed 725 FieldAccessInfo result; // initialize class if needed
726 Bytecodes::Code code = field_access->code(); 726 Bytecodes::Code code = field_access->code();
727 constantPoolHandle constants(THREAD, caller_method->constants()); 727 constantPoolHandle constants(THREAD, caller_method->constants());
728 LinkResolver::resolve_field(result, constants, field_access->index(), Bytecodes::java_code(code), false, CHECK); 728 LinkResolver::resolve_field(result, constants, field_access->index(), Bytecodes::java_code(code), false, CHECK);
729 patch_field_offset = result.field_offset(); 729 patch_field_offset = result.field_offset();
779 } 779 }
780 break; 780 break;
781 case Bytecodes::_ldc: 781 case Bytecodes::_ldc:
782 case Bytecodes::_ldc_w: 782 case Bytecodes::_ldc_w:
783 { 783 {
784 Bytecode_loadconstant* cc = Bytecode_loadconstant_at(caller_method(), 784 Bytecode_loadconstant* cc = Bytecode_loadconstant_at(caller_method, bci);
785 caller_method->bcp_from(bci)); 785 k = cc->resolve_constant(CHECK);
786 klassOop resolved = caller_method->constants()->klass_at(cc->index(), CHECK); 786 assert(k != NULL && !k->is_klass(), "must be class mirror or other Java constant");
787 // ldc wants the java mirror.
788 k = resolved->klass_part()->java_mirror();
789 } 787 }
790 break; 788 break;
791 default: Unimplemented(); 789 default: Unimplemented();
792 } 790 }
793 // convert to handle 791 // convert to handle
814 VMThread::execute(&deopt); 812 VMThread::execute(&deopt);
815 813
816 // Return to the now deoptimized frame. 814 // Return to the now deoptimized frame.
817 } 815 }
818 816
817 // If we are patching in a non-perm oop, make sure the nmethod
818 // is on the right list.
819 if (ScavengeRootsInCode && load_klass.not_null() && load_klass->is_scavengable()) {
820 MutexLockerEx ml_code (CodeCache_lock, Mutex::_no_safepoint_check_flag);
821 nmethod* nm = CodeCache::find_nmethod(caller_frame.pc());
822 guarantee(nm != NULL, "only nmethods can contain non-perm oops");
823 if (!nm->on_scavenge_root_list())
824 CodeCache::add_scavenge_root_nmethod(nm);
825 }
819 826
820 // Now copy code back 827 // Now copy code back
821 828
822 { 829 {
823 MutexLockerEx ml_patch (Patching_lock, Mutex::_no_safepoint_check_flag); 830 MutexLockerEx ml_patch (Patching_lock, Mutex::_no_safepoint_check_flag);