< prev index next > src/hotspot/share/ci/ciObjectFactory.cpp
Print this page
}
ciEnv::_null_object_instance = new (_arena) ciNullObject();
init_ident_of(ciEnv::_null_object_instance);
- #define VM_CLASS_DEFN(name, ignore_s) \
- if (vmClasses::name##_is_loaded()) \
- ciEnv::_##name = get_metadata(vmClasses::name())->as_instance_klass();
-
+ #define VM_CLASS_DEFN(name, ignore_s) \
+ if (vmClasses::name##_is_loaded()) { \
+ ciEnv::_##name = get_metadata(vmClasses::name())->as_instance_klass(); \
+ }
VM_CLASSES_DO(VM_CLASS_DEFN)
#undef VM_CLASS_DEFN
for (int len = -1; len != _ci_metadata.length(); ) {
len = _ci_metadata.length();
Handle keyHandle(Thread::current(), key);
assert(Universe::heap()->is_in(keyHandle()), "must be");
NonPermObject* &bucket = find_non_perm(keyHandle);
if (bucket != nullptr) {
- return bucket->object();
+ ciObject* obj = bucket->object();
+ notice_object_access(obj);
+ return obj;
}
// The ciObject does not yet exist. Create it and insert it
// into the cache.
ciObject* new_object = create_new_object(keyHandle());
init_ident_of(new_object);
assert(Universe::heap()->is_in(new_object->get_oop()), "must be");
// Not a perm-space object.
insert_non_perm(bucket, keyHandle, new_object);
- notice_new_object(new_object);
+ notice_object_access(new_object);
return new_object;
}
- void ciObjectFactory::notice_new_object(ciBaseObject* new_object) {
+ #if INCLUDE_CDS
+ void ciObjectFactory::notice_object_access(ciBaseObject* new_object) {
if (TrainingData::need_data()) {
ciEnv* env = ciEnv::current();
if (env->task() != nullptr) {
// Note: task will be null during init_compiler_runtime.
CompileTrainingData* td = env->task()->training_data();
td->notice_jit_observation(env, new_object);
}
}
}
}
+ #endif
int ciObjectFactory::metadata_compare(Metadata* const& key, ciMetadata* const& elt) {
Metadata* value = elt->constant_encoding();
if (key < value) return -1;
else if (key > value) return 1;
// into the table. We need to recompute our index.
index = _ci_metadata.find_sorted<Metadata*, ciObjectFactory::metadata_compare>(key, found);
}
assert(!found, "no double insert");
_ci_metadata.insert_before(index, new_object);
- notice_new_object(new_object);
+ notice_object_access(new_object);
return new_object;
}
- return _ci_metadata.at(index)->as_metadata();
+ ciMetadata* metadata = _ci_metadata.at(index)->as_metadata();
+ notice_object_access(metadata);
+ return metadata;
}
// ------------------------------------------------------------------
// ciObjectFactory::create_new_object
//
methodHandle h_m(THREAD, (Method*)o);
ciEnv *env = CURRENT_THREAD_ENV;
ciInstanceKlass* holder = env->get_instance_klass(h_m()->method_holder());
return new (arena()) ciMethod(h_m, holder);
} else if (o->is_methodData()) {
- // Hold methodHandle alive - might not be necessary ???
- methodHandle h_m(THREAD, ((MethodData*)o)->method());
+ // Callers ciMethod::ensure_method_data() and ::method_data() have MH already.
return new (arena()) ciMethodData((MethodData*)o);
+ } else if (o->is_methodCounters()) {
+ // Caller ciMethod::ensure_method_counters() has MH already.
+ return new (arena()) ciMetadata(o);
}
// The Metadata* is of some type not supported by the compiler interface.
ShouldNotReachHere();
return nullptr;
< prev index next >