Mercurial > hg > graal-jvmci-8
comparison src/share/vm/code/scopeDesc.cpp @ 931:72088be4b386
6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
Summary: use PcDesc to keep record of the reexecute bit instead of using DebugInfoStreams
Reviewed-by: kvn, never, twisti
author | cfang |
---|---|
date | Thu, 20 Aug 2009 12:42:57 -0700 |
parents | 9987d9d5eb0e |
children | f70b0d9ab095 |
comparison
equal
deleted
inserted
replaced
930:357d4e2eb4dd | 931:72088be4b386 |
---|---|
1 /* | 1 /* |
2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
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) { | 29 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute) { |
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 decode_body(); | 34 decode_body(); |
34 } | 35 } |
35 | 36 |
36 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset) { | 37 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, bool reexecute) { |
37 _code = code; | 38 _code = code; |
38 _decode_offset = decode_offset; | 39 _decode_offset = decode_offset; |
39 _objects = decode_object_values(DebugInformationRecorder::serialized_null); | 40 _objects = decode_object_values(DebugInformationRecorder::serialized_null); |
41 _reexecute = reexecute; | |
40 decode_body(); | 42 decode_body(); |
41 } | 43 } |
42 | 44 |
43 | 45 |
44 ScopeDesc::ScopeDesc(const ScopeDesc* parent) { | 46 ScopeDesc::ScopeDesc(const ScopeDesc* parent) { |
45 _code = parent->_code; | 47 _code = parent->_code; |
46 _decode_offset = parent->_sender_decode_offset; | 48 _decode_offset = parent->_sender_decode_offset; |
47 _objects = parent->_objects; | 49 _objects = parent->_objects; |
50 _reexecute = false; //reexecute only applies to the first scope | |
48 decode_body(); | 51 decode_body(); |
49 assert(_reexecute == false, "reexecute not allowed"); | |
50 } | 52 } |
51 | 53 |
52 | 54 |
53 void ScopeDesc::decode_body() { | 55 void ScopeDesc::decode_body() { |
54 if (decode_offset() == DebugInformationRecorder::serialized_null) { | 56 if (decode_offset() == DebugInformationRecorder::serialized_null) { |
55 // This is a sentinel record, which is only relevant to | 57 // This is a sentinel record, which is only relevant to |
56 // approximate queries. Decode a reasonable frame. | 58 // approximate queries. Decode a reasonable frame. |
57 _sender_decode_offset = DebugInformationRecorder::serialized_null; | 59 _sender_decode_offset = DebugInformationRecorder::serialized_null; |
58 _method = methodHandle(_code->method()); | 60 _method = methodHandle(_code->method()); |
59 _bci = InvocationEntryBci; | 61 _bci = InvocationEntryBci; |
60 _reexecute = false; | |
61 _locals_decode_offset = DebugInformationRecorder::serialized_null; | 62 _locals_decode_offset = DebugInformationRecorder::serialized_null; |
62 _expressions_decode_offset = DebugInformationRecorder::serialized_null; | 63 _expressions_decode_offset = DebugInformationRecorder::serialized_null; |
63 _monitors_decode_offset = DebugInformationRecorder::serialized_null; | 64 _monitors_decode_offset = DebugInformationRecorder::serialized_null; |
64 } else { | 65 } else { |
65 // decode header | 66 // decode header |
66 DebugInfoReadStream* stream = stream_at(decode_offset()); | 67 DebugInfoReadStream* stream = stream_at(decode_offset()); |
67 | 68 |
68 _sender_decode_offset = stream->read_int(); | 69 _sender_decode_offset = stream->read_int(); |
69 _method = methodHandle((methodOop) stream->read_oop()); | 70 _method = methodHandle((methodOop) stream->read_oop()); |
70 _bci = stream->read_bci_and_reexecute(_reexecute); | 71 _bci = stream->read_bci(); |
71 | 72 |
72 // decode offsets for body and sender | 73 // decode offsets for body and sender |
73 _locals_decode_offset = stream->read_int(); | 74 _locals_decode_offset = stream->read_int(); |
74 _expressions_decode_offset = stream->read_int(); | 75 _expressions_decode_offset = stream->read_int(); |
75 _monitors_decode_offset = stream->read_int(); | 76 _monitors_decode_offset = stream->read_int(); |