75 return (oop)result.get_jobject(); |
75 return (oop)result.get_jobject(); |
76 } |
76 } |
77 return NULL; |
77 return NULL; |
78 } |
78 } |
79 |
79 |
80 oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) { |
80 oop CompilerToVM::get_jvmci_type(Klass* klass, TRAPS) { |
81 if (klass() != NULL) { |
81 if (klass != NULL) { |
82 JavaValue result(T_OBJECT); |
82 JavaValue result(T_OBJECT); |
83 JavaCallArguments args; |
83 JavaCallArguments args; |
84 args.push_oop(Handle(THREAD, klass->java_mirror())); |
84 args.push_oop(Handle(THREAD, klass->java_mirror())); |
85 JavaCalls::call_static(&result, SystemDictionary::HotSpotResolvedObjectTypeImpl_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::klass_fromMetaspace_signature(), &args, CHECK_NULL); |
85 JavaCalls::call_static(&result, SystemDictionary::HotSpotResolvedObjectTypeImpl_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::klass_fromMetaspace_signature(), &args, CHECK_NULL); |
86 |
86 |
676 JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL); |
676 JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL); |
677 return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject()); |
677 return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject()); |
678 } |
678 } |
679 |
679 |
680 C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed)) |
680 C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed)) |
681 KlassHandle klass; |
681 Klass* klass = NULL; |
682 oop base_object = JNIHandles::resolve(base); |
682 oop base_object = JNIHandles::resolve(base); |
683 jlong base_address = 0; |
683 jlong base_address = 0; |
684 if (base_object != NULL && offset == oopDesc::klass_offset_in_bytes()) { |
684 if (base_object != NULL && offset == oopDesc::klass_offset_in_bytes()) { |
685 klass = base_object->klass(); |
685 klass = base_object->klass(); |
686 } else if (!compressed) { |
686 } else if (!compressed) { |
701 klass = *((Klass**) (intptr_t) (base_address + offset)); |
701 klass = *((Klass**) (intptr_t) (base_address + offset)); |
702 } else { |
702 } else { |
703 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), |
703 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), |
704 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", base_object->klass()->external_name(), offset, compressed ? "true" : "false")); |
704 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", base_object->klass()->external_name(), offset, compressed ? "true" : "false")); |
705 } |
705 } |
706 assert (klass.is_null() || klass->is_klass(), "invalid read"); |
706 assert (klass == NULL || klass->is_klass(), "invalid read"); |
707 oop result = CompilerToVM::get_jvmci_type(klass, CHECK_NULL); |
707 oop result = CompilerToVM::get_jvmci_type(klass, CHECK_NULL); |
708 return JNIHandles::make_local(THREAD, result); |
708 return JNIHandles::make_local(THREAD, result); |
709 } |
709 } |
710 |
710 |
711 C2V_VMENTRY(jobject, findUniqueConcreteMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method)) |
711 C2V_VMENTRY(jobject, findUniqueConcreteMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method)) |
712 ResourceMark rm; |
712 ResourceMark rm; |
713 methodHandle method = CompilerToVM::asMethod(jvmci_method); |
713 methodHandle method = CompilerToVM::asMethod(jvmci_method); |
714 KlassHandle holder = CompilerToVM::asKlass(jvmci_type); |
714 Klass* holder = CompilerToVM::asKlass(jvmci_type); |
715 if (holder->is_interface()) { |
715 if (holder->is_interface()) { |
716 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", holder->external_name())); |
716 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", holder->external_name())); |
717 } |
717 } |
718 |
718 |
719 methodHandle ucm; |
719 methodHandle ucm; |
720 { |
720 { |
721 MutexLocker locker(Compile_lock); |
721 MutexLocker locker(Compile_lock); |
722 ucm = Dependencies::find_unique_concrete_method(holder(), method()); |
722 ucm = Dependencies::find_unique_concrete_method(holder, method()); |
723 } |
723 } |
724 oop result = CompilerToVM::get_jvmci_method(ucm, CHECK_NULL); |
724 oop result = CompilerToVM::get_jvmci_method(ucm, CHECK_NULL); |
725 return JNIHandles::make_local(THREAD, result); |
725 return JNIHandles::make_local(THREAD, result); |
726 C2V_END |
726 C2V_END |
727 |
727 |
846 return JNIHandles::make_local(THREAD, klass); |
846 return JNIHandles::make_local(THREAD, klass); |
847 C2V_END |
847 C2V_END |
848 |
848 |
849 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
849 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
850 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
850 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
851 KlassHandle loading_klass(cp->pool_holder()); |
851 Klass* loading_klass = cp->pool_holder(); |
852 bool is_accessible = false; |
852 bool is_accessible = false; |
853 KlassHandle klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass); |
853 Klass* klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass); |
854 Symbol* symbol = NULL; |
854 Symbol* symbol = NULL; |
855 if (klass.is_null()) { |
855 if (klass == NULL) { |
856 symbol = cp->klass_name_at(index); |
856 symbol = cp->klass_name_at(index); |
857 } |
857 } |
858 oop result_oop; |
858 oop result_oop; |
859 if (!klass.is_null()) { |
859 if (klass != NULL) { |
860 result_oop = CompilerToVM::get_jvmci_type(klass, CHECK_NULL); |
860 result_oop = CompilerToVM::get_jvmci_type(klass, CHECK_NULL); |
861 } else { |
861 } else { |
862 Handle result = java_lang_String::create_from_symbol(symbol, CHECK_NULL); |
862 Handle result = java_lang_String::create_from_symbol(symbol, CHECK_NULL); |
863 result_oop = result(); |
863 result_oop = result(); |
864 } |
864 } |
871 return JNIHandles::make_local(THREAD, appendix_oop); |
871 return JNIHandles::make_local(THREAD, appendix_oop); |
872 C2V_END |
872 C2V_END |
873 |
873 |
874 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
874 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
875 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
875 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
876 instanceKlassHandle pool_holder(cp->pool_holder()); |
876 InstanceKlass* pool_holder = cp->pool_holder(); |
877 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF); |
877 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF); |
878 methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder); |
878 methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder); |
879 oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL); |
879 oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL); |
880 return JNIHandles::make_local(THREAD, result); |
880 return JNIHandles::make_local(THREAD, result); |
881 C2V_END |
881 C2V_END |
918 } |
918 } |
919 return LinkResolver::vtable_index_of_interface_method(klass, method); |
919 return LinkResolver::vtable_index_of_interface_method(klass, method); |
920 C2V_END |
920 C2V_END |
921 |
921 |
922 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type)) |
922 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type)) |
923 KlassHandle recv_klass = CompilerToVM::asKlass(receiver_jvmci_type); |
923 Klass* recv_klass = CompilerToVM::asKlass(receiver_jvmci_type); |
924 KlassHandle caller_klass = CompilerToVM::asKlass(caller_jvmci_type); |
924 Klass* caller_klass = CompilerToVM::asKlass(caller_jvmci_type); |
925 methodHandle method = CompilerToVM::asMethod(jvmci_method); |
925 methodHandle method = CompilerToVM::asMethod(jvmci_method); |
926 |
926 |
927 KlassHandle h_resolved (THREAD, method->method_holder()); |
927 Klass* resolved = method->method_holder(); |
928 Symbol* h_name = method->name(); |
928 Symbol* h_name = method->name(); |
929 Symbol* h_signature = method->signature(); |
929 Symbol* h_signature = method->signature(); |
930 |
930 |
931 if (MethodHandles::is_signature_polymorphic_method(method())) { |
931 if (MethodHandles::is_signature_polymorphic_method(method())) { |
932 // Signature polymorphic methods are already resolved, JVMCI just returns NULL in this case. |
932 // Signature polymorphic methods are already resolved, JVMCI just returns NULL in this case. |
933 return NULL; |
933 return NULL; |
934 } |
934 } |
935 |
935 |
936 LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass); |
936 LinkInfo link_info(resolved, h_name, h_signature, caller_klass); |
937 methodHandle m; |
937 methodHandle m; |
938 // Only do exact lookup if receiver klass has been linked. Otherwise, |
938 // Only do exact lookup if receiver klass has been linked. Otherwise, |
939 // the vtable has not been setup, and the LinkResolver will fail. |
939 // the vtable has not been setup, and the LinkResolver will fail. |
940 if (recv_klass->is_array_klass() || |
940 if (recv_klass->is_array_klass() || |
941 InstanceKlass::cast(recv_klass())->is_linked() && !recv_klass->is_interface()) { |
941 InstanceKlass::cast(recv_klass)->is_linked() && !recv_klass->is_interface()) { |
942 if (h_resolved->is_interface()) { |
942 if (resolved->is_interface()) { |
943 m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info); |
943 m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info); |
944 } else { |
944 } else { |
945 m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info); |
945 m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info); |
946 } |
946 } |
947 } |
947 } |
1480 cp_cache_entry->set_dynamic_call(cp, callInfo); |
1480 cp_cache_entry->set_dynamic_call(cp, callInfo); |
1481 C2V_END |
1481 C2V_END |
1482 |
1482 |
1483 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
1483 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
1484 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
1484 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
1485 KlassHandle holder = cp->klass_ref_at(index, CHECK); |
1485 Klass* holder = cp->klass_ref_at(index, CHECK); |
1486 Symbol* name = cp->name_ref_at(index); |
1486 Symbol* name = cp->name_ref_at(index); |
1487 if (MethodHandles::is_signature_polymorphic_name(holder(), name)) { |
1487 if (MethodHandles::is_signature_polymorphic_name(holder, name)) { |
1488 CallInfo callInfo; |
1488 CallInfo callInfo; |
1489 LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK); |
1489 LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK); |
1490 ConstantPoolCacheEntry* cp_cache_entry = cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index)); |
1490 ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index)); |
1491 cp_cache_entry->set_method_handle(cp, callInfo); |
1491 cp_cache_entry->set_method_handle(cp, callInfo); |
1492 } |
1492 } |
1493 C2V_END |
1493 C2V_END |
1494 |
1494 |
1495 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject)) |
1495 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject)) |