comparison src/share/vm/code/scopeDesc.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 72088be4b386
children c18cbe5936b8
comparison
equal deleted inserted replaced
1252:f516d5d7a019 1253:f70b0d9ab095
24 24
25 # include "incls/_precompiled.incl" 25 # include "incls/_precompiled.incl"
26 # include "incls/_scopeDesc.cpp.incl" 26 # include "incls/_scopeDesc.cpp.incl"
27 27
28 28
29 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute) { 29 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool return_oop) {
30 _code = code; 30 _code = code;
31 _decode_offset = decode_offset; 31 _decode_offset = decode_offset;
32 _objects = decode_object_values(obj_decode_offset); 32 _objects = decode_object_values(obj_decode_offset);
33 _reexecute = reexecute; 33 _reexecute = reexecute;
34 _return_oop = return_oop;
34 decode_body(); 35 decode_body();
35 } 36 }
36 37
37 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, bool reexecute) { 38 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, bool reexecute, bool return_oop) {
38 _code = code; 39 _code = code;
39 _decode_offset = decode_offset; 40 _decode_offset = decode_offset;
40 _objects = decode_object_values(DebugInformationRecorder::serialized_null); 41 _objects = decode_object_values(DebugInformationRecorder::serialized_null);
41 _reexecute = reexecute; 42 _reexecute = reexecute;
43 _return_oop = return_oop;
42 decode_body(); 44 decode_body();
43 } 45 }
44 46
45 47
46 ScopeDesc::ScopeDesc(const ScopeDesc* parent) { 48 ScopeDesc::ScopeDesc(const ScopeDesc* parent) {
47 _code = parent->_code; 49 _code = parent->_code;
48 _decode_offset = parent->_sender_decode_offset; 50 _decode_offset = parent->_sender_decode_offset;
49 _objects = parent->_objects; 51 _objects = parent->_objects;
50 _reexecute = false; //reexecute only applies to the first scope 52 _reexecute = false; //reexecute only applies to the first scope
53 _return_oop = false;
51 decode_body(); 54 decode_body();
52 } 55 }
53 56
54 57
55 void ScopeDesc::decode_body() { 58 void ScopeDesc::decode_body() {