src/hotspot/share/prims/jvm.cpp
changeset 50735 2f2af62dfac7
parent 50458 976334531950
child 50882 80abf702eed8
equal deleted inserted replaced
50734:0828a0f6676b 50735:2f2af62dfac7
  1890   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
  1890   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
  1891   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
  1891   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
  1892 }
  1892 }
  1893 JVM_END
  1893 JVM_END
  1894 
  1894 
       
  1895 JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))
       
  1896 {
       
  1897   JVMWrapper("JVM_AreNestMates");
       
  1898   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
       
  1899   assert(c->is_instance_klass(), "must be");
       
  1900   InstanceKlass* ck = InstanceKlass::cast(c);
       
  1901   Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));
       
  1902   assert(m->is_instance_klass(), "must be");
       
  1903   InstanceKlass* mk = InstanceKlass::cast(m);
       
  1904   return ck->has_nestmate_access_to(mk, THREAD);
       
  1905 }
       
  1906 JVM_END
       
  1907 
       
  1908 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))
       
  1909 {
       
  1910   // current is not a primitive or array class
       
  1911   JVMWrapper("JVM_GetNestHost");
       
  1912   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
       
  1913   assert(c->is_instance_klass(), "must be");
       
  1914   InstanceKlass* ck = InstanceKlass::cast(c);
       
  1915   // Don't post exceptions if validation fails
       
  1916   InstanceKlass* host = ck->nest_host(NULL, THREAD);
       
  1917   return (jclass) (host == NULL ? NULL :
       
  1918                    JNIHandles::make_local(THREAD, host->java_mirror()));
       
  1919 }
       
  1920 JVM_END
       
  1921 
       
  1922 JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))
       
  1923 {
       
  1924   // current is not a primitive or array class
       
  1925   JVMWrapper("JVM_GetNestMembers");
       
  1926   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
       
  1927   assert(c->is_instance_klass(), "must be");
       
  1928   InstanceKlass* ck = InstanceKlass::cast(c);
       
  1929   // Get the nest host for this nest - throw ICCE if validation fails
       
  1930   Symbol* icce = vmSymbols::java_lang_IncompatibleClassChangeError();
       
  1931   InstanceKlass* host = ck->nest_host(icce, CHECK_NULL);
       
  1932 
       
  1933   {
       
  1934     JvmtiVMObjectAllocEventCollector oam;
       
  1935     Array<u2>* members = host->nest_members();
       
  1936     int length = members == NULL ? 0 : members->length();
       
  1937     // nest host is first in the array so make it one bigger
       
  1938     objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(),
       
  1939                                              length + 1, CHECK_NULL);
       
  1940     objArrayHandle result (THREAD, r);
       
  1941     result->obj_at_put(0, host->java_mirror());
       
  1942     if (length != 0) {
       
  1943       int i;
       
  1944       for (i = 0; i < length; i++) {
       
  1945          int cp_index = members->at(i);
       
  1946          Klass* k = host->constants()->klass_at(cp_index, CHECK_NULL);
       
  1947          if (k->is_instance_klass()) {
       
  1948            InstanceKlass* nest_host_k =
       
  1949              InstanceKlass::cast(k)->nest_host(icce, CHECK_NULL);
       
  1950            if (nest_host_k == host) {
       
  1951              result->obj_at_put(i+1, k->java_mirror());
       
  1952            }
       
  1953            else {
       
  1954              // k's nest host is legal but it isn't our host so
       
  1955              // throw ICCE
       
  1956              ResourceMark rm(THREAD);
       
  1957              Exceptions::fthrow(THREAD_AND_LOCATION,
       
  1958                                 icce,
       
  1959                                 "Nest member %s in %s declares a different nest host of %s",
       
  1960                                 k->external_name(),
       
  1961                                 host->external_name(),
       
  1962                                 nest_host_k->external_name()
       
  1963                            );
       
  1964              return NULL;
       
  1965            }
       
  1966          }
       
  1967          else {
       
  1968            // we have a bad nest member entry - throw ICCE
       
  1969            ResourceMark rm(THREAD);
       
  1970            Exceptions::fthrow(THREAD_AND_LOCATION,
       
  1971                               icce,
       
  1972                               "Class %s can not be a nest member of %s",
       
  1973                               k->external_name(),
       
  1974                               host->external_name()
       
  1975                               );
       
  1976            return NULL;
       
  1977          }
       
  1978       }
       
  1979     }
       
  1980     else {
       
  1981       assert(host == ck, "must be singleton nest");
       
  1982     }
       
  1983     return (jobjectArray)JNIHandles::make_local(THREAD, result());
       
  1984   }
       
  1985 }
       
  1986 JVM_END
  1895 
  1987 
  1896 // Constant pool access //////////////////////////////////////////////////////////
  1988 // Constant pool access //////////////////////////////////////////////////////////
  1897 
  1989 
  1898 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
  1990 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
  1899 {
  1991 {