src/share/vm/ci/ciObjectFactory.cpp
Print this page
*** 44,53 ****
--- 44,56 ----
#include "gc_interface/collectedHeap.inline.hpp"
#include "memory/allocation.inline.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.inline2.hpp"
#include "runtime/fieldType.hpp"
+ #if INCLUDE_ALL_GCS
+ # include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
+ #endif
// ciObjectFactory
//
// This class handles requests for the creation of new instances
// of ciObject and its subclasses. It contains a caching mechanism
*** 372,381 ****
--- 375,415 ----
// The oop is of some type not supported by the compiler interface.
ShouldNotReachHere();
return NULL;
}
+ // ------------------------------------------------------------------
+ // ciObjectFactory::ensure_metadata_alive
+ //
+ // Ensure that the metadata wrapped by the ciMetadata is kept alive by GC.
+ // This is primarily useful for metadata which is considered as weak roots
+ // by the GC but need to be strong roots if reachable from a current compilation.
+ //
+ void ciObjectFactory::ensure_metadata_alive(ciMetadata* m) {
+ ASSERT_IN_VM; // We're handling raw oops here.
+
+ #if INCLUDE_ALL_GCS
+ if (!UseG1GC) {
+ return;
+ }
+ Klass* metadata_owner_klass;
+ if (m->is_klass()) {
+ metadata_owner_klass = m->as_klass()->get_Klass();
+ } else if (m->is_method()) {
+ metadata_owner_klass = m->as_method()->get_Method()->constants()->pool_holder();
+ } else {
+ fatal("Not implemented for other types of metadata");
+ }
+
+ oop metadata_holder = metadata_owner_klass->klass_holder();
+ if (metadata_holder != NULL) {
+ G1SATBCardTableModRefBS::enqueue(metadata_holder);
+ }
+
+ #endif
+ }
+
//------------------------------------------------------------------
// ciObjectFactory::get_unloaded_method
//
// Get the ciMethod representing an unloaded/unfound method.
//