Mercurial > hg > truffle
comparison src/share/vm/c1/c1_IR.hpp @ 900:9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
Summary: developed a reexecute logic for the interpreter to reexecute the bytecode when deopt happens
Reviewed-by: kvn, never, jrose, twisti
author | cfang |
---|---|
date | Fri, 31 Jul 2009 17:12:33 -0700 |
parents | a61af66fc99e |
children | 89e0543e1737 |
comparison
equal
deleted
inserted
replaced
899:55cb84cd1247 | 900:9987d9d5eb0e |
---|---|
237 GrowableArray<ScopeValue*>* locals() { return _locals; } | 237 GrowableArray<ScopeValue*>* locals() { return _locals; } |
238 GrowableArray<ScopeValue*>* expressions() { return _expressions; } | 238 GrowableArray<ScopeValue*>* expressions() { return _expressions; } |
239 GrowableArray<MonitorValue*>* monitors() { return _monitors; } | 239 GrowableArray<MonitorValue*>* monitors() { return _monitors; } |
240 IRScopeDebugInfo* caller() { return _caller; } | 240 IRScopeDebugInfo* caller() { return _caller; } |
241 | 241 |
242 void record_debug_info(DebugInformationRecorder* recorder, int pc_offset) { | 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) { | |
243 if (caller() != NULL) { | 246 if (caller() != NULL) { |
244 // Order is significant: Must record caller first. | 247 // Order is significant: Must record caller first. |
245 caller()->record_debug_info(recorder, pc_offset); | 248 caller()->record_debug_info(recorder, pc_offset, false/*topmost*/); |
246 } | 249 } |
247 DebugToken* locvals = recorder->create_scope_values(locals()); | 250 DebugToken* locvals = recorder->create_scope_values(locals()); |
248 DebugToken* expvals = recorder->create_scope_values(expressions()); | 251 DebugToken* expvals = recorder->create_scope_values(expressions()); |
249 DebugToken* monvals = recorder->create_monitor_values(monitors()); | 252 DebugToken* monvals = recorder->create_monitor_values(monitors()); |
250 recorder->describe_scope(pc_offset, scope()->method(), bci(), locvals, expvals, monvals); | 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); | |
251 } | 256 } |
252 }; | 257 }; |
253 | 258 |
254 | 259 |
255 class CodeEmitInfo: public CompilationResourceObj { | 260 class CodeEmitInfo: public CompilationResourceObj { |