< prev index next >

src/hotspot/share/prims/jvm.cpp

Print this page




1878   JVMWrapper("JVM_GetClassDeclaredConstructors");
1879   return get_class_declared_methods_helper(env, ofClass, publicOnly,
1880                                            /*want_constructor*/ true,
1881                                            SystemDictionary::reflect_Constructor_klass(), THREAD);
1882 }
1883 JVM_END
1884 
1885 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
1886 {
1887   JVMWrapper("JVM_GetClassAccessFlags");
1888   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1889     // Primitive type
1890     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1891   }
1892 
1893   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1894   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
1895 }
1896 JVM_END
1897 




























































































1898 
1899 // Constant pool access //////////////////////////////////////////////////////////
1900 
1901 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
1902 {
1903   JVMWrapper("JVM_GetClassConstantPool");
1904   JvmtiVMObjectAllocEventCollector oam;
1905 
1906   // Return null for primitives and arrays
1907   if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1908     Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1909     if (k->is_instance_klass()) {
1910       InstanceKlass* k_h = InstanceKlass::cast(k);
1911       Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
1912       reflect_ConstantPool::set_cp(jcp(), k_h->constants());
1913       return JNIHandles::make_local(jcp());
1914     }
1915   }
1916   return NULL;
1917 }




1878   JVMWrapper("JVM_GetClassDeclaredConstructors");
1879   return get_class_declared_methods_helper(env, ofClass, publicOnly,
1880                                            /*want_constructor*/ true,
1881                                            SystemDictionary::reflect_Constructor_klass(), THREAD);
1882 }
1883 JVM_END
1884 
1885 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
1886 {
1887   JVMWrapper("JVM_GetClassAccessFlags");
1888   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1889     // Primitive type
1890     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1891   }
1892 
1893   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1894   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
1895 }
1896 JVM_END
1897 
1898 JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))
1899 {
1900   JVMWrapper("JVM_AreNestMates");
1901   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1902   assert(c->is_instance_klass(), "must be");
1903   InstanceKlass* ck = InstanceKlass::cast(c);
1904   Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member));
1905   assert(m->is_instance_klass(), "must be");
1906   InstanceKlass* mk = InstanceKlass::cast(m);
1907   return ck->has_nestmate_access_to(mk, THREAD);
1908 }
1909 JVM_END
1910 
1911 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current))
1912 {
1913   // current is not a primitive or array class
1914   JVMWrapper("JVM_GetNestHost");
1915   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1916   assert(c->is_instance_klass(), "must be");
1917   InstanceKlass* ck = InstanceKlass::cast(c);
1918   // Don't post exceptions if validation fails
1919   InstanceKlass* host = ck->nest_host(NULL, THREAD);
1920   return (jclass) (host == NULL ? NULL :
1921                    JNIHandles::make_local(THREAD, host->java_mirror()));
1922 }
1923 JVM_END
1924 
1925 JVM_ENTRY(jobjectArray, JVM_GetNestMembers(JNIEnv* env, jclass current))
1926 {
1927   // current is not a primitive or array class
1928   JVMWrapper("JVM_GetNestMembers");
1929   Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
1930   assert(c->is_instance_klass(), "must be");
1931   InstanceKlass* ck = InstanceKlass::cast(c);
1932   // Get the nest host for this nest - throw ICCE if validation fails
1933   Symbol* icce = vmSymbols::java_lang_IncompatibleClassChangeError();
1934   InstanceKlass* host = ck->nest_host(icce, CHECK_NULL);
1935 
1936   {
1937     JvmtiVMObjectAllocEventCollector oam;
1938     Array<u2>* members = host->nest_members();
1939     int length = members == NULL ? 0 : members->length();
1940     // nest host is first in the array so make it one bigger
1941     objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(),
1942                                              length + 1, CHECK_NULL);
1943     objArrayHandle result (THREAD, r);
1944     result->obj_at_put(0, host->java_mirror());
1945     if (length != 0) {
1946       int i;
1947       for (i = 0; i < length; i++) {
1948          int cp_index = members->at(i);
1949          Klass* k = host->constants()->klass_at(cp_index, CHECK_NULL);
1950          if (k->is_instance_klass()) {
1951            InstanceKlass* nest_host_k =
1952              InstanceKlass::cast(k)->nest_host(icce, CHECK_NULL);
1953            if (nest_host_k == host) {
1954              result->obj_at_put(i+1, k->java_mirror());
1955            }
1956            else {
1957              // k's nest host is legal but it isn't our host so
1958              // throw ICCE
1959              ResourceMark rm(THREAD);
1960              Exceptions::fthrow(THREAD_AND_LOCATION,
1961                                 icce,
1962                                 "Nest member %s in %s declares a different nest host of %s",
1963                                 k->external_name(),
1964                                 host->external_name(),
1965                                 nest_host_k->external_name()
1966                            );
1967              return NULL;
1968            }
1969          }
1970          else {
1971            // we have a bad nest member entry - throw ICCE
1972            ResourceMark rm(THREAD);
1973            Exceptions::fthrow(THREAD_AND_LOCATION,
1974                               icce,
1975                               "Class %s can not be a nest member of %s",
1976                               k->external_name(),
1977                               host->external_name()
1978                               );
1979            return NULL;
1980          }
1981       }
1982     }
1983     else {
1984       assert(host == ck, "must be singleton nest");
1985     }
1986     return (jobjectArray)JNIHandles::make_local(THREAD, result());
1987   }
1988 }
1989 JVM_END
1990 
1991 // Constant pool access //////////////////////////////////////////////////////////
1992 
1993 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
1994 {
1995   JVMWrapper("JVM_GetClassConstantPool");
1996   JvmtiVMObjectAllocEventCollector oam;
1997 
1998   // Return null for primitives and arrays
1999   if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
2000     Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2001     if (k->is_instance_klass()) {
2002       InstanceKlass* k_h = InstanceKlass::cast(k);
2003       Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
2004       reflect_ConstantPool::set_cp(jcp(), k_h->constants());
2005       return JNIHandles::make_local(jcp());
2006     }
2007   }
2008   return NULL;
2009 }


< prev index next >