344 __ null_check(receiver_reg); |
344 __ null_check(receiver_reg); |
345 } else { |
345 } else { |
346 // load receiver klass itself |
346 // load receiver klass itself |
347 __ null_check(receiver_reg, oopDesc::klass_offset_in_bytes()); |
347 __ null_check(receiver_reg, oopDesc::klass_offset_in_bytes()); |
348 __ load_klass(receiver_reg, temp1_recv_klass); |
348 __ load_klass(receiver_reg, temp1_recv_klass); |
349 __ verify_oop(temp1_recv_klass); |
349 __ verify_klass_ptr(temp1_recv_klass); |
350 } |
350 } |
351 BLOCK_COMMENT("check_receiver {"); |
351 BLOCK_COMMENT("check_receiver {"); |
352 // The receiver for the MemberName must be in receiver_reg. |
352 // The receiver for the MemberName must be in receiver_reg. |
353 // Check the receiver against the MemberName.clazz |
353 // Check the receiver against the MemberName.clazz |
354 if (VerifyMethodHandles && iid == vmIntrinsics::_linkToSpecial) { |
354 if (VerifyMethodHandles && iid == vmIntrinsics::_linkToSpecial) { |
355 // Did not load it above... |
355 // Did not load it above... |
356 __ load_klass(receiver_reg, temp1_recv_klass); |
356 __ load_klass(receiver_reg, temp1_recv_klass); |
357 __ verify_oop(temp1_recv_klass); |
357 __ verify_klass_ptr(temp1_recv_klass); |
358 } |
358 } |
359 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) { |
359 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) { |
360 Label L_ok; |
360 Label L_ok; |
361 Register temp2_defc = temp2; |
361 Register temp2_defc = temp2; |
362 __ load_heap_oop(member_clazz, temp2_defc); |
362 __ load_heap_oop(member_clazz, temp2_defc); |
363 load_klass_from_Class(_masm, temp2_defc, temp3, temp4); |
363 load_klass_from_Class(_masm, temp2_defc, temp3, temp4); |
364 __ verify_oop(temp2_defc); |
364 __ verify_klass_ptr(temp2_defc); |
365 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok); |
365 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok); |
366 // If we get here, the type check failed! |
366 // If we get here, the type check failed! |
367 __ STOP("receiver class disagrees with MemberName.clazz"); |
367 __ STOP("receiver class disagrees with MemberName.clazz"); |
368 __ bind(L_ok); |
368 __ bind(L_ok); |
369 } |
369 } |
436 } |
436 } |
437 |
437 |
438 Register temp3_intf = temp3; |
438 Register temp3_intf = temp3; |
439 __ load_heap_oop(member_clazz, temp3_intf); |
439 __ load_heap_oop(member_clazz, temp3_intf); |
440 load_klass_from_Class(_masm, temp3_intf, temp2, temp4); |
440 load_klass_from_Class(_masm, temp3_intf, temp2, temp4); |
441 __ verify_oop(temp3_intf); |
441 __ verify_klass_ptr(temp3_intf); |
442 |
442 |
443 Register G5_index = G5_method; |
443 Register G5_index = G5_method; |
444 __ ld_ptr(member_vmindex, G5_index); |
444 __ ld_ptr(member_vmindex, G5_index); |
445 if (VerifyMethodHandles) { |
445 if (VerifyMethodHandles) { |
446 Label L; |
446 Label L; |
456 // note: next two args must be the same: |
456 // note: next two args must be the same: |
457 G5_index, G5_method, |
457 G5_index, G5_method, |
458 temp2, no_sethi_temp, |
458 temp2, no_sethi_temp, |
459 L_no_such_interface); |
459 L_no_such_interface); |
460 |
460 |
461 __ verify_oop(G5_method); |
461 __ verify_method_ptr(G5_method); |
462 jump_from_method_handle(_masm, G5_method, temp2, temp3, for_compiler_entry); |
462 jump_from_method_handle(_masm, G5_method, temp2, temp3, for_compiler_entry); |
463 |
463 |
464 __ bind(L_no_such_interface); |
464 __ bind(L_no_such_interface); |
465 AddressLiteral icce(StubRoutines::throw_IncompatibleClassChangeError_entry()); |
465 AddressLiteral icce(StubRoutines::throw_IncompatibleClassChangeError_entry()); |
466 __ jump_to(icce, temp3); |
466 __ jump_to(icce, temp3); |
477 // live at this point: G5_method, O5_savedSP (if interpreted) |
477 // live at this point: G5_method, O5_savedSP (if interpreted) |
478 |
478 |
479 // After figuring out which concrete method to call, jump into it. |
479 // After figuring out which concrete method to call, jump into it. |
480 // Note that this works in the interpreter with no data motion. |
480 // Note that this works in the interpreter with no data motion. |
481 // But the compiled version will require that rcx_recv be shifted out. |
481 // But the compiled version will require that rcx_recv be shifted out. |
482 __ verify_oop(G5_method); |
482 __ verify_method_ptr(G5_method); |
483 jump_from_method_handle(_masm, G5_method, temp1, temp3, for_compiler_entry); |
483 jump_from_method_handle(_masm, G5_method, temp1, temp3, for_compiler_entry); |
484 } |
484 } |
485 } |
485 } |
486 } |
486 } |
487 |
487 |