Fri, 19 Jul 2013 14:43:45 -0700
8012263: ciReplay: gracefully exit & report meaningful error when replay data parsing fails
Summary: find_method could return NULL so need explicitly check if there is error after parse_method, exit on error to avoid crash.
Reviewed-by: kvn, twisti
Contributed-by: yumin.qi@oracle.com
src/share/vm/ci/ciReplay.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/ci/ciReplay.cpp Fri Jul 19 17:56:27 2013 +0200 1.2 +++ b/src/share/vm/ci/ciReplay.cpp Fri Jul 19 14:43:45 2013 -0700 1.3 @@ -299,7 +299,7 @@ 1.4 Symbol* method_signature = parse_symbol(CHECK_NULL); 1.5 Method* m = k->find_method(method_name, method_signature); 1.6 if (m == NULL) { 1.7 - report_error("can't find method"); 1.8 + report_error("Can't find method"); 1.9 } 1.10 return m; 1.11 } 1.12 @@ -398,8 +398,8 @@ 1.13 1.14 // compile <klass> <name> <signature> <entry_bci> <comp_level> 1.15 void process_compile(TRAPS) { 1.16 - // methodHandle method; 1.17 Method* method = parse_method(CHECK); 1.18 + if (had_error()) return; 1.19 int entry_bci = parse_int("entry_bci"); 1.20 const char* comp_level_label = "comp_level"; 1.21 int comp_level = parse_int(comp_level_label); 1.22 @@ -440,6 +440,7 @@ 1.23 // 1.24 void process_ciMethod(TRAPS) { 1.25 Method* method = parse_method(CHECK); 1.26 + if (had_error()) return; 1.27 ciMethodRecord* rec = new_ciMethod(method); 1.28 rec->invocation_counter = parse_int("invocation_counter"); 1.29 rec->backedge_counter = parse_int("backedge_counter"); 1.30 @@ -451,6 +452,7 @@ 1.31 // ciMethodData <klass> <name> <signature> <state> <current mileage> orig <length> # # ... data <length> # # ... oops <length> 1.32 void process_ciMethodData(TRAPS) { 1.33 Method* method = parse_method(CHECK); 1.34 + if (had_error()) return; 1.35 /* jsut copied from Method, to build interpret data*/ 1.36 if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { 1.37 return;