annotate src/share/vm/code/scopeDesc.cpp @ 3018:5857923e563c

Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Sat, 18 Jun 2011 19:13:55 +0200
parents f95d63e2154a
children e522a00b91aa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1552
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1253
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1253
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1253
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
26 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
27 #include "code/pcDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
28 #include "code/scopeDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
29 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
30 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
31 #include "runtime/handles.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
34 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool rethrow_exception, bool return_oop) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 _code = code;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _decode_offset = decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 _objects = decode_object_values(obj_decode_offset);
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
38 _reexecute = reexecute;
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 931
diff changeset
39 _return_oop = return_oop;
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
40 _rethrow_exception = rethrow_exception;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
41 decode_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
42 }
a61af66fc99e Initial load
duke
parents:
diff changeset
43
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
44 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, bool reexecute, bool rethrow_exception, bool return_oop) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 _code = code;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _decode_offset = decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _objects = decode_object_values(DebugInformationRecorder::serialized_null);
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
48 _reexecute = reexecute;
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 931
diff changeset
49 _return_oop = return_oop;
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
50 _rethrow_exception = rethrow_exception;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 decode_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 ScopeDesc::ScopeDesc(const ScopeDesc* parent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 _code = parent->_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _decode_offset = parent->_sender_decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _objects = parent->_objects;
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
59 _reexecute = false; //reexecute only applies to the first scope
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
60 _rethrow_exception = false;
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 931
diff changeset
61 _return_oop = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 decode_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 void ScopeDesc::decode_body() {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (decode_offset() == DebugInformationRecorder::serialized_null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // This is a sentinel record, which is only relevant to
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // approximate queries. Decode a reasonable frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _sender_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _method = methodHandle(_code->method());
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _bci = InvocationEntryBci;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _locals_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _expressions_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _monitors_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // decode header
a61af66fc99e Initial load
duke
parents:
diff changeset
78 DebugInfoReadStream* stream = stream_at(decode_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _sender_decode_offset = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _method = methodHandle((methodOop) stream->read_oop());
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
82 _bci = stream->read_bci();
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 196
diff changeset
83
0
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // decode offsets for body and sender
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _locals_decode_offset = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 _expressions_decode_offset = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _monitors_decode_offset = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 GrowableArray<ScopeValue*>* ScopeDesc::decode_scope_values(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 DebugInfoReadStream* stream = stream_at(decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 int length = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 GrowableArray<ScopeValue*>* result = new GrowableArray<ScopeValue*> (length);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 result->push(ScopeValue::read_from(stream));
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 GrowableArray<ScopeValue*>* ScopeDesc::decode_object_values(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 GrowableArray<ScopeValue*>* result = new GrowableArray<ScopeValue*>();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 DebugInfoReadStream* stream = new DebugInfoReadStream(_code, decode_offset, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 int length = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 for (int index = 0; index < length; index++) {
44
52fed2ec0afb 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 0
diff changeset
109 // Objects values are pushed to 'result' array during read so that
52fed2ec0afb 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 0
diff changeset
110 // object's fields could reference it (OBJECT_ID_CODE).
52fed2ec0afb 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 0
diff changeset
111 (void)ScopeValue::read_from(stream);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 assert(result->length() == length, "inconsistent debug information");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 GrowableArray<MonitorValue*>* ScopeDesc::decode_monitor_values(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 DebugInfoReadStream* stream = stream_at(decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int length = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
122 GrowableArray<MonitorValue*>* result = new GrowableArray<MonitorValue*> (length);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 result->push(new MonitorValue(stream));
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 DebugInfoReadStream* ScopeDesc::stream_at(int decode_offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 return new DebugInfoReadStream(_code, decode_offset, _objects);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 GrowableArray<ScopeValue*>* ScopeDesc::locals() {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 return decode_scope_values(_locals_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 GrowableArray<ScopeValue*>* ScopeDesc::expressions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 return decode_scope_values(_expressions_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 GrowableArray<MonitorValue*>* ScopeDesc::monitors() {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return decode_monitor_values(_monitors_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 GrowableArray<ScopeValue*>* ScopeDesc::objects() {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return _objects;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 bool ScopeDesc::is_top() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return _sender_decode_offset == DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ScopeDesc* ScopeDesc::sender() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 if (is_top()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 return new ScopeDesc(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 void ScopeDesc::print_value_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
163 method()()->print_short_name(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
164 int lineno = method()->line_number_from_bci(bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (lineno != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 st->print_cr("@%d (line %d)", bci(), lineno);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 st->print_cr("@%d", bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void ScopeDesc::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 print_on(st, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void ScopeDesc::print_on(outputStream* st, PcDesc* pd) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // header
a61af66fc99e Initial load
duke
parents:
diff changeset
178 if (pd != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 tty->print_cr("ScopeDesc(pc=" PTR_FORMAT " offset=%x):", pd->real_pc(_code), pd->pc_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // decode offsets
a61af66fc99e Initial load
duke
parents:
diff changeset
184 if (WizardMode) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1552
diff changeset
185 st->print("ScopeDesc[%d]@" PTR_FORMAT " ", _decode_offset, _code->content_begin());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 st->print_cr(" offset: %d", _decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 st->print_cr(" bci: %d", bci());
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 196
diff changeset
188 st->print_cr(" reexecute: %s", should_reexecute() ? "true" : "false");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 st->print_cr(" locals: %d", _locals_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 st->print_cr(" stack: %d", _expressions_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 st->print_cr(" monitor: %d", _monitors_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 st->print_cr(" sender: %d", _sender_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // locals
a61af66fc99e Initial load
duke
parents:
diff changeset
195 { GrowableArray<ScopeValue*>* l = ((ScopeDesc*) this)->locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 tty->print_cr(" Locals");
a61af66fc99e Initial load
duke
parents:
diff changeset
198 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 st->print(" - l%d: ", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 l->at(index)->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
201 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // expressions
a61af66fc99e Initial load
duke
parents:
diff changeset
206 { GrowableArray<ScopeValue*>* l = ((ScopeDesc*) this)->expressions();
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 st->print_cr(" Expression stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
209 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 st->print(" - @%d: ", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 l->at(index)->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
217 { GrowableArray<MonitorValue*>* l = ((ScopeDesc*) this)->monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 st->print_cr(" Monitor stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
220 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 st->print(" - @%d: ", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 l->at(index)->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (DoEscapeAnalysis && is_top() && _objects != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 tty->print_cr("Objects");
a61af66fc99e Initial load
duke
parents:
diff changeset
231 for (int i = 0; i < _objects->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 ObjectValue* sv = (ObjectValue*) _objects->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 tty->print(" - %d: ", sv->id());
a61af66fc99e Initial load
duke
parents:
diff changeset
234 sv->print_fields_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 void ScopeDesc::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 guarantee(method()->is_method(), "type check");
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // check if we have any illegal elements on the expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
248 { GrowableArray<ScopeValue*>* l = expressions();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 //guarantee(!l->at(index)->is_illegal(), "expression element cannot be illegal");
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }