Mercurial > hg > truffle
comparison src/share/vm/interpreter/interpreterRuntime.cpp @ 1579:e9ff18c4ace7
Merge
author | jrose |
---|---|
date | Wed, 02 Jun 2010 22:45:42 -0700 |
parents | c18cbe5936b8 ab102d5d923e |
children | 136b78722a08 |
comparison
equal
deleted
inserted
replaced
1562:dfe27f03244a | 1579:e9ff18c4ace7 |
---|---|
61 | 61 |
62 | 62 |
63 IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide)) | 63 IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide)) |
64 // access constant pool | 64 // access constant pool |
65 constantPoolOop pool = method(thread)->constants(); | 65 constantPoolOop pool = method(thread)->constants(); |
66 int index = wide ? two_byte_index(thread) : one_byte_index(thread); | 66 int index = wide ? get_index_u2(thread, Bytecodes::_ldc_w) : get_index_u1(thread, Bytecodes::_ldc); |
67 constantTag tag = pool->tag_at(index); | 67 constantTag tag = pool->tag_at(index); |
68 | 68 |
69 if (tag.is_unresolved_klass() || tag.is_klass()) { | 69 if (tag.is_unresolved_klass() || tag.is_klass()) { |
70 klassOop klass = pool->klass_at(index, CHECK); | 70 klassOop klass = pool->klass_at(index, CHECK); |
71 oop java_class = klass->klass_part()->java_mirror(); | 71 oop java_class = klass->klass_part()->java_mirror(); |
133 | 133 |
134 | 134 |
135 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address)) | 135 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address)) |
136 // We may want to pass in more arguments - could make this slightly faster | 136 // We may want to pass in more arguments - could make this slightly faster |
137 constantPoolOop constants = method(thread)->constants(); | 137 constantPoolOop constants = method(thread)->constants(); |
138 int i = two_byte_index(thread); | 138 int i = get_index_u2(thread, Bytecodes::_multianewarray); |
139 klassOop klass = constants->klass_at(i, CHECK); | 139 klassOop klass = constants->klass_at(i, CHECK); |
140 int nof_dims = number_of_dimensions(thread); | 140 int nof_dims = number_of_dimensions(thread); |
141 assert(oop(klass)->is_klass(), "not a class"); | 141 assert(oop(klass)->is_klass(), "not a class"); |
142 assert(nof_dims >= 1, "multianewarray rank must be nonzero"); | 142 assert(nof_dims >= 1, "multianewarray rank must be nonzero"); |
143 | 143 |
167 | 167 |
168 | 168 |
169 // Quicken instance-of and check-cast bytecodes | 169 // Quicken instance-of and check-cast bytecodes |
170 IRT_ENTRY(void, InterpreterRuntime::quicken_io_cc(JavaThread* thread)) | 170 IRT_ENTRY(void, InterpreterRuntime::quicken_io_cc(JavaThread* thread)) |
171 // Force resolving; quicken the bytecode | 171 // Force resolving; quicken the bytecode |
172 int which = two_byte_index(thread); | 172 int which = get_index_u2(thread, Bytecodes::_checkcast); |
173 constantPoolOop cpool = method(thread)->constants(); | 173 constantPoolOop cpool = method(thread)->constants(); |
174 // We'd expect to assert that we're only here to quicken bytecodes, but in a multithreaded | 174 // We'd expect to assert that we're only here to quicken bytecodes, but in a multithreaded |
175 // program we might have seen an unquick'd bytecode in the interpreter but have another | 175 // program we might have seen an unquick'd bytecode in the interpreter but have another |
176 // thread quicken the bytecode before we get here. | 176 // thread quicken the bytecode before we get here. |
177 // assert( cpool->tag_at(which).is_unresolved_klass(), "should only come here to quicken bytecodes" ); | 177 // assert( cpool->tag_at(which).is_unresolved_klass(), "should only come here to quicken bytecodes" ); |
461 constantPoolHandle pool(thread, method(thread)->constants()); | 461 constantPoolHandle pool(thread, method(thread)->constants()); |
462 bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic); | 462 bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic); |
463 | 463 |
464 { | 464 { |
465 JvmtiHideSingleStepping jhss(thread); | 465 JvmtiHideSingleStepping jhss(thread); |
466 LinkResolver::resolve_field(info, pool, two_byte_index(thread), | 466 LinkResolver::resolve_field(info, pool, get_index_u2_cpcache(thread, bytecode), |
467 bytecode, false, CHECK); | 467 bytecode, false, CHECK); |
468 } // end JvmtiHideSingleStepping | 468 } // end JvmtiHideSingleStepping |
469 | 469 |
470 // check if link resolution caused cpCache to be updated | 470 // check if link resolution caused cpCache to be updated |
471 if (already_resolved(thread)) return; | 471 if (already_resolved(thread)) return; |
632 constantPoolHandle pool(thread, method(thread)->constants()); | 632 constantPoolHandle pool(thread, method(thread)->constants()); |
633 | 633 |
634 { | 634 { |
635 JvmtiHideSingleStepping jhss(thread); | 635 JvmtiHideSingleStepping jhss(thread); |
636 LinkResolver::resolve_invoke(info, receiver, pool, | 636 LinkResolver::resolve_invoke(info, receiver, pool, |
637 two_byte_index(thread), bytecode, CHECK); | 637 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK); |
638 if (JvmtiExport::can_hotswap_or_post_breakpoint()) { | 638 if (JvmtiExport::can_hotswap_or_post_breakpoint()) { |
639 int retry_count = 0; | 639 int retry_count = 0; |
640 while (info.resolved_method()->is_old()) { | 640 while (info.resolved_method()->is_old()) { |
641 // It is very unlikely that method is redefined more than 100 times | 641 // It is very unlikely that method is redefined more than 100 times |
642 // in the middle of resolve. If it is looping here more than 100 times | 642 // in the middle of resolve. If it is looping here more than 100 times |
643 // means then there could be a bug here. | 643 // means then there could be a bug here. |
644 guarantee((retry_count++ < 100), | 644 guarantee((retry_count++ < 100), |
645 "Could not resolve to latest version of redefined method"); | 645 "Could not resolve to latest version of redefined method"); |
646 // method is redefined in the middle of resolve so re-try. | 646 // method is redefined in the middle of resolve so re-try. |
647 LinkResolver::resolve_invoke(info, receiver, pool, | 647 LinkResolver::resolve_invoke(info, receiver, pool, |
648 two_byte_index(thread), bytecode, CHECK); | 648 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK); |
649 } | 649 } |
650 } | 650 } |
651 } // end JvmtiHideSingleStepping | 651 } // end JvmtiHideSingleStepping |
652 | 652 |
653 // check if link resolution caused cpCache to be updated | 653 // check if link resolution caused cpCache to be updated |
702 int site_index = 0; | 702 int site_index = 0; |
703 { address caller_bcp = bcp(thread); | 703 { address caller_bcp = bcp(thread); |
704 caller_bci = caller_method->bci_from(caller_bcp); | 704 caller_bci = caller_method->bci_from(caller_bcp); |
705 site_index = Bytes::get_native_u4(caller_bcp+1); | 705 site_index = Bytes::get_native_u4(caller_bcp+1); |
706 } | 706 } |
707 assert(site_index == four_byte_index(thread), ""); | 707 assert(site_index == InterpreterRuntime::bytecode(thread)->get_index_u4(bytecode), ""); |
708 assert(constantPoolCacheOopDesc::is_secondary_index(site_index), "proper format"); | 708 assert(constantPoolCacheOopDesc::is_secondary_index(site_index), "proper format"); |
709 // there is a second CPC entries that is of interest; it caches signature info: | 709 // there is a second CPC entries that is of interest; it caches signature info: |
710 int main_index = pool->cache()->secondary_entry_at(site_index)->main_entry_index(); | 710 int main_index = pool->cache()->secondary_entry_at(site_index)->main_entry_index(); |
711 | 711 |
712 // first resolve the signature to a MH.invoke methodOop | 712 // first resolve the signature to a MH.invoke methodOop |