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 } |