comparison src/share/vm/c1/c1_Runtime1.cpp @ 12264:b2e698d2276c

8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation Summary: Enhance method resolution and resulting data structures, plus some refactoring. Reviewed-by: twisti, acorn, jrose
author drchase
date Fri, 13 Sep 2013 22:38:02 -0400
parents f98f5d48f511
children 190899198332 5186dcaca431
comparison
equal deleted inserted replaced
12261:2c98370f2611 12264:b2e698d2276c
707 Bytecode_field field_access(caller, bci); 707 Bytecode_field field_access(caller, bci);
708 // This can be static or non-static field access 708 // This can be static or non-static field access
709 Bytecodes::Code code = field_access.code(); 709 Bytecodes::Code code = field_access.code();
710 710
711 // We must load class, initialize class and resolvethe field 711 // We must load class, initialize class and resolvethe field
712 FieldAccessInfo result; // initialize class if needed 712 fieldDescriptor result; // initialize class if needed
713 constantPoolHandle constants(THREAD, caller->constants()); 713 constantPoolHandle constants(THREAD, caller->constants());
714 LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK_NULL); 714 LinkResolver::resolve_field_access(result, constants, field_access.index(), Bytecodes::java_code(code), CHECK_NULL);
715 return result.klass()(); 715 return result.field_holder();
716 } 716 }
717 717
718 718
719 // 719 //
720 // This routine patches sites where a class wasn't loaded or 720 // This routine patches sites where a class wasn't loaded or
824 (stub_id == Runtime1::load_klass_patching_id || stub_id == Runtime1::load_mirror_patching_id); 824 (stub_id == Runtime1::load_klass_patching_id || stub_id == Runtime1::load_mirror_patching_id);
825 825
826 if (stub_id == Runtime1::access_field_patching_id) { 826 if (stub_id == Runtime1::access_field_patching_id) {
827 827
828 Bytecode_field field_access(caller_method, bci); 828 Bytecode_field field_access(caller_method, bci);
829 FieldAccessInfo result; // initialize class if needed 829 fieldDescriptor result; // initialize class if needed
830 Bytecodes::Code code = field_access.code(); 830 Bytecodes::Code code = field_access.code();
831 constantPoolHandle constants(THREAD, caller_method->constants()); 831 constantPoolHandle constants(THREAD, caller_method->constants());
832 LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK); 832 LinkResolver::resolve_field_access(result, constants, field_access.index(), Bytecodes::java_code(code), CHECK);
833 patch_field_offset = result.field_offset(); 833 patch_field_offset = result.offset();
834 834
835 // If we're patching a field which is volatile then at compile it 835 // If we're patching a field which is volatile then at compile it
836 // must not have been know to be volatile, so the generated code 836 // must not have been know to be volatile, so the generated code
837 // isn't correct for a volatile reference. The nmethod has to be 837 // isn't correct for a volatile reference. The nmethod has to be
838 // deoptimized so that the code can be regenerated correctly. 838 // deoptimized so that the code can be regenerated correctly.