Mercurial > hg > graal-jvmci-8
comparison src/share/vm/ci/ciEnv.cpp @ 1137:97125851f396
6829187: compiler optimizations required for JSR 292
Summary: C2 implementation for invokedynamic support.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Tue, 05 Jan 2010 13:05:58 +0100 |
parents | 7c57aead6d3e |
children | dd57230ba8fe |
comparison
equal
deleted
inserted
replaced
1136:4b84186a8248 | 1137:97125851f396 |
---|---|
39 ciObjArrayKlassKlass* ciEnv::_obj_array_klass_klass_instance; | 39 ciObjArrayKlassKlass* ciEnv::_obj_array_klass_klass_instance; |
40 | 40 |
41 ciInstanceKlass* ciEnv::_ArrayStoreException; | 41 ciInstanceKlass* ciEnv::_ArrayStoreException; |
42 ciInstanceKlass* ciEnv::_Class; | 42 ciInstanceKlass* ciEnv::_Class; |
43 ciInstanceKlass* ciEnv::_ClassCastException; | 43 ciInstanceKlass* ciEnv::_ClassCastException; |
44 ciInstanceKlass* ciEnv::_InvokeDynamic; | |
44 ciInstanceKlass* ciEnv::_Object; | 45 ciInstanceKlass* ciEnv::_Object; |
45 ciInstanceKlass* ciEnv::_Throwable; | 46 ciInstanceKlass* ciEnv::_Throwable; |
46 ciInstanceKlass* ciEnv::_Thread; | 47 ciInstanceKlass* ciEnv::_Thread; |
47 ciInstanceKlass* ciEnv::_OutOfMemoryError; | 48 ciInstanceKlass* ciEnv::_OutOfMemoryError; |
48 ciInstanceKlass* ciEnv::_String; | 49 ciInstanceKlass* ciEnv::_String; |
734 get_object(sig_sym)->as_symbol()); | 735 get_object(sig_sym)->as_symbol()); |
735 } | 736 } |
736 | 737 |
737 | 738 |
738 // ------------------------------------------------------------------ | 739 // ------------------------------------------------------------------ |
740 // ciEnv::get_fake_invokedynamic_method_impl | |
741 ciMethod* ciEnv::get_fake_invokedynamic_method_impl(ciInstanceKlass* accessor, | |
742 int index, Bytecodes::Code bc) { | |
743 assert(bc == Bytecodes::_invokedynamic, "must be invokedynamic"); | |
744 assert(accessor->get_instanceKlass()->is_linked(), "must be linked before accessing constant pool"); | |
745 constantPoolHandle cpool = accessor->get_instanceKlass()->constants(); | |
746 | |
747 // Get the CallSite from the constant pool cache. | |
748 ConstantPoolCacheEntry* cpc_entry = cpool->cache()->secondary_entry_at(index); | |
749 assert(cpc_entry != NULL && cpc_entry->is_secondary_entry(), "sanity"); | |
750 Handle call_site = cpc_entry->f1(); | |
751 | |
752 // Call site might not be linked yet. | |
753 if (call_site.is_null()) { | |
754 ciInstanceKlass* mh_klass = get_object(SystemDictionary::MethodHandle_klass())->as_instance_klass(); | |
755 ciSymbol* sig_sym = get_object(cpool->signature_ref_at(index))->as_symbol(); | |
756 return get_unloaded_method(mh_klass, ciSymbol::invoke_name(), sig_sym); | |
757 } | |
758 | |
759 // Get the methodOop from the CallSite. | |
760 methodOop method_oop = (methodOop) java_dyn_CallSite::vmmethod(call_site()); | |
761 assert(method_oop != NULL, "sanity"); | |
762 assert(method_oop->is_method_handle_invoke(), "consistent"); | |
763 | |
764 return get_object(method_oop)->as_method(); | |
765 } | |
766 | |
767 | |
768 // ------------------------------------------------------------------ | |
739 // ciEnv::get_instance_klass_for_declared_method_holder | 769 // ciEnv::get_instance_klass_for_declared_method_holder |
740 ciInstanceKlass* ciEnv::get_instance_klass_for_declared_method_holder(ciKlass* method_holder) { | 770 ciInstanceKlass* ciEnv::get_instance_klass_for_declared_method_holder(ciKlass* method_holder) { |
741 // For the case of <array>.clone(), the method holder can be a ciArrayKlass | 771 // For the case of <array>.clone(), the method holder can be a ciArrayKlass |
742 // instead of a ciInstanceKlass. For that case simply pretend that the | 772 // instead of a ciInstanceKlass. For that case simply pretend that the |
743 // declared holder is Object.clone since that's where the call will bottom out. | 773 // declared holder is Object.clone since that's where the call will bottom out. |
755 } | 785 } |
756 return NULL; | 786 return NULL; |
757 } | 787 } |
758 | 788 |
759 | 789 |
760 | |
761 | |
762 // ------------------------------------------------------------------ | 790 // ------------------------------------------------------------------ |
763 // ciEnv::get_method_by_index | 791 // ciEnv::get_method_by_index |
764 ciMethod* ciEnv::get_method_by_index(ciInstanceKlass* accessor, | 792 ciMethod* ciEnv::get_method_by_index(ciInstanceKlass* accessor, |
765 int index, Bytecodes::Code bc) { | 793 int index, Bytecodes::Code bc) { |
766 GUARDED_VM_ENTRY(return get_method_by_index_impl(accessor, index, bc);) | 794 if (bc == Bytecodes::_invokedynamic) { |
767 } | 795 GUARDED_VM_ENTRY(return get_fake_invokedynamic_method_impl(accessor, index, bc);) |
796 } else { | |
797 GUARDED_VM_ENTRY(return get_method_by_index_impl(accessor, index, bc);) | |
798 } | |
799 } | |
800 | |
768 | 801 |
769 // ------------------------------------------------------------------ | 802 // ------------------------------------------------------------------ |
770 // ciEnv::name_buffer | 803 // ciEnv::name_buffer |
771 char *ciEnv::name_buffer(int req_len) { | 804 char *ciEnv::name_buffer(int req_len) { |
772 if (_name_buffer_len < req_len) { | 805 if (_name_buffer_len < req_len) { |