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 {