mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-22 03:54:33 +02:00
6939203: JSR 292 needs method handle constants
Add new CP types CONSTANT_MethodHandle, CONSTANT_MethodType; extend 'ldc' bytecode. Reviewed-by: twisti, never
This commit is contained in:
parent
154ae789ef
commit
1f4cfb029b
60 changed files with 1549 additions and 378 deletions
|
@ -511,9 +511,22 @@ ciKlass* ciEnv::get_klass_by_index(constantPoolHandle cpool,
|
|||
//
|
||||
// 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 @@ ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool,
|
|||
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,42 +561,32 @@ ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool,
|
|||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 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
|
||||
//
|
||||
|
@ -592,31 +594,9 @@ bool ciEnv::is_unresolved_klass_impl(instanceKlass* accessor, int index) const {
|
|||
//
|
||||
// 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);)
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue