Mercurial > hg > truffle
comparison src/share/vm/runtime/frame.cpp @ 989:148e5441d916
6863023: need non-perm oops in code cache for JSR 292
Summary: Make a special root-list for those few nmethods which might contain non-perm oops.
Reviewed-by: twisti, kvn, never, jmasa, ysr
author | jrose |
---|---|
date | Tue, 15 Sep 2009 21:53:47 -0700 |
parents | 98cb887364d3 |
children | 547f81740344 dd57230ba8fe |
comparison
equal
deleted
inserted
replaced
987:00977607da34 | 989:148e5441d916 |
---|---|
1041 void frame::oops_interpreted_arguments_do(symbolHandle signature, bool is_static, OopClosure* f) { | 1041 void frame::oops_interpreted_arguments_do(symbolHandle signature, bool is_static, OopClosure* f) { |
1042 InterpretedArgumentOopFinder finder(signature, is_static, this, f); | 1042 InterpretedArgumentOopFinder finder(signature, is_static, this, f); |
1043 finder.oops_do(); | 1043 finder.oops_do(); |
1044 } | 1044 } |
1045 | 1045 |
1046 void frame::oops_code_blob_do(OopClosure* f, const RegisterMap* reg_map) { | 1046 void frame::oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* reg_map) { |
1047 assert(_cb != NULL, "sanity check"); | 1047 assert(_cb != NULL, "sanity check"); |
1048 if (_cb->oop_maps() != NULL) { | 1048 if (_cb->oop_maps() != NULL) { |
1049 OopMapSet::oops_do(this, reg_map, f); | 1049 OopMapSet::oops_do(this, reg_map, f); |
1050 | 1050 |
1051 // Preserve potential arguments for a callee. We handle this by dispatching | 1051 // Preserve potential arguments for a callee. We handle this by dispatching |
1056 } | 1056 } |
1057 // In cases where perm gen is collected, GC will want to mark | 1057 // In cases where perm gen is collected, GC will want to mark |
1058 // oops referenced from nmethods active on thread stacks so as to | 1058 // oops referenced from nmethods active on thread stacks so as to |
1059 // prevent them from being collected. However, this visit should be | 1059 // prevent them from being collected. However, this visit should be |
1060 // restricted to certain phases of the collection only. The | 1060 // restricted to certain phases of the collection only. The |
1061 // closure answers whether it wants nmethods to be traced. | 1061 // closure decides how it wants nmethods to be traced. |
1062 // (All CodeBlob subtypes other than NMethod currently have | 1062 if (cf != NULL) |
1063 // an empty oops_do() method. | 1063 cf->do_code_blob(_cb); |
1064 if (f->do_nmethods()) { | |
1065 _cb->oops_do(f); | |
1066 } | |
1067 } | |
1068 | |
1069 void frame::nmethods_code_blob_do() { | |
1070 assert(_cb != NULL, "sanity check"); | |
1071 | |
1072 // If we see an activation belonging to a non_entrant nmethod, we mark it. | |
1073 if (_cb->is_nmethod() && ((nmethod *)_cb)->is_not_entrant()) { | |
1074 ((nmethod*)_cb)->mark_as_seen_on_stack(); | |
1075 } | |
1076 } | 1064 } |
1077 | 1065 |
1078 class CompiledArgumentOopFinder: public SignatureInfo { | 1066 class CompiledArgumentOopFinder: public SignatureInfo { |
1079 protected: | 1067 protected: |
1080 OopClosure* _f; | 1068 OopClosure* _f; |
1199 // Traverse the Handle Block saved in the entry frame | 1187 // Traverse the Handle Block saved in the entry frame |
1200 entry_frame_call_wrapper()->oops_do(f); | 1188 entry_frame_call_wrapper()->oops_do(f); |
1201 } | 1189 } |
1202 | 1190 |
1203 | 1191 |
1204 void frame::oops_do_internal(OopClosure* f, RegisterMap* map, bool use_interpreter_oop_map_cache) { | 1192 void frame::oops_do_internal(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache) { |
1205 if (is_interpreted_frame()) { oops_interpreted_do(f, map, use_interpreter_oop_map_cache); | 1193 if (is_interpreted_frame()) { oops_interpreted_do(f, map, use_interpreter_oop_map_cache); |
1206 } else if (is_entry_frame()) { oops_entry_do (f, map); | 1194 } else if (is_entry_frame()) { oops_entry_do (f, map); |
1207 } else if (CodeCache::contains(pc())) { oops_code_blob_do (f, map); | 1195 } else if (CodeCache::contains(pc())) { oops_code_blob_do (f, cf, map); |
1208 } else { | 1196 } else { |
1209 ShouldNotReachHere(); | 1197 ShouldNotReachHere(); |
1210 } | 1198 } |
1211 } | 1199 } |
1212 | 1200 |
1213 void frame::nmethods_do() { | 1201 void frame::nmethods_do(CodeBlobClosure* cf) { |
1214 if (_cb != NULL && _cb->is_nmethod()) { | 1202 if (_cb != NULL && _cb->is_nmethod()) { |
1215 nmethods_code_blob_do(); | 1203 cf->do_code_blob(_cb); |
1216 } | 1204 } |
1217 } | 1205 } |
1218 | 1206 |
1219 | 1207 |
1220 void frame::gc_prologue() { | 1208 void frame::gc_prologue() { |
1356 oop* p = (oop*) interpreter_frame_local_at(0); | 1344 oop* p = (oop*) interpreter_frame_local_at(0); |
1357 // make sure we have the right receiver type | 1345 // make sure we have the right receiver type |
1358 } | 1346 } |
1359 } | 1347 } |
1360 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), "must be empty before verify");) | 1348 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), "must be empty before verify");) |
1361 oops_do_internal(&VerifyOopClosure::verify_oop, (RegisterMap*)map, false); | 1349 oops_do_internal(&VerifyOopClosure::verify_oop, NULL, (RegisterMap*)map, false); |
1362 } | 1350 } |
1363 | 1351 |
1364 | 1352 |
1365 #ifdef ASSERT | 1353 #ifdef ASSERT |
1366 bool frame::verify_return_pc(address x) { | 1354 bool frame::verify_return_pc(address x) { |