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 {