mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
6939134: JSR 292 adjustments to method handle invocation
Split MethodHandle.invoke into invokeExact and invokeGeneric; also clean up JVM-to-Java interfaces Reviewed-by: twisti
This commit is contained in:
parent
0211f9703a
commit
4eb75c2df3
29 changed files with 413 additions and 233 deletions
|
@ -138,6 +138,15 @@ void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHand
|
|||
|
||||
void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
|
||||
methodOop result_oop = klass->uncached_lookup_method(name(), signature());
|
||||
if (EnableMethodHandles && result_oop != NULL) {
|
||||
switch (result_oop->intrinsic_id()) {
|
||||
case vmIntrinsics::_invokeExact:
|
||||
case vmIntrinsics::_invokeGeneric:
|
||||
case vmIntrinsics::_invokeDynamic:
|
||||
// Do not link directly to these. The VM must produce a synthetic one using lookup_implicit_method.
|
||||
return;
|
||||
}
|
||||
}
|
||||
result = methodHandle(THREAD, result_oop);
|
||||
}
|
||||
|
||||
|
@ -165,8 +174,10 @@ void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle
|
|||
|
||||
void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
|
||||
if (EnableMethodHandles && MethodHandles::enabled() &&
|
||||
name == vmSymbolHandles::invoke_name() && klass() == SystemDictionary::MethodHandle_klass()) {
|
||||
methodOop result_oop = SystemDictionary::find_method_handle_invoke(signature,
|
||||
klass() == SystemDictionary::MethodHandle_klass() &&
|
||||
methodOopDesc::is_method_handle_invoke_name(name())) {
|
||||
methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
|
||||
signature,
|
||||
Handle(),
|
||||
Handle(),
|
||||
CHECK);
|
||||
|
@ -239,7 +250,7 @@ void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHa
|
|||
// The class is java.dyn.MethodHandle
|
||||
resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
|
||||
|
||||
symbolHandle method_name = vmSymbolHandles::invoke_name();
|
||||
symbolHandle method_name = vmSymbolHandles::invokeExact_name();
|
||||
|
||||
symbolHandle method_signature(THREAD, pool->signature_ref_at(index));
|
||||
KlassHandle current_klass (THREAD, pool->pool_holder());
|
||||
|
@ -1041,10 +1052,10 @@ void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle po
|
|||
|
||||
// At this point, we only need the signature, and can ignore the name.
|
||||
symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index)); // raw_index works directly
|
||||
symbolHandle method_name = vmSymbolHandles::invoke_name();
|
||||
symbolHandle method_name = vmSymbolHandles::invokeExact_name();
|
||||
KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
|
||||
|
||||
// JSR 292: this must be an implicitly generated method MethodHandle.invoke(*...)
|
||||
// JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...)
|
||||
// The extra MH receiver will be inserted into the stack on every call.
|
||||
methodHandle resolved_method;
|
||||
lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue