comparison src/share/vm/code/nmethod.cpp @ 1253:f70b0d9ab095

6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop") Summary: Mark in PcDesc call sites which return oop and save the result oop across objects reallocation during deoptimization. Reviewed-by: never
author kvn
date Tue, 09 Feb 2010 01:31:13 -0800
parents 3f5b7efb9642
children 9f5b60a14736
comparison
equal deleted inserted replaced
1252:f516d5d7a019 1253:f70b0d9ab095
986 986
987 ScopeDesc* nmethod::scope_desc_at(address pc) { 987 ScopeDesc* nmethod::scope_desc_at(address pc) {
988 PcDesc* pd = pc_desc_at(pc); 988 PcDesc* pd = pc_desc_at(pc);
989 guarantee(pd != NULL, "scope must be present"); 989 guarantee(pd != NULL, "scope must be present");
990 return new ScopeDesc(this, pd->scope_decode_offset(), 990 return new ScopeDesc(this, pd->scope_decode_offset(),
991 pd->obj_decode_offset(), pd->should_reexecute()); 991 pd->obj_decode_offset(), pd->should_reexecute(),
992 pd->return_oop());
992 } 993 }
993 994
994 995
995 void nmethod::clear_inline_caches() { 996 void nmethod::clear_inline_caches() {
996 assert(SafepointSynchronize::is_at_safepoint(), "cleaning of IC's only allowed at safepoint"); 997 assert(SafepointSynchronize::is_at_safepoint(), "cleaning of IC's only allowed at safepoint");
2157 ic = CompiledIC_at(call_site); 2158 ic = CompiledIC_at(call_site);
2158 } 2159 }
2159 PcDesc* pd = pc_desc_at(ic->end_of_call()); 2160 PcDesc* pd = pc_desc_at(ic->end_of_call());
2160 assert(pd != NULL, "PcDesc must exist"); 2161 assert(pd != NULL, "PcDesc must exist");
2161 for (ScopeDesc* sd = new ScopeDesc(this, pd->scope_decode_offset(), 2162 for (ScopeDesc* sd = new ScopeDesc(this, pd->scope_decode_offset(),
2162 pd->obj_decode_offset(), pd->should_reexecute()); 2163 pd->obj_decode_offset(), pd->should_reexecute(),
2164 pd->return_oop());
2163 !sd->is_top(); sd = sd->sender()) { 2165 !sd->is_top(); sd = sd->sender()) {
2164 sd->verify(); 2166 sd->verify();
2165 } 2167 }
2166 } 2168 }
2167 2169
2422 // Return a the last scope in (begin..end] 2424 // Return a the last scope in (begin..end]
2423 ScopeDesc* nmethod::scope_desc_in(address begin, address end) { 2425 ScopeDesc* nmethod::scope_desc_in(address begin, address end) {
2424 PcDesc* p = pc_desc_near(begin+1); 2426 PcDesc* p = pc_desc_near(begin+1);
2425 if (p != NULL && p->real_pc(this) <= end) { 2427 if (p != NULL && p->real_pc(this) <= end) {
2426 return new ScopeDesc(this, p->scope_decode_offset(), 2428 return new ScopeDesc(this, p->scope_decode_offset(),
2427 p->obj_decode_offset(), p->should_reexecute()); 2429 p->obj_decode_offset(), p->should_reexecute(),
2430 p->return_oop());
2428 } 2431 }
2429 return NULL; 2432 return NULL;
2430 } 2433 }
2431 2434
2432 void nmethod::print_nmethod_labels(outputStream* stream, address block_begin) { 2435 void nmethod::print_nmethod_labels(outputStream* stream, address block_begin) {