--- a/hotspot/src/share/vm/ci/ciEnv.cpp Mon Jun 07 14:17:01 2010 -0700
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp Wed Jun 09 18:50:45 2010 -0700
@@ -511,9 +511,22 @@
//
// Implementation of get_constant_by_index().
ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool,
- int index,
+ int pool_index, int cache_index,
ciInstanceKlass* accessor) {
+ bool ignore_will_link;
EXCEPTION_CONTEXT;
+ int index = pool_index;
+ if (cache_index >= 0) {
+ assert(index < 0, "only one kind of index at a time");
+ ConstantPoolCacheEntry* cpc_entry = cpool->cache()->entry_at(cache_index);
+ index = cpc_entry->constant_pool_index();
+ oop obj = cpc_entry->f1();
+ if (obj != NULL) {
+ assert(obj->is_instance(), "must be an instance");
+ ciObject* ciobj = get_object(obj);
+ return ciConstant(T_OBJECT, ciobj);
+ }
+ }
constantTag tag = cpool->tag_at(index);
if (tag.is_int()) {
return ciConstant(T_INT, (jint)cpool->int_at(index));
@@ -540,8 +553,7 @@
return ciConstant(T_OBJECT, constant);
} else if (tag.is_klass() || tag.is_unresolved_klass()) {
// 4881222: allow ldc to take a class type
- bool ignore;
- ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore, accessor);
+ ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore_will_link, accessor);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
record_out_of_memory_failure();
@@ -549,12 +561,26 @@
}
assert (klass->is_instance_klass() || klass->is_array_klass(),
"must be an instance or array klass ");
- return ciConstant(T_OBJECT, klass);
+ return ciConstant(T_OBJECT, klass->java_mirror());
} else if (tag.is_object()) {
oop obj = cpool->object_at(index);
assert(obj->is_instance(), "must be an instance");
ciObject* ciobj = get_object(obj);
return ciConstant(T_OBJECT, ciobj);
+ } else if (tag.is_method_type()) {
+ // must execute Java code to link this CP entry into cache[i].f1
+ ciSymbol* signature = get_object(cpool->method_type_signature_at(index))->as_symbol();
+ ciObject* ciobj = get_unloaded_method_type_constant(signature);
+ return ciConstant(T_OBJECT, ciobj);
+ } else if (tag.is_method_handle()) {
+ // must execute Java code to link this CP entry into cache[i].f1
+ int ref_kind = cpool->method_handle_ref_kind_at(index);
+ int callee_index = cpool->method_handle_klass_index_at(index);
+ ciKlass* callee = get_klass_by_index_impl(cpool, callee_index, ignore_will_link, accessor);
+ ciSymbol* name = get_object(cpool->method_handle_name_ref_at(index))->as_symbol();
+ ciSymbol* signature = get_object(cpool->method_handle_signature_ref_at(index))->as_symbol();
+ ciObject* ciobj = get_unloaded_method_handle_constant(callee, name, signature, ref_kind);
+ return ciConstant(T_OBJECT, ciobj);
} else {
ShouldNotReachHere();
return ciConstant();
@@ -562,61 +588,15 @@
}
// ------------------------------------------------------------------
-// ciEnv::is_unresolved_string_impl
-//
-// Implementation of is_unresolved_string().
-bool ciEnv::is_unresolved_string_impl(instanceKlass* accessor, int index) const {
- EXCEPTION_CONTEXT;
- assert(accessor->is_linked(), "must be linked before accessing constant pool");
- constantPoolOop cpool = accessor->constants();
- constantTag tag = cpool->tag_at(index);
- return tag.is_unresolved_string();
-}
-
-// ------------------------------------------------------------------
-// ciEnv::is_unresolved_klass_impl
-//
-// Implementation of is_unresolved_klass().
-bool ciEnv::is_unresolved_klass_impl(instanceKlass* accessor, int index) const {
- EXCEPTION_CONTEXT;
- assert(accessor->is_linked(), "must be linked before accessing constant pool");
- constantPoolOop cpool = accessor->constants();
- constantTag tag = cpool->tag_at(index);
- return tag.is_unresolved_klass();
-}
-
-// ------------------------------------------------------------------
// ciEnv::get_constant_by_index
//
// Pull a constant out of the constant pool. How appropriate.
//
// Implementation note: this query is currently in no way cached.
ciConstant ciEnv::get_constant_by_index(constantPoolHandle cpool,
- int index,
+ int pool_index, int cache_index,
ciInstanceKlass* accessor) {
- GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, index, accessor);)
-}
-
-// ------------------------------------------------------------------
-// ciEnv::is_unresolved_string
-//
-// Check constant pool
-//
-// Implementation note: this query is currently in no way cached.
-bool ciEnv::is_unresolved_string(ciInstanceKlass* accessor,
- int index) const {
- GUARDED_VM_ENTRY(return is_unresolved_string_impl(accessor->get_instanceKlass(), index); )
-}
-
-// ------------------------------------------------------------------
-// ciEnv::is_unresolved_klass
-//
-// Check constant pool
-//
-// Implementation note: this query is currently in no way cached.
-bool ciEnv::is_unresolved_klass(ciInstanceKlass* accessor,
- int index) const {
- GUARDED_VM_ENTRY(return is_unresolved_klass_impl(accessor->get_instanceKlass(), index); )
+ GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, pool_index, cache_index, accessor);)
}
// ------------------------------------------------------------------