< prev index next >
src/share/vm/ci/ciObjectFactory.cpp
Print this page
rev 12906 : [mq]: gc_interface
*** 45,57 ****
#include "gc/shared/collectedHeap.inline.hpp"
#include "memory/allocation.inline.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/fieldType.hpp"
#include "utilities/macros.hpp"
- #if INCLUDE_ALL_GCS
- # include "gc/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
--- 45,54 ----
*** 177,187 ****
}
}
ciEnv::_unloaded_cisymbol = ciObjectFactory::get_symbol(vmSymbols::dummy_symbol());
// Create dummy InstanceKlass and ObjArrayKlass object and assign them idents
! ciEnv::_unloaded_ciinstance_klass = new (_arena) ciInstanceKlass(ciEnv::_unloaded_cisymbol, NULL, NULL);
init_ident_of(ciEnv::_unloaded_ciinstance_klass);
ciEnv::_unloaded_ciobjarrayklass = new (_arena) ciObjArrayKlass(ciEnv::_unloaded_cisymbol, ciEnv::_unloaded_ciinstance_klass, 1);
init_ident_of(ciEnv::_unloaded_ciobjarrayklass);
assert(ciEnv::_unloaded_ciobjarrayklass->is_obj_array_klass(), "just checking");
--- 174,184 ----
}
}
ciEnv::_unloaded_cisymbol = ciObjectFactory::get_symbol(vmSymbols::dummy_symbol());
// Create dummy InstanceKlass and ObjArrayKlass object and assign them idents
! ciEnv::_unloaded_ciinstance_klass = new (_arena) ciInstanceKlass(ciEnv::_unloaded_cisymbol, NULL, NULL, NULL);
init_ident_of(ciEnv::_unloaded_ciinstance_klass);
ciEnv::_unloaded_ciobjarrayklass = new (_arena) ciObjArrayKlass(ciEnv::_unloaded_cisymbol, ciEnv::_unloaded_ciinstance_klass, 1);
init_ident_of(ciEnv::_unloaded_ciobjarrayklass);
assert(ciEnv::_unloaded_ciobjarrayklass->is_obj_array_klass(), "just checking");
*** 361,383 ****
// Implementation note: in order to keep Metadata live, an auxiliary ciObject
// is used, which points to it's holder.
ciMetadata* ciObjectFactory::create_new_metadata(Metadata* o) {
EXCEPTION_CONTEXT;
- // Hold metadata from unloading by keeping it's holder alive.
- if (_initialized && o->is_klass()) {
- Klass* holder = ((Klass*)o);
- if (holder->is_instance_klass() && InstanceKlass::cast(holder)->is_anonymous()) {
- // Though ciInstanceKlass records class loader oop, it's not enough to keep
- // VM anonymous classes alive (loader == NULL). Klass holder should be used instead.
- // It is enough to record a ciObject, since cached elements are never removed
- // during ciObjectFactory lifetime. ciObjectFactory itself is created for
- // every compilation and lives for the whole duration of the compilation.
- ciObject* h = get(holder->klass_holder());
- }
- }
-
if (o->is_klass()) {
Klass* k = (Klass*)o;
if (k->is_instance_klass()) {
return new (arena()) ciInstanceKlass(k);
} else if (k->is_objArray_klass()) {
--- 358,367 ----
*** 399,439 ****
// The Metadata* 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");
- return;
- }
-
- 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.
--- 383,392 ----
*** 540,556 ****
// The element klass is a TypeArrayKlass.
element_klass = ciTypeArrayKlass::make(element_type);
}
new_klass = new (arena()) ciObjArrayKlass(name, element_klass, dimension);
} else {
jobject loader_handle = NULL;
jobject domain_handle = NULL;
if (accessing_klass != NULL) {
loader_handle = accessing_klass->loader_handle();
domain_handle = accessing_klass->protection_domain_handle();
}
! new_klass = new (arena()) ciInstanceKlass(name, loader_handle, domain_handle);
}
init_ident_of(new_klass);
_unloaded_klasses->append(new_klass);
return new_klass;
--- 493,511 ----
// The element klass is a TypeArrayKlass.
element_klass = ciTypeArrayKlass::make(element_type);
}
new_klass = new (arena()) ciObjArrayKlass(name, element_klass, dimension);
} else {
+ jobject holder_handle = NULL;
jobject loader_handle = NULL;
jobject domain_handle = NULL;
if (accessing_klass != NULL) {
+ holder_handle = accessing_klass->holder_handle();
loader_handle = accessing_klass->loader_handle();
domain_handle = accessing_klass->protection_domain_handle();
}
! new_klass = new (arena()) ciInstanceKlass(name, holder_handle, loader_handle, domain_handle);
}
init_ident_of(new_klass);
_unloaded_klasses->append(new_klass);
return new_klass;
< prev index next >