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