src/share/vm/prims/methodHandles.cpp

changeset 2497
3582bf76420e
parent 2436
d810e9a3fc33
child 2638
72dee110246f
     1.1 --- a/src/share/vm/prims/methodHandles.cpp	Thu Jan 27 13:42:28 2011 -0800
     1.2 +++ b/src/share/vm/prims/methodHandles.cpp	Thu Jan 27 16:11:27 2011 -0800
     1.3 @@ -278,7 +278,7 @@
     1.4    assert(m->is_method(), "");
     1.5    if (m->is_static()) {
     1.6      // check that signature begins '(L' or '([' (not '(I', '()', etc.)
     1.7 -    symbolOop sig = m->signature();
     1.8 +    Symbol* sig = m->signature();
     1.9      BasicType recv_bt = char2type(sig->byte_at(1));
    1.10      // Note: recv_bt might be T_ILLEGAL if byte_at(2) is ')'
    1.11      assert(sig->byte_at(0) == '(', "must be method sig");
    1.12 @@ -438,6 +438,25 @@
    1.13    return m;
    1.14  }
    1.15  
    1.16 +// convert the external string or reflective type to an internal signature
    1.17 +Symbol* MethodHandles::convert_to_signature(oop type_str,
    1.18 +                                            bool polymorphic,
    1.19 +                                            TRAPS) {
    1.20 +  if (java_dyn_MethodType::is_instance(type_str)) {
    1.21 +    return java_dyn_MethodType::as_signature(type_str, polymorphic, CHECK_NULL);
    1.22 +  } else if (java_lang_Class::is_instance(type_str)) {
    1.23 +    return java_lang_Class::as_signature(type_str, false, CHECK_NULL);
    1.24 +  } else if (java_lang_String::is_instance(type_str)) {
    1.25 +    if (polymorphic) {
    1.26 +      return java_lang_String::as_symbol(type_str, CHECK_NULL);
    1.27 +    } else {
    1.28 +      return java_lang_String::as_symbol_or_null(type_str);
    1.29 +    }
    1.30 +  } else {
    1.31 +    THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized type", NULL);
    1.32 +  }
    1.33 +}
    1.34 +
    1.35  // An unresolved member name is a mere symbolic reference.
    1.36  // Resolving it plants a vmtarget/vmindex in it,
    1.37  // which refers dirctly to JVM internals.
    1.38 @@ -478,39 +497,24 @@
    1.39    defc->link_class(CHECK);
    1.40  
    1.41    // convert the external string name to an internal symbol
    1.42 -  symbolHandle name(THREAD, java_lang_String::as_symbol_or_null(name_str));
    1.43 -  if (name.is_null())  return;  // no such name
    1.44 +  TempNewSymbol name = java_lang_String::as_symbol_or_null(name_str);
    1.45 +  if (name == NULL)  return;  // no such name
    1.46    name_str = NULL;  // safety
    1.47  
    1.48    Handle polymorphic_method_type;
    1.49    bool polymorphic_signature = false;
    1.50    if ((flags & ALL_KINDS) == IS_METHOD &&
    1.51        (defc() == SystemDictionary::MethodHandle_klass() &&
    1.52 -       methodOopDesc::is_method_handle_invoke_name(name())))
    1.53 +       methodOopDesc::is_method_handle_invoke_name(name)))
    1.54      polymorphic_signature = true;
    1.55  
    1.56    // convert the external string or reflective type to an internal signature
    1.57 -  symbolHandle type; {
    1.58 -    symbolOop type_sym = NULL;
    1.59 -    if (java_dyn_MethodType::is_instance(type_str)) {
    1.60 -      type_sym = java_dyn_MethodType::as_signature(type_str, polymorphic_signature, CHECK);
    1.61 -      if (polymorphic_signature)
    1.62 -        polymorphic_method_type = Handle(THREAD, type_str);  //preserve exactly
    1.63 -    } else if (java_lang_Class::is_instance(type_str)) {
    1.64 -      type_sym = java_lang_Class::as_signature(type_str, false, CHECK);
    1.65 -    } else if (java_lang_String::is_instance(type_str)) {
    1.66 -      if (polymorphic_signature) {
    1.67 -        type     = java_lang_String::as_symbol(type_str, CHECK);
    1.68 -      } else {
    1.69 -        type_sym = java_lang_String::as_symbol_or_null(type_str);
    1.70 -      }
    1.71 -    } else {
    1.72 -      THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized type");
    1.73 -    }
    1.74 -    if (type_sym != NULL)
    1.75 -      type = symbolHandle(THREAD, type_sym);
    1.76 +  TempNewSymbol type = convert_to_signature(type_str, polymorphic_signature, CHECK);
    1.77 +  if (java_dyn_MethodType::is_instance(type_str) && polymorphic_signature) {
    1.78 +    polymorphic_method_type = Handle(THREAD, type_str);  //preserve exactly
    1.79    }
    1.80 -  if (type.is_null())  return;  // no such signature exists in the VM
    1.81 +
    1.82 +  if (type == NULL)  return;  // no such signature exists in the VM
    1.83    type_str = NULL; // safety
    1.84  
    1.85    // Time to do the lookup.
    1.86 @@ -566,7 +570,7 @@
    1.87        CallInfo result;
    1.88        {
    1.89          EXCEPTION_MARK;
    1.90 -        if (name() == vmSymbols::object_initializer_name()) {
    1.91 +        if (name == vmSymbols::object_initializer_name()) {
    1.92            LinkResolver::resolve_special_call(result,
    1.93                          defc, name, type, KlassHandle(), false, THREAD);
    1.94          } else {
    1.95 @@ -594,7 +598,7 @@
    1.96      {
    1.97        // This is taken from LinkResolver::resolve_field, sans access checks.
    1.98        fieldDescriptor fd; // find_field initializes fd if found
    1.99 -      KlassHandle sel_klass(THREAD, instanceKlass::cast(defc())->find_field(name(), type(), &fd));
   1.100 +      KlassHandle sel_klass(THREAD, instanceKlass::cast(defc())->find_field(name, type, &fd));
   1.101        // check if field exists; i.e., if a klass containing the field def has been selected
   1.102        if (sel_klass.is_null())  return;
   1.103        oop vmtarget = sel_klass->as_klassOop();
   1.104 @@ -725,7 +729,7 @@
   1.105  }
   1.106  
   1.107  int MethodHandles::find_MemberNames(klassOop k,
   1.108 -                                    symbolOop name, symbolOop sig,
   1.109 +                                    Symbol* name, Symbol* sig,
   1.110                                      int mflags, klassOop caller,
   1.111                                      int skip, objArrayOop results) {
   1.112    DEBUG_ONLY(No_Safepoint_Verifier nsv);
   1.113 @@ -782,8 +786,8 @@
   1.114  
   1.115    if ((match_flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {
   1.116      // watch out for these guys:
   1.117 -    symbolOop init_name   = vmSymbols::object_initializer_name();
   1.118 -    symbolOop clinit_name = vmSymbols::class_initializer_name();
   1.119 +    Symbol* init_name   = vmSymbols::object_initializer_name();
   1.120 +    Symbol* clinit_name = vmSymbols::class_initializer_name();
   1.121      if (name == clinit_name)  clinit_name = NULL; // hack for exposing <clinit>
   1.122      bool negate_name_test = false;
   1.123      // fix name so that it captures the intention of IS_CONSTRUCTOR
   1.124 @@ -807,7 +811,7 @@
   1.125      }
   1.126      for (MethodStream st(k, local_only, !search_intfc); !st.eos(); st.next()) {
   1.127        methodOop m = st.method();
   1.128 -      symbolOop m_name = m->name();
   1.129 +      Symbol* m_name = m->name();
   1.130        if (m_name == clinit_name)
   1.131          continue;
   1.132        if (name != NULL && ((m_name != name) ^ negate_name_test))
   1.133 @@ -928,7 +932,7 @@
   1.134    // Must be on the boot class path:
   1.135    if (ik->class_loader() != NULL)  return false;
   1.136    // Check the name.
   1.137 -  symbolOop name = ik->name();
   1.138 +  Symbol* name = ik->name();
   1.139    for (int i = 0; ; i++) {
   1.140      const char* test_name = always_null_names[i];
   1.141      if (test_name == NULL)  break;
   1.142 @@ -1026,6 +1030,7 @@
   1.143    int pmax = ptypes->length();
   1.144    int mnum = 0;                 // method argument
   1.145    const char* err = NULL;
   1.146 +  ResourceMark rm(THREAD);
   1.147    for (SignatureStream ss(m->signature()); !ss.is_done(); ss.next()) {
   1.148      oop ptype_oop = NULL;
   1.149      if (ss.at_return_type()) {
   1.150 @@ -1061,15 +1066,14 @@
   1.151        }
   1.152        KlassHandle pklass_handle(THREAD, pklass); pklass = NULL;
   1.153        // If we fail to resolve types at this point, we will throw an error.
   1.154 -      symbolOop    name_oop = ss.as_symbol(CHECK);
   1.155 -      symbolHandle name(THREAD, name_oop);
   1.156 +      Symbol* name = ss.as_symbol(CHECK);
   1.157        instanceKlass* mk = instanceKlass::cast(m->method_holder());
   1.158        Handle loader(THREAD, mk->class_loader());
   1.159        Handle domain(THREAD, mk->protection_domain());
   1.160        mklass = SystemDictionary::resolve_or_null(name, loader, domain, CHECK);
   1.161        pklass = pklass_handle();
   1.162        if (mklass == NULL && pklass != NULL &&
   1.163 -          Klass::cast(pklass)->name() == name() &&
   1.164 +          Klass::cast(pklass)->name() == name &&
   1.165            m->is_method_handle_invoke()) {
   1.166          // Assume a match.  We can't really decode the signature of MH.invoke*.
   1.167          continue;
   1.168 @@ -2288,7 +2292,8 @@
   1.169      tty->print("creating MethodType form ");
   1.170      if (WizardMode || Verbose) {   // Warning: this calls Java code on the MH!
   1.171        // call Object.toString()
   1.172 -      symbolOop name = vmSymbols::toString_name(), sig = vmSymbols::void_string_signature();
   1.173 +      Symbol* name = vmSymbols::toString_name();
   1.174 +      Symbol* sig = vmSymbols::void_string_signature();
   1.175        JavaCallArguments args(Handle(THREAD, JNIHandles::resolve_non_null(erased_jh)));
   1.176        JavaValue result(T_OBJECT);
   1.177        JavaCalls::call_virtual(&result, SystemDictionary::Object_klass(), name, sig,
   1.178 @@ -2452,7 +2457,8 @@
   1.179    objArrayOop results = (objArrayOop) JNIHandles::resolve(results_jh);
   1.180    if (results == NULL || !results->is_objArray())       return -1;
   1.181  
   1.182 -  symbolOop name = NULL, sig = NULL;
   1.183 +  TempNewSymbol name = NULL;
   1.184 +  TempNewSymbol sig = NULL;
   1.185    if (name_jh != NULL) {
   1.186      name = java_lang_String::as_symbol_or_null(JNIHandles::resolve_non_null(name_jh));
   1.187      if (name == NULL)  return 0; // a match is not possible
   1.188 @@ -2611,10 +2617,10 @@
   1.189    if (enable_MH) {
   1.190      KlassHandle MHI_klass = SystemDictionaryHandles::MethodHandleImpl_klass();
   1.191      if (MHI_klass.not_null()) {
   1.192 -      symbolHandle raiseException_name = oopFactory::new_symbol_handle("raiseException", CHECK);
   1.193 -      symbolHandle raiseException_sig  = oopFactory::new_symbol_handle("(ILjava/lang/Object;Ljava/lang/Object;)V", CHECK);
   1.194 +      TempNewSymbol raiseException_name = SymbolTable::new_symbol("raiseException", CHECK);
   1.195 +      TempNewSymbol raiseException_sig = SymbolTable::new_symbol("(ILjava/lang/Object;Ljava/lang/Object;)V", CHECK);
   1.196        methodOop raiseException_method  = instanceKlass::cast(MHI_klass->as_klassOop())
   1.197 -                    ->find_method(raiseException_name(), raiseException_sig());
   1.198 +                    ->find_method(raiseException_name, raiseException_sig);
   1.199        if (raiseException_method != NULL && raiseException_method->is_static()) {
   1.200          MethodHandles::set_raise_exception_method(raiseException_method);
   1.201        } else {

mercurial