annotate src/share/vm/runtime/frame.hpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents 148e5441d916
children dd57230ba8fe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
844
bd02caa94611 6862919: Update copyright year
xdono
parents: 793
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 typedef class BytecodeInterpreter* interpreterState;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class CodeBlob;
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // A frame represents a physical stack frame (an activation). Frames
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // can be C or Java frames, and the Java frames can be interpreted or
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // compiled. In contrast, vframes represent source-level activations,
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // so that one physical frame can correspond to multiple source level
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // frames because of inlining.
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class frame VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // Instance variables:
a61af66fc99e Initial load
duke
parents:
diff changeset
39 intptr_t* _sp; // stack pointer (from Thread::last_Java_sp)
a61af66fc99e Initial load
duke
parents:
diff changeset
40 address _pc; // program counter (the next instruction after the call)
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 CodeBlob* _cb; // CodeBlob that "owns" pc
a61af66fc99e Initial load
duke
parents:
diff changeset
43 enum deopt_state {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 not_deoptimized,
a61af66fc99e Initial load
duke
parents:
diff changeset
45 is_deoptimized,
a61af66fc99e Initial load
duke
parents:
diff changeset
46 unknown
a61af66fc99e Initial load
duke
parents:
diff changeset
47 };
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 deopt_state _deopt_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // Constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
53 frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // pc: Returns the pc at which this frame will continue normally.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // It must point at the beginning of the next instruction to execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 address pc() const { return _pc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // This returns the pc that if you were in the debugger you'd see. Not
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // the idealized value in the frame object. This undoes the magic conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // that happens for deoptimized frames. In addition it makes the value the
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // hardware would want to see in the native frame. The only user (at this point)
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // is deoptimization. It likely no one else should ever use it.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 address raw_pc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void set_pc( address newpc );
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 intptr_t* sp() const { return _sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
71 void set_sp( intptr_t* newsp ) { _sp = newsp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 CodeBlob* cb() const { return _cb; }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // patching operations
a61af66fc99e Initial load
duke
parents:
diff changeset
77 void patch_pc(Thread* thread, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Every frame needs to return a unique id which distinguishes it from all other frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // For sparc and ia32 use sp. ia64 can have memory frames that are empty so multiple frames
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // will have identical sp values. For ia64 the bsp (fp) value will serve. No real frame
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // should have an id() of NULL so it is a distinguishing value for an unmatchable frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // We also have relationals which allow comparing a frame to anoth frame's id() allow
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // us to distinguish younger (more recent activation) from older (less recent activations)
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // A NULL id is only valid when comparing for equality.
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 intptr_t* id(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 bool is_younger(intptr_t* id) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 bool is_older(intptr_t* id) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // testers
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // Compares for strict equality. Rarely used or needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // It can return a different result than f1.id() == f2.id()
a61af66fc99e Initial load
duke
parents:
diff changeset
95 bool equal(frame other) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // type testers
a61af66fc99e Initial load
duke
parents:
diff changeset
98 bool is_interpreted_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 bool is_java_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 bool is_entry_frame() const; // Java frame called from C?
a61af66fc99e Initial load
duke
parents:
diff changeset
101 bool is_native_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 bool is_runtime_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 bool is_compiled_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 bool is_safepoint_blob_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 bool is_deoptimized_frame() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // testers
a61af66fc99e Initial load
duke
parents:
diff changeset
108 bool is_first_frame() const; // oldest frame? (has no sender)
a61af66fc99e Initial load
duke
parents:
diff changeset
109 bool is_first_java_frame() const; // same for Java frame
a61af66fc99e Initial load
duke
parents:
diff changeset
110
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
111 bool is_interpreted_frame_valid(JavaThread* thread) const; // performs sanity checks on interpreted frames.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // tells whether this frame is marked for deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
114 bool should_be_deoptimized() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // tells whether this frame can be deoptimized
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool can_be_deoptimized() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // returns the frame size in stack slots
793
eacd97c88873 6848466: frame::frame_size() assertion failure with -XX:+DebugDeoptimization
cfang
parents: 196
diff changeset
120 int frame_size(RegisterMap* map) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // returns the sending frame
a61af66fc99e Initial load
duke
parents:
diff changeset
123 frame sender(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // for Profiling - acting on another frame. walks sender frames
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // if valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
127 frame profile_find_Java_sender_frame(JavaThread *thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 bool safe_for_sender(JavaThread *thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // returns the sender, but skips conversion frames
a61af66fc99e Initial load
duke
parents:
diff changeset
131 frame real_sender(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // returns the the sending Java frame, skipping any intermediate C frames
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // NB: receiver must not be first frame
a61af66fc99e Initial load
duke
parents:
diff changeset
135 frame java_sender() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Helper methods for better factored code in frame::sender
a61af66fc99e Initial load
duke
parents:
diff changeset
139 frame sender_for_compiled_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 frame sender_for_entry_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 frame sender_for_interpreter_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 frame sender_for_native_frame(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // All frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // A low-level interface for vframes:
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 intptr_t* addr_at(int index) const { return &fp()[index]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 intptr_t at(int index) const { return *addr_at(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // accessors for locals
a61af66fc99e Initial load
duke
parents:
diff changeset
154 oop obj_at(int offset) const { return *obj_at_addr(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void obj_at_put(int offset, oop value) { *obj_at_addr(offset) = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 jint int_at(int offset) const { return *int_at_addr(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 void int_at_put(int offset, jint value) { *int_at_addr(offset) = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 oop* obj_at_addr(int offset) const { return (oop*) addr_at(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 oop* adjusted_obj_at_addr(methodOop method, int index) { return obj_at_addr(adjust_offset(method, index)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
165 jint* int_at_addr(int offset) const { return (jint*) addr_at(offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Link (i.e., the pointer to the previous frame)
a61af66fc99e Initial load
duke
parents:
diff changeset
169 intptr_t* link() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void set_link(intptr_t* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // Return address
a61af66fc99e Initial load
duke
parents:
diff changeset
173 address sender_pc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Support for deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void deoptimize(JavaThread* thread, bool thread_is_known_safe = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // The frame's original SP, before any extension by an interpreted callee;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // used for packing debug info into vframeArray objects and vframeArray lookup.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 intptr_t* unextended_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // returns the stack pointer of the calling frame
a61af66fc99e Initial load
duke
parents:
diff changeset
183 intptr_t* sender_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Interpreter frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
189 intptr_t** interpreter_frame_locals_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
190 intptr_t* interpreter_frame_bcx_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 intptr_t* interpreter_frame_mdx_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Tags for TaggedStackInterpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
195 enum Tag {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 TagValue = 0, // Important: must be zero to use G0 on sparc.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 TagReference = 0x555, // Reference type - is an oop that needs gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 TagCategory2 = 0x666 // Only used internally by interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // and not written to the java stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // The values above are chosen so that misuse causes a crash
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // with a recognizable value.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 };
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 static Tag tag_for_basic_type(BasicType typ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return (typ == T_OBJECT ? TagReference : TagValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Locals
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // The _at version returns a pointer because the address is used for GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 intptr_t* interpreter_frame_local_at(int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Tag interpreter_frame_local_tag(int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void interpreter_frame_set_local_tag(int index, Tag tag) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void interpreter_frame_set_locals(intptr_t* locs);
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // byte code index/pointer (use these functions for unchecked frame access only!)
a61af66fc99e Initial load
duke
parents:
diff changeset
218 intptr_t interpreter_frame_bcx() const { return *interpreter_frame_bcx_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void interpreter_frame_set_bcx(intptr_t bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // byte code index
a61af66fc99e Initial load
duke
parents:
diff changeset
222 jint interpreter_frame_bci() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 void interpreter_frame_set_bci(jint bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // byte code pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
226 address interpreter_frame_bcp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 void interpreter_frame_set_bcp(address bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Unchecked access to the method data index/pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Only use this if you know what you are doing.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 intptr_t interpreter_frame_mdx() const { return *interpreter_frame_mdx_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void interpreter_frame_set_mdx(intptr_t mdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // method data pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
235 address interpreter_frame_mdp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
236 void interpreter_frame_set_mdp(address dp);
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Find receiver out of caller's (compiled) argument list
a61af66fc99e Initial load
duke
parents:
diff changeset
239 oop retrieve_receiver(RegisterMap *reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Return the monitor owner and BasicLock for compiled synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // native methods so that biased locking can revoke the receiver's
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // bias if necessary. Takes optional nmethod for this frame as
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // argument to avoid performing repeated lookups in code cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 BasicLock* compiled_synchronized_native_monitor (nmethod* nm = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 oop compiled_synchronized_native_monitor_owner(nmethod* nm = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Find receiver for an invoke when arguments are just pushed on stack (i.e., callee stack-frame is
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // not setup)
a61af66fc99e Initial load
duke
parents:
diff changeset
250 oop interpreter_callee_receiver(symbolHandle signature) { return *interpreter_callee_receiver_addr(signature); }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
253 oop* interpreter_callee_receiver_addr(symbolHandle signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // expression stack (may go up or down, direction == 1 or -1)
a61af66fc99e Initial load
duke
parents:
diff changeset
257 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
258 intptr_t* interpreter_frame_expression_stack() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 static jint interpreter_frame_expression_stack_direction();
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // The _at version returns a pointer because the address is used for GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
262 intptr_t* interpreter_frame_expression_stack_at(jint offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 Tag interpreter_frame_expression_stack_tag(jint offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void interpreter_frame_set_expression_stack_tag(jint offset, Tag tag) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // top of expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
267 intptr_t* interpreter_frame_tos_at(jint offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 intptr_t* interpreter_frame_tos_address() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 jint interpreter_frame_expression_stack_size() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 intptr_t* interpreter_frame_sender_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // template based interpreter deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void set_interpreter_frame_sender_sp(intptr_t* sender_sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void interpreter_frame_set_monitor_end(BasicObjectLock* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 #endif // CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // BasicObjectLocks:
a61af66fc99e Initial load
duke
parents:
diff changeset
282 //
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // interpreter_frame_monitor_begin is higher in memory than interpreter_frame_monitor_end
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // Interpreter_frame_monitor_begin points to one element beyond the oldest one,
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // interpreter_frame_monitor_end points to the youngest one, or if there are none,
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // it points to one beyond where the first element will be.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // interpreter_frame_monitor_size reports the allocation size of a monitor in the interpreter stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // this value is >= BasicObjectLock::size(), and may be rounded up
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 BasicObjectLock* interpreter_frame_monitor_begin() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 BasicObjectLock* interpreter_frame_monitor_end() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 BasicObjectLock* next_monitor_in_interpreter_frame(BasicObjectLock* current) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 BasicObjectLock* previous_monitor_in_interpreter_frame(BasicObjectLock* current) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 static int interpreter_frame_monitor_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 void interpreter_frame_verify_monitor(BasicObjectLock* value) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Tells whether the current interpreter_frame frame pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // corresponds to the old compiled/deoptimized fp
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // The receiver used to be a top level frame
a61af66fc99e Initial load
duke
parents:
diff changeset
301 bool interpreter_frame_equals_unpacked_fp(intptr_t* fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // Return/result value from this interpreter frame
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // If the method return type is T_OBJECT or T_ARRAY populates oop_result
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // For other (non-T_VOID) the appropriate field in the jvalue is populated
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // with the result value.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Should only be called when at method exit when the method is not
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // exiting due to an exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 BasicType interpreter_frame_result(oop* oop_result, jvalue* value_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Method & constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
313 methodOop interpreter_frame_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 void interpreter_frame_set_method(methodOop method);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 methodOop* interpreter_frame_method_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 constantPoolCacheOop* interpreter_frame_cache_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Entry frames
a61af66fc99e Initial load
duke
parents:
diff changeset
320 JavaCallWrapper* entry_frame_call_wrapper() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 intptr_t* entry_frame_argument_at(int offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // tells whether there is another chunk of Delta stack above
a61af66fc99e Initial load
duke
parents:
diff changeset
324 bool entry_frame_is_first() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // Compiled frames:
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Given the index of a local, and the number of argument words
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // in this stack frame, tell which word of the stack frame to find
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // the local in. Arguments are stored above the ofp/rpc pair,
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // while other locals are stored below it.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // Since monitors (BasicLock blocks) are also assigned indexes,
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // but may have different storage requirements, their presence
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // can also affect the calculation of offsets.
a61af66fc99e Initial load
duke
parents:
diff changeset
336 static int local_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Given the index of a monitor, etc., tell which word of the
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // stack frame contains the start of the BasicLock block.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Note that the local index by convention is the __higher__
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // of the two indexes allocated to the block.
a61af66fc99e Initial load
duke
parents:
diff changeset
342 static int monitor_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Tell the smallest value that local_offset_for_compiler will attain.
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // This is used to help determine how much stack frame to allocate.
a61af66fc99e Initial load
duke
parents:
diff changeset
346 static int min_local_offset_for_compiler(int nof_args, int max_nof_locals, int max_nof_monitors);
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // Tells if this register must be spilled during a call.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // On Intel, all registers are smashed by calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 static bool volatile_across_calls(Register reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // Safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
356 oop saved_oop_result(RegisterMap* map) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 void set_saved_oop_result(RegisterMap* map, oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // For debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
360 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
361 const char* print_name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
364 void print_value() const { print_value_on(tty,NULL); }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 void print_value_on(outputStream* st, JavaThread *thread) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 void interpreter_frame_print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 void print_on_error(outputStream* st, char* buf, int buflen, bool verbose = false) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // Conversion from an VMReg to physical stack location
a61af66fc99e Initial load
duke
parents:
diff changeset
371 oop* oopmapreg_to_location(VMReg reg, const RegisterMap* regmap) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // Oops-do's
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void oops_compiled_arguments_do(symbolHandle signature, bool is_static, const RegisterMap* reg_map, OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 void oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
378 void oops_interpreted_locals_do(OopClosure *f,
a61af66fc99e Initial load
duke
parents:
diff changeset
379 int max_locals,
a61af66fc99e Initial load
duke
parents:
diff changeset
380 InterpreterOopMap *mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 void oops_interpreted_expressions_do(OopClosure *f, symbolHandle signature,
a61af66fc99e Initial load
duke
parents:
diff changeset
382 bool is_static, int max_stack, int max_locals,
a61af66fc99e Initial load
duke
parents:
diff changeset
383 InterpreterOopMap *mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void oops_interpreted_arguments_do(symbolHandle signature, bool is_static, OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Iteration of oops
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
387 void oops_do_internal(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
388 void oops_entry_do(OopClosure* f, const RegisterMap* map);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
389 void oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* map);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
390 int adjust_offset(methodOop method, int index); // helper for above fn
a61af66fc99e Initial load
duke
parents:
diff changeset
391 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Memory management
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
393 void oops_do(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map) { oops_do_internal(f, cf, map, true); }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
394 void nmethods_do(CodeBlobClosure* cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 void gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 void gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 void pd_gc_epilog();
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
401 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
402 class CheckValueClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
403 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
404 void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
405 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
406 };
a61af66fc99e Initial load
duke
parents:
diff changeset
407 static CheckValueClosure _check_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 class CheckOopClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
410 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
411 void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
412 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
413 };
a61af66fc99e Initial load
duke
parents:
diff changeset
414 static CheckOopClosure _check_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 static void check_derived_oop(oop* base, oop* derived);
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 class ZapDeadClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
419 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
420 void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 107
diff changeset
421 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
422 };
a61af66fc99e Initial load
duke
parents:
diff changeset
423 static ZapDeadClosure _zap_dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // Zapping
a61af66fc99e Initial load
duke
parents:
diff changeset
427 void zap_dead_locals (JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 void zap_dead_interpreted_locals(JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
429 void zap_dead_compiled_locals (JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void zap_dead_entry_locals (JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 void zap_dead_deoptimized_locals(JavaThread* thread, const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
434 void verify(const RegisterMap* map);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 static bool verify_return_pc(address x);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 static bool is_bci(intptr_t bcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Usage:
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // assert(frame::verify_return_pc(return_address), "must be a return pc");
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 int pd_oop_map_offset_adjustment() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 # include "incls/_frame_pd.hpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
443 };
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 //
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // StackFrameStream iterates through the frames of a thread starting from
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // top most frame. It automatically takes care of updating the location of
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // all (callee-saved) registers. Notice: If a thread is stopped at
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // a safepoint, all registers are saved, not only the callee-saved ones.
a61af66fc99e Initial load
duke
parents:
diff changeset
451 //
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Use:
a61af66fc99e Initial load
duke
parents:
diff changeset
453 //
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // for(StackFrameStream fst(thread); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
457 //
a61af66fc99e Initial load
duke
parents:
diff changeset
458 class StackFrameStream : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
460 frame _fr;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 RegisterMap _reg_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 bool _is_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
464 StackFrameStream(JavaThread *thread, bool update = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
467 bool is_done() { return (_is_done) ? true : (_is_done = _fr.is_first_frame(), false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
468 void next() { if (!_is_done) _fr = _fr.sender(&_reg_map); }
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Query
a61af66fc99e Initial load
duke
parents:
diff changeset
471 frame *current() { return &_fr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 RegisterMap* register_map() { return &_reg_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
473 };