Print this page


Split Close
Expand all
Collapse all
          --- old/src/cpu/x86/vm/methodHandles_x86.cpp
          +++ new/src/cpu/x86/vm/methodHandles_x86.cpp
↓ open down ↓ 411 lines elided ↑ open up ↑
 412  412    // 32-bit: Pass first two oop/int args in registers ECX and EDX.
 413  413    const Register rarg0_code     = LP64_ONLY(j_rarg0) NOT_LP64(rcx);
 414  414    const Register rarg1_actual   = LP64_ONLY(j_rarg1) NOT_LP64(rdx);
 415  415    const Register rarg2_required = LP64_ONLY(j_rarg2) NOT_LP64(rdi);
 416  416    assert_different_registers(rarg0_code, rarg1_actual, rarg2_required, saved_last_sp);
 417  417  
 418  418    guarantee(java_dyn_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
 419  419  
 420  420    // some handy addresses
 421  421    Address rbx_method_fie(     rbx,      methodOopDesc::from_interpreted_offset() );
      422 +  Address rbx_method_fce(     rbx,      methodOopDesc::from_compiled_offset() );
 422  423  
 423  424    Address rcx_mh_vmtarget(    rcx_recv, java_dyn_MethodHandle::vmtarget_offset_in_bytes() );
 424  425    Address rcx_dmh_vmindex(    rcx_recv, sun_dyn_DirectMethodHandle::vmindex_offset_in_bytes() );
 425  426  
 426  427    Address rcx_bmh_vmargslot(  rcx_recv, sun_dyn_BoundMethodHandle::vmargslot_offset_in_bytes() );
 427  428    Address rcx_bmh_argument(   rcx_recv, sun_dyn_BoundMethodHandle::argument_offset_in_bytes() );
 428  429  
 429  430    Address rcx_amh_vmargslot(  rcx_recv, sun_dyn_AdapterMethodHandle::vmargslot_offset_in_bytes() );
 430  431    Address rcx_amh_argument(   rcx_recv, sun_dyn_AdapterMethodHandle::argument_offset_in_bytes() );
 431  432    Address rcx_amh_conversion( rcx_recv, sun_dyn_AdapterMethodHandle::conversion_offset_in_bytes() );
↓ open down ↓ 9 lines elided ↑ open up ↑
 441  442    address interp_entry = __ pc();
 442  443  
 443  444    trace_method_handle(_masm, entry_name(ek));
 444  445  
 445  446    BLOCK_COMMENT(entry_name(ek));
 446  447  
 447  448    switch ((int) ek) {
 448  449    case _raise_exception:
 449  450      {
 450  451        // Not a real MH entry, but rather shared code for raising an
 451      -      // exception.  Since we use a C2I adapter to set up the
 452      -      // interpreter state, arguments are expected in compiler
 453      -      // argument registers.
      452 +      // exception.  Since we use the compiled entry, arguments are
      453 +      // expected in compiler argument registers.
 454  454        assert(raise_exception_method(), "must be set");
 455      -      address c2i_entry = raise_exception_method()->get_c2i_entry();
 456      -      assert(c2i_entry, "method must be linked");
      455 +      assert(raise_exception_method()->from_compiled_entry(), "method must be linked");
 457  456  
 458  457        const Register rdi_pc = rax;
 459  458        __ pop(rdi_pc);  // caller PC
 460  459        __ mov(rsp, saved_last_sp);  // cut the stack back to where the caller started
 461  460  
 462  461        Register rbx_method = rbx_temp;
 463  462        Label L_no_method;
 464  463        // FIXME: fill in _raise_exception_method with a suitable sun.dyn method
 465  464        __ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method));
 466  465        __ testptr(rbx_method, rbx_method);
 467  466        __ jccb(Assembler::zero, L_no_method);
 468  467  
 469  468        const int jobject_oop_offset = 0;
 470  469        __ movptr(rbx_method, Address(rbx_method, jobject_oop_offset));  // dereference the jobject
 471  470        __ testptr(rbx_method, rbx_method);
 472  471        __ jccb(Assembler::zero, L_no_method);
 473  472        __ verify_oop(rbx_method);
 474  473  
 475      -      // 32-bit: push remaining arguments as if coming from the compiler.
 476  474        NOT_LP64(__ push(rarg2_required));
      475 +      __ push(rdi_pc);         // restore caller PC
      476 +      __ jmp(rbx_method_fce);  // jump to compiled entry
 477  477  
 478      -      __ push(rdi_pc);  // restore caller PC
 479      -      __ jump(ExternalAddress(c2i_entry));  // do C2I transition
 480      -
 481      -      // If we get here, the Java runtime did not do its job of creating the exception.
 482  478        // Do something that is at least causes a valid throw from the interpreter.
 483  479        __ bind(L_no_method);
 484  480        __ push(rarg2_required);
 485  481        __ push(rarg1_actual);
 486  482        __ jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry()));
 487  483      }
 488  484      break;
 489  485  
 490  486    case _invokestatic_mh:
 491  487    case _invokespecial_mh:
↓ open down ↓ 733 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX