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. //