222 int bci, 223 GrowableArray<ScopeValue*>* locals, 224 GrowableArray<ScopeValue*>* expressions, 225 GrowableArray<MonitorValue*>* monitors, 226 IRScopeDebugInfo* caller): 227 _scope(scope) 228 , _locals(locals) 229 , _bci(bci) 230 , _expressions(expressions) 231 , _monitors(monitors) 232 , _caller(caller) {} 233 234 235 IRScope* scope() { return _scope; } 236 int bci() { return _bci; } 237 GrowableArray<ScopeValue*>* locals() { return _locals; } 238 GrowableArray<ScopeValue*>* expressions() { return _expressions; } 239 GrowableArray<MonitorValue*>* monitors() { return _monitors; } 240 IRScopeDebugInfo* caller() { return _caller; } 241 242 void record_debug_info(DebugInformationRecorder* recorder, int pc_offset) { 243 if (caller() != NULL) { 244 // Order is significant: Must record caller first. 245 caller()->record_debug_info(recorder, pc_offset); 246 } 247 DebugToken* locvals = recorder->create_scope_values(locals()); 248 DebugToken* expvals = recorder->create_scope_values(expressions()); 249 DebugToken* monvals = recorder->create_monitor_values(monitors()); 250 recorder->describe_scope(pc_offset, scope()->method(), bci(), locvals, expvals, monvals); 251 } 252 }; 253 254 255 class CodeEmitInfo: public CompilationResourceObj { 256 friend class LinearScan; 257 private: 258 IRScopeDebugInfo* _scope_debug_info; 259 IRScope* _scope; 260 XHandlers* _exception_handlers; 261 OopMap* _oop_map; 262 ValueStack* _stack; // used by deoptimization (contains also monitors 263 int _bci; 264 CodeEmitInfo* _next; 265 int _id; 266 267 FrameMap* frame_map() const { return scope()->compilation()->frame_map(); } 268 Compilation* compilation() const { return scope()->compilation(); } 269 270 public: | 222 int bci, 223 GrowableArray<ScopeValue*>* locals, 224 GrowableArray<ScopeValue*>* expressions, 225 GrowableArray<MonitorValue*>* monitors, 226 IRScopeDebugInfo* caller): 227 _scope(scope) 228 , _locals(locals) 229 , _bci(bci) 230 , _expressions(expressions) 231 , _monitors(monitors) 232 , _caller(caller) {} 233 234 235 IRScope* scope() { return _scope; } 236 int bci() { return _bci; } 237 GrowableArray<ScopeValue*>* locals() { return _locals; } 238 GrowableArray<ScopeValue*>* expressions() { return _expressions; } 239 GrowableArray<MonitorValue*>* monitors() { return _monitors; } 240 IRScopeDebugInfo* caller() { return _caller; } 241 242 //Whether we should reexecute this bytecode for deopt 243 bool should_reexecute(); 244 245 void record_debug_info(DebugInformationRecorder* recorder, int pc_offset, bool topmost) { 246 if (caller() != NULL) { 247 // Order is significant: Must record caller first. 248 caller()->record_debug_info(recorder, pc_offset, false/*topmost*/); 249 } 250 DebugToken* locvals = recorder->create_scope_values(locals()); 251 DebugToken* expvals = recorder->create_scope_values(expressions()); 252 DebugToken* monvals = recorder->create_monitor_values(monitors()); 253 // reexecute allowed only for the topmost frame 254 bool reexecute = topmost ? should_reexecute() : false; 255 recorder->describe_scope(pc_offset, scope()->method(), bci(), reexecute, locvals, expvals, monvals); 256 } 257 }; 258 259 260 class CodeEmitInfo: public CompilationResourceObj { 261 friend class LinearScan; 262 private: 263 IRScopeDebugInfo* _scope_debug_info; 264 IRScope* _scope; 265 XHandlers* _exception_handlers; 266 OopMap* _oop_map; 267 ValueStack* _stack; // used by deoptimization (contains also monitors 268 int _bci; 269 CodeEmitInfo* _next; 270 int _id; 271 272 FrameMap* frame_map() const { return scope()->compilation()->frame_map(); } 273 Compilation* compilation() const { return scope()->compilation(); } 274 275 public: |