Mercurial > hg > truffle
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) { |