Mercurial > hg > truffle
comparison src/share/vm/ci/ciEnv.cpp @ 1507:cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
Summary: split MethodHandle.invoke into invokeExact and invokeGeneric; also clean up JVM-to-Java interfaces
Reviewed-by: twisti
author | jrose |
---|---|
date | Sat, 01 May 2010 02:42:18 -0700 |
parents | b4776199210f |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1506:2338d41fbd81 | 1507:cd5dbf694d45 |
---|---|
729 | 729 |
730 // ------------------------------------------------------------------ | 730 // ------------------------------------------------------------------ |
731 // ciEnv::get_fake_invokedynamic_method_impl | 731 // ciEnv::get_fake_invokedynamic_method_impl |
732 ciMethod* ciEnv::get_fake_invokedynamic_method_impl(constantPoolHandle cpool, | 732 ciMethod* ciEnv::get_fake_invokedynamic_method_impl(constantPoolHandle cpool, |
733 int index, Bytecodes::Code bc) { | 733 int index, Bytecodes::Code bc) { |
734 // Compare the following logic with InterpreterRuntime::resolve_invokedynamic. | |
734 assert(bc == Bytecodes::_invokedynamic, "must be invokedynamic"); | 735 assert(bc == Bytecodes::_invokedynamic, "must be invokedynamic"); |
735 | 736 |
736 // Get the CallSite from the constant pool cache. | 737 bool is_resolved = cpool->cache()->main_entry_at(index)->is_resolved(bc); |
737 ConstantPoolCacheEntry* cpc_entry = cpool->cache()->secondary_entry_at(index); | 738 if (is_resolved && (oop) cpool->cache()->secondary_entry_at(index)->f1() == NULL) |
738 assert(cpc_entry != NULL && cpc_entry->is_secondary_entry(), "sanity"); | 739 // FIXME: code generation could allow for null (unlinked) call site |
739 Handle call_site = cpc_entry->f1(); | 740 is_resolved = false; |
740 | 741 |
741 // Call site might not be linked yet. | 742 // Call site might not be resolved yet. We could create a real invoker method from the |
742 if (call_site.is_null()) { | 743 // compiler, but it is simpler to stop the code path here with an unlinked method. |
744 if (!is_resolved) { | |
743 ciInstanceKlass* mh_klass = get_object(SystemDictionary::MethodHandle_klass())->as_instance_klass(); | 745 ciInstanceKlass* mh_klass = get_object(SystemDictionary::MethodHandle_klass())->as_instance_klass(); |
744 ciSymbol* sig_sym = get_object(cpool->signature_ref_at(index))->as_symbol(); | 746 ciSymbol* sig_sym = get_object(cpool->signature_ref_at(index))->as_symbol(); |
745 return get_unloaded_method(mh_klass, ciSymbol::invoke_name(), sig_sym); | 747 return get_unloaded_method(mh_klass, ciSymbol::invokeExact_name(), sig_sym); |
746 } | 748 } |
747 | 749 |
748 // Get the methodOop from the CallSite. | 750 // Get the invoker methodOop from the constant pool. |
749 methodOop method_oop = (methodOop) java_dyn_CallSite::vmmethod(call_site()); | 751 intptr_t f2_value = cpool->cache()->main_entry_at(index)->f2(); |
750 assert(method_oop != NULL, "sanity"); | 752 methodOop signature_invoker = methodOop(f2_value); |
751 assert(method_oop->is_method_handle_invoke(), "consistent"); | 753 assert(signature_invoker != NULL && signature_invoker->is_method() && signature_invoker->is_method_handle_invoke(), |
752 | 754 "correct result from LinkResolver::resolve_invokedynamic"); |
753 return get_object(method_oop)->as_method(); | 755 |
756 return get_object(signature_invoker)->as_method(); | |
754 } | 757 } |
755 | 758 |
756 | 759 |
757 // ------------------------------------------------------------------ | 760 // ------------------------------------------------------------------ |
758 // ciEnv::get_instance_klass_for_declared_method_holder | 761 // ciEnv::get_instance_klass_for_declared_method_holder |