6964498: JSR 292 invokedynamic sites need local bootstrap methods

Add JVM_CONSTANT_InvokeDynamic records to constant pool to determine per-instruction BSMs.

Reviewed-by: twisti
This commit is contained in:
John R Rose 2010-07-15 18:40:45 -07:00
parent ea25541820
commit a4e4149340
25 changed files with 340 additions and 46 deletions

View file

@ -67,6 +67,15 @@ void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klas
set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
}
void CallInfo::set_dynamic(methodHandle resolved_method, TRAPS) {
assert(resolved_method->is_method_handle_invoke(), "");
KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
assert(resolved_klass == resolved_method->method_holder(), "");
int vtable_index = methodOopDesc::nonvirtual_vtable_index;
assert(resolved_method->vtable_index() == vtable_index, "");
set_common(resolved_klass, KlassHandle(), resolved_method, resolved_method, vtable_index, CHECK);
}
void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
_resolved_klass = resolved_klass;
@ -176,9 +185,20 @@ void LinkResolver::lookup_implicit_method(methodHandle& result,
KlassHandle klass, symbolHandle name, symbolHandle signature,
KlassHandle current_klass,
TRAPS) {
if (EnableMethodHandles && MethodHandles::enabled() &&
if (EnableMethodHandles &&
klass() == SystemDictionary::MethodHandle_klass() &&
methodOopDesc::is_method_handle_invoke_name(name())) {
if (!MethodHandles::enabled()) {
// Make sure the Java part of the runtime has been booted up.
klassOop natives = SystemDictionary::MethodHandleNatives_klass();
if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
SystemDictionary::resolve_or_fail(vmSymbolHandles::sun_dyn_MethodHandleNatives(),
Handle(),
Handle(),
true,
CHECK);
}
}
methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
signature,
current_klass,
@ -1065,7 +1085,7 @@ void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle po
if (resolved_method.is_null()) {
THROW(vmSymbols::java_lang_InternalError());
}
result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
result.set_dynamic(resolved_method, CHECK);
}
//------------------------------------------------------------------------------------------------------------------------