227 int bci() { return _bci; }
228 GrowableArray<ScopeValue*>* locals() { return _locals; }
229 GrowableArray<ScopeValue*>* expressions() { return _expressions; }
230 GrowableArray<MonitorValue*>* monitors() { return _monitors; }
231 IRScopeDebugInfo* caller() { return _caller; }
232
233 //Whether we should reexecute this bytecode for deopt
234 bool should_reexecute();
235
236 void record_debug_info(DebugInformationRecorder* recorder, int pc_offset, bool topmost, bool is_method_handle_invoke = false) {
237 if (caller() != NULL) {
238 // Order is significant: Must record caller first.
239 caller()->record_debug_info(recorder, pc_offset, false/*topmost*/);
240 }
241 DebugToken* locvals = recorder->create_scope_values(locals());
242 DebugToken* expvals = recorder->create_scope_values(expressions());
243 DebugToken* monvals = recorder->create_monitor_values(monitors());
244 // reexecute allowed only for the topmost frame
245 bool reexecute = topmost ? should_reexecute() : false;
246 bool return_oop = false; // This flag will be ignored since it used only for C2 with escape analysis.
247 recorder->describe_scope(pc_offset, scope()->method(), bci(), reexecute, is_method_handle_invoke, return_oop, locvals, expvals, monvals);
248 }
249 };
250
251
252 class CodeEmitInfo: public CompilationResourceObj {
253 friend class LinearScan;
254 private:
255 IRScopeDebugInfo* _scope_debug_info;
256 IRScope* _scope;
257 XHandlers* _exception_handlers;
258 OopMap* _oop_map;
259 ValueStack* _stack; // used by deoptimization (contains also monitors
260 bool _is_method_handle_invoke; // true if the associated call site is a MethodHandle call site.
261 bool _deoptimize_on_exception;
262
263 FrameMap* frame_map() const { return scope()->compilation()->frame_map(); }
264 Compilation* compilation() const { return scope()->compilation(); }
265
266 public:
267
|
227 int bci() { return _bci; }
228 GrowableArray<ScopeValue*>* locals() { return _locals; }
229 GrowableArray<ScopeValue*>* expressions() { return _expressions; }
230 GrowableArray<MonitorValue*>* monitors() { return _monitors; }
231 IRScopeDebugInfo* caller() { return _caller; }
232
233 //Whether we should reexecute this bytecode for deopt
234 bool should_reexecute();
235
236 void record_debug_info(DebugInformationRecorder* recorder, int pc_offset, bool topmost, bool is_method_handle_invoke = false) {
237 if (caller() != NULL) {
238 // Order is significant: Must record caller first.
239 caller()->record_debug_info(recorder, pc_offset, false/*topmost*/);
240 }
241 DebugToken* locvals = recorder->create_scope_values(locals());
242 DebugToken* expvals = recorder->create_scope_values(expressions());
243 DebugToken* monvals = recorder->create_monitor_values(monitors());
244 // reexecute allowed only for the topmost frame
245 bool reexecute = topmost ? should_reexecute() : false;
246 bool return_oop = false; // This flag will be ignored since it used only for C2 with escape analysis.
247 bool rethrow_exception = false;
248 recorder->describe_scope(pc_offset, methodHandle(), scope()->method(), bci(), reexecute, rethrow_exception, is_method_handle_invoke, return_oop, locvals, expvals, monvals);
249 }
250 };
251
252
253 class CodeEmitInfo: public CompilationResourceObj {
254 friend class LinearScan;
255 private:
256 IRScopeDebugInfo* _scope_debug_info;
257 IRScope* _scope;
258 XHandlers* _exception_handlers;
259 OopMap* _oop_map;
260 ValueStack* _stack; // used by deoptimization (contains also monitors
261 bool _is_method_handle_invoke; // true if the associated call site is a MethodHandle call site.
262 bool _deoptimize_on_exception;
263
264 FrameMap* frame_map() const { return scope()->compilation()->frame_map(); }
265 Compilation* compilation() const { return scope()->compilation(); }
266
267 public:
268
|