src/cpu/x86/vm/methodHandles_x86.cpp

changeset 4037
da91efe96a93
parent 3969
1d7922586cf6
child 4052
75f33eecc1b3
     1.1 --- a/src/cpu/x86/vm/methodHandles_x86.cpp	Fri Aug 31 16:39:35 2012 -0700
     1.2 +++ b/src/cpu/x86/vm/methodHandles_x86.cpp	Sat Sep 01 13:25:18 2012 -0400
     1.3 @@ -47,9 +47,9 @@
     1.4  
     1.5  void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg) {
     1.6    if (VerifyMethodHandles)
     1.7 -    verify_klass(_masm, klass_reg, SystemDictionaryHandles::Class_klass(),
     1.8 +    verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class),
     1.9                   "MH argument is a Class");
    1.10 -  __ load_heap_oop(klass_reg, Address(klass_reg, java_lang_Class::klass_offset_in_bytes()));
    1.11 +  __ movptr(klass_reg, Address(klass_reg, java_lang_Class::klass_offset_in_bytes()));
    1.12  }
    1.13  
    1.14  #ifdef ASSERT
    1.15 @@ -64,12 +64,10 @@
    1.16  
    1.17  #ifdef ASSERT
    1.18  void MethodHandles::verify_klass(MacroAssembler* _masm,
    1.19 -                                 Register obj, KlassHandle klass,
    1.20 +                                 Register obj, SystemDictionary::WKID klass_id,
    1.21                                   const char* error_message) {
    1.22 -  oop* klass_addr = klass.raw_value();
    1.23 -  assert(klass_addr >= SystemDictionaryHandles::Object_klass().raw_value() &&
    1.24 -         klass_addr <= SystemDictionaryHandles::Long_klass().raw_value(),
    1.25 -         "must be one of the SystemDictionaryHandles");
    1.26 +  Klass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
    1.27 +  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
    1.28    Register temp = rdi;
    1.29    Register temp2 = noreg;
    1.30    LP64_ONLY(temp2 = rscratch1);  // used by MacroAssembler::cmpptr
    1.31 @@ -137,12 +135,12 @@
    1.32      // Is a cmpl faster?
    1.33      __ cmpb(Address(rthread, JavaThread::interp_only_mode_offset()), 0);
    1.34      __ jccb(Assembler::zero, run_compiled_code);
    1.35 -    __ jmp(Address(method, methodOopDesc::interpreter_entry_offset()));
    1.36 +    __ jmp(Address(method, Method::interpreter_entry_offset()));
    1.37      __ BIND(run_compiled_code);
    1.38    }
    1.39  
    1.40 -  const ByteSize entry_offset = for_compiler_entry ? methodOopDesc::from_compiled_offset() :
    1.41 -                                                     methodOopDesc::from_interpreted_offset();
    1.42 +  const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() :
    1.43 +                                                     Method::from_interpreted_offset();
    1.44    __ jmp(Address(method, entry_offset));
    1.45  }
    1.46  
    1.47 @@ -165,16 +163,15 @@
    1.48    __ verify_oop(method_temp);
    1.49    __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
    1.50    __ verify_oop(method_temp);
    1.51 -  // the following assumes that a methodOop is normally compressed in the vmtarget field:
    1.52 -  __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())));
    1.53 -  __ verify_oop(method_temp);
    1.54 +  // the following assumes that a Method* is normally compressed in the vmtarget field:
    1.55 +  __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())));
    1.56  
    1.57    if (VerifyMethodHandles && !for_compiler_entry) {
    1.58      // make sure recv is already on stack
    1.59      __ load_sized_value(temp2,
    1.60 -                        Address(method_temp, methodOopDesc::size_of_parameters_offset()),
    1.61 +                        Address(method_temp, Method::size_of_parameters_offset()),
    1.62                          sizeof(u2), /*is_signed*/ false);
    1.63 -    // assert(sizeof(u2) == sizeof(methodOopDesc::_size_of_parameters), "");
    1.64 +    // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
    1.65      Label L;
    1.66      __ cmpptr(recv, __ argument_address(temp2, -1));
    1.67      __ jcc(Assembler::equal, L);
    1.68 @@ -203,7 +200,7 @@
    1.69    }
    1.70  
    1.71    // rsi/r13: sender SP (must preserve; see prepare_to_jump_from_interpreted)
    1.72 -  // rbx: methodOop
    1.73 +  // rbx: Method*
    1.74    // rdx: argument locator (parameter slot count, added to rsp)
    1.75    // rcx: used as temp to hold mh or receiver
    1.76    // rax, rdi: garbage temps, blown away
    1.77 @@ -221,14 +218,14 @@
    1.78    if (VerifyMethodHandles) {
    1.79      Label L;
    1.80      BLOCK_COMMENT("verify_intrinsic_id {");
    1.81 -    __ cmpb(Address(rbx_method, methodOopDesc::intrinsic_id_offset_in_bytes()), (int) iid);
    1.82 +    __ cmpb(Address(rbx_method, Method::intrinsic_id_offset_in_bytes()), (int) iid);
    1.83      __ jcc(Assembler::equal, L);
    1.84      if (iid == vmIntrinsics::_linkToVirtual ||
    1.85          iid == vmIntrinsics::_linkToSpecial) {
    1.86        // could do this for all kinds, but would explode assembly code size
    1.87 -      trace_method_handle(_masm, "bad methodOop::intrinsic_id");
    1.88 +      trace_method_handle(_masm, "bad Method*::intrinsic_id");
    1.89      }
    1.90 -    __ STOP("bad methodOop::intrinsic_id");
    1.91 +    __ STOP("bad Method*::intrinsic_id");
    1.92      __ bind(L);
    1.93      BLOCK_COMMENT("} verify_intrinsic_id");
    1.94    }
    1.95 @@ -239,9 +236,9 @@
    1.96    assert(ref_kind != 0 || iid == vmIntrinsics::_invokeBasic, "must be _invokeBasic or a linkTo intrinsic");
    1.97    if (ref_kind == 0 || MethodHandles::ref_kind_has_receiver(ref_kind)) {
    1.98      __ load_sized_value(rdx_argp,
    1.99 -                        Address(rbx_method, methodOopDesc::size_of_parameters_offset()),
   1.100 +                        Address(rbx_method, Method::size_of_parameters_offset()),
   1.101                          sizeof(u2), /*is_signed*/ false);
   1.102 -    // assert(sizeof(u2) == sizeof(methodOopDesc::_size_of_parameters), "");
   1.103 +    // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
   1.104      rdx_first_arg_addr = __ argument_address(rdx_argp, -1);
   1.105    } else {
   1.106      DEBUG_ONLY(rdx_argp = noreg);
   1.107 @@ -343,7 +340,7 @@
   1.108      // The method is a member invoker used by direct method handles.
   1.109      if (VerifyMethodHandles) {
   1.110        // make sure the trailing argument really is a MemberName (caller responsibility)
   1.111 -      verify_klass(_masm, member_reg, SystemDictionaryHandles::MemberName_klass(),
   1.112 +      verify_klass(_masm, member_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_invoke_MemberName),
   1.113                     "MemberName required for invokeVirtual etc.");
   1.114      }
   1.115  
   1.116 @@ -401,7 +398,7 @@
   1.117        if (VerifyMethodHandles) {
   1.118          verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3);
   1.119        }
   1.120 -      __ load_heap_oop(rbx_method, member_vmtarget);
   1.121 +      __ movptr(rbx_method, member_vmtarget);
   1.122        method_is_live = true;
   1.123        break;
   1.124  
   1.125 @@ -409,7 +406,7 @@
   1.126        if (VerifyMethodHandles) {
   1.127          verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3);
   1.128        }
   1.129 -      __ load_heap_oop(rbx_method, member_vmtarget);
   1.130 +      __ movptr(rbx_method, member_vmtarget);
   1.131        method_is_live = true;
   1.132        break;
   1.133  
   1.134 @@ -437,7 +434,7 @@
   1.135        // Note:  The verifier invariants allow us to ignore MemberName.clazz and vmtarget
   1.136        // at this point.  And VerifyMethodHandles has already checked clazz, if needed.
   1.137  
   1.138 -      // get target methodOop & entry point
   1.139 +      // get target Method* & entry point
   1.140        __ lookup_virtual_method(temp1_recv_klass, temp2_index, rbx_method);
   1.141        method_is_live = true;
   1.142        break;
   1.143 @@ -653,4 +650,3 @@
   1.144    BLOCK_COMMENT("} trace_method_handle");
   1.145  }
   1.146  #endif //PRODUCT
   1.147 -

mercurial