src/share/vm/opto/doCall.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/opto/doCall.cpp

src/share/vm/opto/doCall.cpp

Print this page

        

*** 398,484 **** assert(dest_method->is_loaded(), "dest_method: typeflow responsibility"); return false; } #ifdef ASSERT - static bool check_type(ciType* t1, ciType* t2) { - // Either oop-oop or prim-prim pair. - if (t1->is_primitive_type() && t2->is_primitive_type()) { - return t1->size() == t2->size(); // argument sizes should match - } else { - return !t1->is_primitive_type() && !t2->is_primitive_type(); // oop-oop - } - } - - static bool check_inlined_mh_linker_info(ciMethod* symbolic_info, ciMethod* resolved_method) { - assert(symbolic_info->is_method_handle_intrinsic(), "sanity"); - assert(!resolved_method->is_method_handle_intrinsic(), "sanity"); - - if (!symbolic_info->is_loaded() || !resolved_method->is_loaded()) { - return true; // Don't compare unloaded methods. - } - // Linkers have appendix argument which is not passed to callee. - int has_appendix = MethodHandles::has_member_arg(symbolic_info->intrinsic_id()) ? 1 : 0; - if (symbolic_info->arg_size() != (resolved_method->arg_size() + has_appendix)) { - return false; // Total size of arguments on stack mismatch. - } - if (!symbolic_info->return_type()->is_void()) { - // Only check the return type if the symbolic method is not void - // i.e. the return value of the resolved method can be dropped - if (!check_type(symbolic_info->return_type(), resolved_method->return_type())) { - return false; // Return value size or type mismatch encountered. - } - } - - switch (symbolic_info->intrinsic_id()) { - case vmIntrinsics::_linkToVirtual: - case vmIntrinsics::_linkToInterface: - case vmIntrinsics::_linkToSpecial: { - if (resolved_method->is_static()) return false; - break; - } - case vmIntrinsics::_linkToStatic: { - if (!resolved_method->is_static()) return false; - break; - } - } - - ciSignature* symbolic_sig = symbolic_info->signature(); - ciSignature* resolved_sig = resolved_method->signature(); - - if (symbolic_sig->count() + (symbolic_info->is_static() ? 0 : 1) != - resolved_sig->count() + (resolved_method->is_static() ? 0 : 1) + has_appendix) { - return false; // Argument count mismatch - } - - int sbase = 0, rbase = 0; - int arg_count = MIN2(symbolic_sig->count() - has_appendix, resolved_sig->count()); - ciType* recv_type = NULL; - if (symbolic_info->is_static() && !resolved_method->is_static()) { - recv_type = symbolic_sig->type_at(0); - sbase = 1; - } else if (!symbolic_info->is_static() && resolved_method->is_static()) { - recv_type = resolved_sig->type_at(0); - rbase = 1; - } - if (recv_type != NULL && recv_type->is_primitive_type()) { - return false; // Receiver should be an oop. - } - for (int i = 0; i < arg_count; i++) { - if (!check_type(symbolic_sig->type_at(sbase + i), resolved_sig->type_at(rbase + i))) { - return false; // Argument size or type mismatch encountered. - } - } - return true; - } - static bool is_call_consistent_with_jvms(JVMState* jvms, CallGenerator* cg) { ciMethod* symbolic_info = jvms->method()->get_method_at_bci(jvms->bci()); ciMethod* resolved_method = cg->method(); ! if (CallGenerator::is_inlined_mh_linker(jvms, resolved_method)) { ! return check_inlined_mh_linker_info(symbolic_info, resolved_method); } else { // Method name & descriptor should stay the same. return (symbolic_info->get_Method()->name() == resolved_method->get_Method()->name()) && (symbolic_info->get_Method()->signature() == resolved_method->get_Method()->signature()); } --- 398,413 ---- assert(dest_method->is_loaded(), "dest_method: typeflow responsibility"); return false; } #ifdef ASSERT static bool is_call_consistent_with_jvms(JVMState* jvms, CallGenerator* cg) { ciMethod* symbolic_info = jvms->method()->get_method_at_bci(jvms->bci()); ciMethod* resolved_method = cg->method(); ! if (CallGenerator::is_inlined_method_handle_intrinsic(jvms, resolved_method)) { ! return CallGenerator::ensure_mh_intrinsic_matches_target_method(symbolic_info, resolved_method); } else { // Method name & descriptor should stay the same. return (symbolic_info->get_Method()->name() == resolved_method->get_Method()->name()) && (symbolic_info->get_Method()->signature() == resolved_method->get_Method()->signature()); }
src/share/vm/opto/doCall.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File