src/share/vm/oops/methodOop.cpp

changeset 2992
b16582d6c7db
parent 2977
4bf3cbef0b3e
parent 2982
ddd894528dbc
child 3091
ac8738449b6f
     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,

mercurial