1.1 --- a/src/share/vm/oops/methodOop.cpp Wed Jul 06 08:43:01 2011 -0700 1.2 +++ b/src/share/vm/oops/methodOop.cpp Thu Jul 07 10:51:07 2011 -0700 1.3 @@ -929,14 +929,40 @@ 1.4 name->increment_refcount(); 1.5 signature->increment_refcount(); 1.6 1.7 + // record non-BCP method types in the constant pool 1.8 + GrowableArray<KlassHandle>* extra_klasses = NULL; 1.9 + for (int i = -1, len = java_lang_invoke_MethodType::ptype_count(method_type()); i < len; i++) { 1.10 + oop ptype = (i == -1 1.11 + ? java_lang_invoke_MethodType::rtype(method_type()) 1.12 + : java_lang_invoke_MethodType::ptype(method_type(), i)); 1.13 + klassOop klass = check_non_bcp_klass(java_lang_Class::as_klassOop(ptype)); 1.14 + if (klass != NULL) { 1.15 + if (extra_klasses == NULL) 1.16 + extra_klasses = new GrowableArray<KlassHandle>(len+1); 1.17 + bool dup = false; 1.18 + for (int j = 0; j < extra_klasses->length(); j++) { 1.19 + if (extra_klasses->at(j) == klass) { dup = true; break; } 1.20 + } 1.21 + if (!dup) 1.22 + extra_klasses->append(KlassHandle(THREAD, klass)); 1.23 + } 1.24 + } 1.25 + 1.26 + int extra_klass_count = (extra_klasses == NULL ? 0 : extra_klasses->length()); 1.27 + int cp_length = _imcp_limit + extra_klass_count; 1.28 constantPoolHandle cp; 1.29 { 1.30 - constantPoolOop cp_oop = oopFactory::new_constantPool(_imcp_limit, IsSafeConc, CHECK_(empty)); 1.31 + constantPoolOop cp_oop = oopFactory::new_constantPool(cp_length, IsSafeConc, CHECK_(empty)); 1.32 cp = constantPoolHandle(THREAD, cp_oop); 1.33 } 1.34 cp->symbol_at_put(_imcp_invoke_name, name); 1.35 cp->symbol_at_put(_imcp_invoke_signature, signature); 1.36 cp->string_at_put(_imcp_method_type_value, Universe::the_null_string()); 1.37 + for (int j = 0; j < extra_klass_count; j++) { 1.38 + KlassHandle klass = extra_klasses->at(j); 1.39 + cp->klass_at_put(_imcp_limit + j, klass()); 1.40 + } 1.41 + cp->set_preresolution(); 1.42 cp->set_pool_holder(holder()); 1.43 1.44 // set up the fancy stuff: 1.45 @@ -985,6 +1011,14 @@ 1.46 return m; 1.47 } 1.48 1.49 +klassOop methodOopDesc::check_non_bcp_klass(klassOop klass) { 1.50 + if (klass != NULL && Klass::cast(klass)->class_loader() != NULL) { 1.51 + if (Klass::cast(klass)->oop_is_objArray()) 1.52 + klass = objArrayKlass::cast(klass)->bottom_klass(); 1.53 + return klass; 1.54 + } 1.55 + return NULL; 1.56 +} 1.57 1.58 1.59 methodHandle methodOopDesc:: clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,