1287 assert(!result || k->is_instance_klass(), 1288 "all interfaces are instance types"); 1289 // The compiler intrinsic for isInterface tests the 1290 // Klass::_access_flags bits in the same way. 1291 return result; 1292 JVM_END 1293 1294 JVM_ENTRY(jboolean, JVM_IsHiddenClass(JNIEnv *env, jclass cls)) 1295 JVMWrapper("JVM_IsHiddenClass"); 1296 oop mirror = JNIHandles::resolve_non_null(cls); 1297 if (java_lang_Class::is_primitive(mirror)) { 1298 return JNI_FALSE; 1299 } 1300 Klass* k = java_lang_Class::as_Klass(mirror); 1301 return k->is_hidden(); 1302 JVM_END 1303 1304 JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls)) 1305 JVMWrapper("JVM_GetClassSigners"); 1306 JvmtiVMObjectAllocEventCollector oam; 1307 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { 1308 // There are no signers for primitive types 1309 return NULL; 1310 } 1311 1312 objArrayHandle signers(THREAD, java_lang_Class::signers(JNIHandles::resolve_non_null(cls))); 1313 1314 // If there are no signers set in the class, or if the class 1315 // is an array, return NULL. 1316 if (signers == NULL) return NULL; 1317 1318 // copy of the signers array 1319 Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass(); 1320 objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL); 1321 for (int index = 0; index < signers->length(); index++) { 1322 signers_copy->obj_at_put(index, signers->obj_at(index)); 1323 } 1324 1325 // return the copy 1326 return (jobjectArray) JNIHandles::make_local(THREAD, signers_copy); 1327 JVM_END 1328 1329 1330 JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)) 1331 JVMWrapper("JVM_SetClassSigners"); 1332 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { 1333 // This call is ignored for primitive types and arrays. 1334 // Signers are only set once, ClassLoader.java, and thus shouldn't 1335 // be called with an array. Only the bootstrap loader creates arrays. 1336 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); 1337 if (k->is_instance_klass()) { 1338 java_lang_Class::set_signers(k->java_mirror(), objArrayOop(JNIHandles::resolve(signers))); 1339 } 1340 } 1341 JVM_END 1342 1343 1344 JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls)) 1345 JVMWrapper("JVM_GetProtectionDomain"); 1346 if (JNIHandles::resolve(cls) == NULL) { 1347 THROW_(vmSymbols::java_lang_NullPointerException(), NULL); 1348 } 1349 1350 if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { 1351 // Primitive types does not have a protection domain. 1352 return NULL; 1353 } 1354 1355 oop pd = java_lang_Class::protection_domain(JNIHandles::resolve(cls)); 1356 return (jobject) JNIHandles::make_local(THREAD, pd); 1357 JVM_END 1358 1359 1360 // Returns the inherited_access_control_context field of the running thread. 1361 JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)) 1362 JVMWrapper("JVM_GetInheritedAccessControlContext"); 1363 oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj()); 1364 return JNIHandles::make_local(THREAD, result); 1365 JVM_END 1366 1367 class RegisterArrayForGC { 1368 private: 1369 JavaThread *_thread; 1370 public: 1371 RegisterArrayForGC(JavaThread *thread, GrowableArray<oop>* array) { 1372 _thread = thread; 1373 _thread->register_array_for_gc(array); 1374 } 1375 1457 return JNIHandles::make_local(THREAD, result); 1458 JVM_END 1459 1460 1461 JVM_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls)) 1462 JVMWrapper("JVM_IsArrayClass"); 1463 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); 1464 return (k != NULL) && k->is_array_klass() ? true : false; 1465 JVM_END 1466 1467 1468 JVM_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)) 1469 JVMWrapper("JVM_IsPrimitiveClass"); 1470 oop mirror = JNIHandles::resolve_non_null(cls); 1471 return (jboolean) java_lang_Class::is_primitive(mirror); 1472 JVM_END 1473 1474 1475 JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls)) 1476 JVMWrapper("JVM_GetClassModifiers"); 1477 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { 1478 // Primitive type 1479 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 1480 } 1481 1482 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); 1483 debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0)); 1484 assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK"); 1485 return k->modifier_flags(); 1486 JVM_END 1487 1488 1489 // Inner class reflection /////////////////////////////////////////////////////////////////////////////// 1490 1491 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)) 1492 JvmtiVMObjectAllocEventCollector oam; 1493 // ofClass is a reference to a java_lang_Class object. The mirror object 1494 // of an InstanceKlass 1495 1496 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || 1497 ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_instance_klass()) { 1498 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); 1499 return (jobjectArray)JNIHandles::make_local(THREAD, result); 1500 } 1501 1502 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); 1503 InnerClassesIterator iter(k); 1504 1505 if (iter.length() == 0) { 1506 // Neither an inner nor outer class 1507 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); 1508 return (jobjectArray)JNIHandles::make_local(THREAD, result); 1509 } 1510 1511 // find inner class info 1512 constantPoolHandle cp(thread, k->constants()); 1513 int length = iter.length(); 1514 1515 // Allocate temp. result array 1516 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL); 1517 objArrayHandle result (THREAD, r); 1518 int members = 0; 1519 1520 for (; !iter.done(); iter.next()) { 1521 int ioff = iter.inner_class_info_index(); 1522 int ooff = iter.outer_class_info_index(); 1540 } 1541 } 1542 } 1543 1544 if (members != length) { 1545 // Return array of right length 1546 objArrayOop res = oopFactory::new_objArray(SystemDictionary::Class_klass(), members, CHECK_NULL); 1547 for(int i = 0; i < members; i++) { 1548 res->obj_at_put(i, result->obj_at(i)); 1549 } 1550 return (jobjectArray)JNIHandles::make_local(THREAD, res); 1551 } 1552 1553 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 1554 JVM_END 1555 1556 1557 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)) 1558 { 1559 // ofClass is a reference to a java_lang_Class object. 1560 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || 1561 ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_instance_klass()) { 1562 return NULL; 1563 } 1564 1565 bool inner_is_member = false; 1566 Klass* outer_klass 1567 = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)) 1568 )->compute_enclosing_class(&inner_is_member, CHECK_NULL); 1569 if (outer_klass == NULL) return NULL; // already a top-level class 1570 if (!inner_is_member) return NULL; // a hidden or unsafe anonymous class (inside a method) 1571 return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror()); 1572 } 1573 JVM_END 1574 1575 JVM_ENTRY(jstring, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls)) 1576 { 1577 oop mirror = JNIHandles::resolve_non_null(cls); 1578 if (java_lang_Class::is_primitive(mirror) || 1579 !java_lang_Class::as_Klass(mirror)->is_instance_klass()) { 1580 return NULL; 1581 } 1582 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(mirror)); 1583 int ooff = 0, noff = 0; 1584 if (k->find_inner_classes_attr(&ooff, &noff, THREAD)) { 1585 if (noff != 0) { 1586 constantPoolHandle i_cp(thread, k->constants()); 1587 Symbol* name = i_cp->symbol_at(noff); 1588 Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL); 1589 return (jstring) JNIHandles::make_local(THREAD, str()); 1590 } 1591 } 1592 return NULL; 1593 } 1594 JVM_END 1595 1596 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls)) 1597 assert (cls != NULL, "illegal class"); 1598 JVMWrapper("JVM_GetClassSignature"); 1599 JvmtiVMObjectAllocEventCollector oam; 1600 ResourceMark rm(THREAD); 1601 // Return null for arrays and primatives 1602 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { 1603 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); 1604 if (k->is_instance_klass()) { 1605 Symbol* sym = InstanceKlass::cast(k)->generic_signature(); 1606 if (sym == NULL) return NULL; 1607 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); 1608 return (jstring) JNIHandles::make_local(THREAD, str()); 1609 } 1610 } 1611 return NULL; 1612 JVM_END 1613 1614 1615 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls)) 1616 assert (cls != NULL, "illegal class"); 1617 JVMWrapper("JVM_GetClassAnnotations"); 1618 1619 // Return null for arrays and primitives 1620 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { 1621 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); 1622 if (k->is_instance_klass()) { 1623 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL); 1624 return (jbyteArray) JNIHandles::make_local(THREAD, a); 1625 } 1626 } 1627 return NULL; 1628 JVM_END 1629 1630 1631 static bool jvm_get_field_common(jobject field, fieldDescriptor& fd, TRAPS) { 1632 // some of this code was adapted from from jni_FromReflectedField 1633 1634 oop reflected = JNIHandles::resolve_non_null(field); 1635 oop mirror = java_lang_reflect_Field::clazz(reflected); 1636 Klass* k = java_lang_Class::as_Klass(mirror); 1637 int slot = java_lang_reflect_Field::slot(reflected); 1638 int modifiers = java_lang_reflect_Field::modifiers(reflected); 1639 1640 InstanceKlass* ik = InstanceKlass::cast(k); 1641 intptr_t offset = ik->field_offset(slot); 1780 // For a 0 index, give a NULL symbol 1781 Symbol* sym = 0 != params[i].name_cp_index ? 1782 mh->constants()->symbol_at(params[i].name_cp_index) : NULL; 1783 int flags = params[i].flags; 1784 oop param = Reflection::new_parameter(reflected_method, i, sym, 1785 flags, CHECK_NULL); 1786 result->obj_at_put(i, param); 1787 } 1788 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 1789 } 1790 } 1791 JVM_END 1792 1793 // New (JDK 1.4) reflection implementation ///////////////////////////////////// 1794 1795 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)) 1796 { 1797 JVMWrapper("JVM_GetClassDeclaredFields"); 1798 JvmtiVMObjectAllocEventCollector oam; 1799 1800 // Exclude primitive types and array types 1801 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || 1802 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) { 1803 // Return empty array 1804 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL); 1805 return (jobjectArray) JNIHandles::make_local(THREAD, res); 1806 } 1807 1808 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); 1809 constantPoolHandle cp(THREAD, k->constants()); 1810 1811 // Ensure class is linked 1812 k->link_class(CHECK_NULL); 1813 1814 // Allocate result 1815 int num_fields; 1816 1817 if (publicOnly) { 1818 num_fields = 0; 1819 for (JavaFieldStream fs(k); !fs.done(); fs.next()) { 1820 if (fs.access_flags().is_public()) ++num_fields; 1821 } 1822 } else { 1823 num_fields = k->java_fields_count(); 1824 } 1825 1826 objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), num_fields, CHECK_NULL); 1827 objArrayHandle result (THREAD, r); 1828 1888 return (jobjectArray)JNIHandles::make_local(THREAD, result); 1889 } 1890 JVM_END 1891 1892 static bool select_method(const methodHandle& method, bool want_constructor) { 1893 if (want_constructor) { 1894 return (method->is_initializer() && !method->is_static()); 1895 } else { 1896 return (!method->is_initializer() && !method->is_overpass()); 1897 } 1898 } 1899 1900 static jobjectArray get_class_declared_methods_helper( 1901 JNIEnv *env, 1902 jclass ofClass, jboolean publicOnly, 1903 bool want_constructor, 1904 Klass* klass, TRAPS) { 1905 1906 JvmtiVMObjectAllocEventCollector oam; 1907 1908 // Exclude primitive types and array types 1909 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) 1910 || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) { 1911 // Return empty array 1912 oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL); 1913 return (jobjectArray) JNIHandles::make_local(THREAD, res); 1914 } 1915 1916 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); 1917 1918 // Ensure class is linked 1919 k->link_class(CHECK_NULL); 1920 1921 Array<Method*>* methods = k->methods(); 1922 int methods_length = methods->length(); 1923 1924 // Save original method_idnum in case of redefinition, which can change 1925 // the idnum of obsolete methods. The new method will have the same idnum 1926 // but if we refresh the methods array, the counts will be wrong. 1927 ResourceMark rm(THREAD); 1928 GrowableArray<int>* idnums = new GrowableArray<int>(methods_length); 1929 int num_methods = 0; 1930 1931 for (int i = 0; i < methods_length; i++) { 1932 methodHandle method(THREAD, methods->at(i)); 1933 if (select_method(method, want_constructor)) { 1934 if (!publicOnly || method->is_public()) { 1935 idnums->push(method->method_idnum()); 1936 ++num_methods; 1970 { 1971 JVMWrapper("JVM_GetClassDeclaredMethods"); 1972 return get_class_declared_methods_helper(env, ofClass, publicOnly, 1973 /*want_constructor*/ false, 1974 SystemDictionary::reflect_Method_klass(), THREAD); 1975 } 1976 JVM_END 1977 1978 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)) 1979 { 1980 JVMWrapper("JVM_GetClassDeclaredConstructors"); 1981 return get_class_declared_methods_helper(env, ofClass, publicOnly, 1982 /*want_constructor*/ true, 1983 SystemDictionary::reflect_Constructor_klass(), THREAD); 1984 } 1985 JVM_END 1986 1987 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)) 1988 { 1989 JVMWrapper("JVM_GetClassAccessFlags"); 1990 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { 1991 // Primitive type 1992 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 1993 } 1994 1995 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); 1996 return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS; 1997 } 1998 JVM_END 1999 2000 JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member)) 2001 { 2002 JVMWrapper("JVM_AreNestMates"); 2003 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current)); 2004 assert(c->is_instance_klass(), "must be"); 2005 InstanceKlass* ck = InstanceKlass::cast(c); 2006 Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member)); 2007 assert(m->is_instance_klass(), "must be"); 2008 InstanceKlass* mk = InstanceKlass::cast(m); 2009 return ck->has_nestmate_access_to(mk, THREAD); 2010 } 2011 JVM_END 2012 2013 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current)) 2014 { 2015 // current is not a primitive or array class 2090 objArrayOop r2 = oopFactory::new_objArray(SystemDictionary::Class_klass(), 2091 count + 1, CHECK_NULL); 2092 objArrayHandle result2(THREAD, r2); 2093 for (int i = 0; i < count + 1; i++) { 2094 result2->obj_at_put(i, result->obj_at(i)); 2095 } 2096 return (jobjectArray)JNIHandles::make_local(THREAD, result2()); 2097 } 2098 } 2099 else { 2100 assert(host == ck || ck->is_hidden(), "must be singleton nest or dynamic nestmate"); 2101 } 2102 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 2103 } 2104 } 2105 JVM_END 2106 2107 JVM_ENTRY(jobjectArray, JVM_GetPermittedSubclasses(JNIEnv* env, jclass current)) 2108 { 2109 JVMWrapper("JVM_GetPermittedSubclasses"); 2110 assert(!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(current)), "should not be"); 2111 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current)); 2112 assert(c->is_instance_klass(), "must be"); 2113 InstanceKlass* ik = InstanceKlass::cast(c); 2114 { 2115 JvmtiVMObjectAllocEventCollector oam; 2116 Array<u2>* subclasses = ik->permitted_subclasses(); 2117 int length = subclasses == NULL ? 0 : subclasses->length(); 2118 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 2119 length, CHECK_NULL); 2120 objArrayHandle result(THREAD, r); 2121 for (int i = 0; i < length; i++) { 2122 int cp_index = subclasses->at(i); 2123 // This returns <package-name>/<class-name>. 2124 Symbol* klass_name = ik->constants()->klass_name_at(cp_index); 2125 assert(klass_name != NULL, "Unexpected null klass_name"); 2126 Handle perm_subtype_h = java_lang_String::create_from_symbol(klass_name, CHECK_NULL); 2127 result->obj_at_put(i, perm_subtype_h()); 2128 } 2129 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 2130 } 2131 } 2132 JVM_END 2133 2134 // Constant pool access ////////////////////////////////////////////////////////// 2135 2136 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls)) 2137 { 2138 JVMWrapper("JVM_GetClassConstantPool"); 2139 JvmtiVMObjectAllocEventCollector oam; 2140 2141 // Return null for primitives and arrays 2142 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { 2143 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); 2144 if (k->is_instance_klass()) { 2145 InstanceKlass* k_h = InstanceKlass::cast(k); 2146 Handle jcp = reflect_ConstantPool::create(CHECK_NULL); 2147 reflect_ConstantPool::set_cp(jcp(), k_h->constants()); 2148 return JNIHandles::make_local(THREAD, jcp()); 2149 } 2150 } 2151 return NULL; 2152 } 2153 JVM_END 2154 2155 2156 JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused)) 2157 { 2158 JVMWrapper("JVM_ConstantPoolGetSize"); 2159 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj))); 2160 return cp->length(); 2161 } 2162 JVM_END 2163 | 1287 assert(!result || k->is_instance_klass(), 1288 "all interfaces are instance types"); 1289 // The compiler intrinsic for isInterface tests the 1290 // Klass::_access_flags bits in the same way. 1291 return result; 1292 JVM_END 1293 1294 JVM_ENTRY(jboolean, JVM_IsHiddenClass(JNIEnv *env, jclass cls)) 1295 JVMWrapper("JVM_IsHiddenClass"); 1296 oop mirror = JNIHandles::resolve_non_null(cls); 1297 if (java_lang_Class::is_primitive(mirror)) { 1298 return JNI_FALSE; 1299 } 1300 Klass* k = java_lang_Class::as_Klass(mirror); 1301 return k->is_hidden(); 1302 JVM_END 1303 1304 JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls)) 1305 JVMWrapper("JVM_GetClassSigners"); 1306 JvmtiVMObjectAllocEventCollector oam; 1307 oop mirror = JNIHandles::resolve_non_null(cls); 1308 if (java_lang_Class::is_primitive(mirror)) { 1309 // There are no signers for primitive types 1310 return NULL; 1311 } 1312 1313 objArrayHandle signers(THREAD, java_lang_Class::signers(mirror)); 1314 1315 // If there are no signers set in the class, or if the class 1316 // is an array, return NULL. 1317 if (signers == NULL) return NULL; 1318 1319 // copy of the signers array 1320 Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass(); 1321 objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL); 1322 for (int index = 0; index < signers->length(); index++) { 1323 signers_copy->obj_at_put(index, signers->obj_at(index)); 1324 } 1325 1326 // return the copy 1327 return (jobjectArray) JNIHandles::make_local(THREAD, signers_copy); 1328 JVM_END 1329 1330 1331 JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)) 1332 JVMWrapper("JVM_SetClassSigners"); 1333 oop mirror = JNIHandles::resolve_non_null(cls); 1334 if (!java_lang_Class::is_primitive(mirror)) { 1335 // This call is ignored for primitive types and arrays. 1336 // Signers are only set once, ClassLoader.java, and thus shouldn't 1337 // be called with an array. Only the bootstrap loader creates arrays. 1338 Klass* k = java_lang_Class::as_Klass(mirror); 1339 if (k->is_instance_klass()) { 1340 java_lang_Class::set_signers(k->java_mirror(), objArrayOop(JNIHandles::resolve(signers))); 1341 } 1342 } 1343 JVM_END 1344 1345 1346 JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls)) 1347 JVMWrapper("JVM_GetProtectionDomain"); 1348 oop mirror = JNIHandles::resolve_non_null(cls); 1349 if (mirror == NULL) { 1350 THROW_(vmSymbols::java_lang_NullPointerException(), NULL); 1351 } 1352 1353 if (java_lang_Class::is_primitive(mirror)) { 1354 // Primitive types does not have a protection domain. 1355 return NULL; 1356 } 1357 1358 oop pd = java_lang_Class::protection_domain(mirror); 1359 return (jobject) JNIHandles::make_local(THREAD, pd); 1360 JVM_END 1361 1362 1363 // Returns the inherited_access_control_context field of the running thread. 1364 JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)) 1365 JVMWrapper("JVM_GetInheritedAccessControlContext"); 1366 oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj()); 1367 return JNIHandles::make_local(THREAD, result); 1368 JVM_END 1369 1370 class RegisterArrayForGC { 1371 private: 1372 JavaThread *_thread; 1373 public: 1374 RegisterArrayForGC(JavaThread *thread, GrowableArray<oop>* array) { 1375 _thread = thread; 1376 _thread->register_array_for_gc(array); 1377 } 1378 1460 return JNIHandles::make_local(THREAD, result); 1461 JVM_END 1462 1463 1464 JVM_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls)) 1465 JVMWrapper("JVM_IsArrayClass"); 1466 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); 1467 return (k != NULL) && k->is_array_klass() ? true : false; 1468 JVM_END 1469 1470 1471 JVM_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)) 1472 JVMWrapper("JVM_IsPrimitiveClass"); 1473 oop mirror = JNIHandles::resolve_non_null(cls); 1474 return (jboolean) java_lang_Class::is_primitive(mirror); 1475 JVM_END 1476 1477 1478 JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls)) 1479 JVMWrapper("JVM_GetClassModifiers"); 1480 oop mirror = JNIHandles::resolve_non_null(cls); 1481 if (java_lang_Class::is_primitive(mirror)) { 1482 // Primitive type 1483 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 1484 } 1485 1486 Klass* k = java_lang_Class::as_Klass(mirror); 1487 debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0)); 1488 assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK"); 1489 return k->modifier_flags(); 1490 JVM_END 1491 1492 1493 // Inner class reflection /////////////////////////////////////////////////////////////////////////////// 1494 1495 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)) 1496 JvmtiVMObjectAllocEventCollector oam; 1497 // ofClass is a reference to a java_lang_Class object. The mirror object 1498 // of an InstanceKlass 1499 oop ofMirror = JNIHandles::resolve_non_null(ofClass); 1500 if (java_lang_Class::is_primitive(ofMirror) || 1501 ! java_lang_Class::as_Klass(ofMirror)->is_instance_klass()) { 1502 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); 1503 return (jobjectArray)JNIHandles::make_local(THREAD, result); 1504 } 1505 1506 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror)); 1507 InnerClassesIterator iter(k); 1508 1509 if (iter.length() == 0) { 1510 // Neither an inner nor outer class 1511 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); 1512 return (jobjectArray)JNIHandles::make_local(THREAD, result); 1513 } 1514 1515 // find inner class info 1516 constantPoolHandle cp(thread, k->constants()); 1517 int length = iter.length(); 1518 1519 // Allocate temp. result array 1520 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL); 1521 objArrayHandle result (THREAD, r); 1522 int members = 0; 1523 1524 for (; !iter.done(); iter.next()) { 1525 int ioff = iter.inner_class_info_index(); 1526 int ooff = iter.outer_class_info_index(); 1544 } 1545 } 1546 } 1547 1548 if (members != length) { 1549 // Return array of right length 1550 objArrayOop res = oopFactory::new_objArray(SystemDictionary::Class_klass(), members, CHECK_NULL); 1551 for(int i = 0; i < members; i++) { 1552 res->obj_at_put(i, result->obj_at(i)); 1553 } 1554 return (jobjectArray)JNIHandles::make_local(THREAD, res); 1555 } 1556 1557 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 1558 JVM_END 1559 1560 1561 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)) 1562 { 1563 // ofClass is a reference to a java_lang_Class object. 1564 oop ofMirror = JNIHandles::resolve_non_null(ofClass); 1565 if (java_lang_Class::is_primitive(ofMirror)) { 1566 return NULL; 1567 } 1568 Klass* klass = java_lang_Class::as_Klass(ofMirror); 1569 if (!klass->is_instance_klass()) { 1570 return NULL; 1571 } 1572 1573 bool inner_is_member = false; 1574 Klass* outer_klass 1575 = InstanceKlass::cast(klass)->compute_enclosing_class(&inner_is_member, CHECK_NULL); 1576 if (outer_klass == NULL) return NULL; // already a top-level class 1577 if (!inner_is_member) return NULL; // a hidden or unsafe anonymous class (inside a method) 1578 return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror()); 1579 } 1580 JVM_END 1581 1582 JVM_ENTRY(jstring, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls)) 1583 { 1584 oop mirror = JNIHandles::resolve_non_null(cls); 1585 if (java_lang_Class::is_primitive(mirror)) { 1586 return NULL; 1587 } 1588 Klass* klass = java_lang_Class::as_Klass(mirror); 1589 if (!klass->is_instance_klass()) { 1590 return NULL; 1591 } 1592 InstanceKlass* k = InstanceKlass::cast(klass); 1593 int ooff = 0, noff = 0; 1594 if (k->find_inner_classes_attr(&ooff, &noff, THREAD)) { 1595 if (noff != 0) { 1596 constantPoolHandle i_cp(thread, k->constants()); 1597 Symbol* name = i_cp->symbol_at(noff); 1598 Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL); 1599 return (jstring) JNIHandles::make_local(THREAD, str()); 1600 } 1601 } 1602 return NULL; 1603 } 1604 JVM_END 1605 1606 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls)) 1607 assert (cls != NULL, "illegal class"); 1608 JVMWrapper("JVM_GetClassSignature"); 1609 JvmtiVMObjectAllocEventCollector oam; 1610 ResourceMark rm(THREAD); 1611 oop mirror = JNIHandles::resolve_non_null(cls); 1612 // Return null for arrays and primatives 1613 if (!java_lang_Class::is_primitive(mirror)) { 1614 Klass* k = java_lang_Class::as_Klass(mirror); 1615 if (k->is_instance_klass()) { 1616 Symbol* sym = InstanceKlass::cast(k)->generic_signature(); 1617 if (sym == NULL) return NULL; 1618 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); 1619 return (jstring) JNIHandles::make_local(THREAD, str()); 1620 } 1621 } 1622 return NULL; 1623 JVM_END 1624 1625 1626 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls)) 1627 assert (cls != NULL, "illegal class"); 1628 JVMWrapper("JVM_GetClassAnnotations"); 1629 oop mirror = JNIHandles::resolve_non_null(cls); 1630 // Return null for arrays and primitives 1631 if (!java_lang_Class::is_primitive(mirror)) { 1632 Klass* k = java_lang_Class::as_Klass(mirror); 1633 if (k->is_instance_klass()) { 1634 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL); 1635 return (jbyteArray) JNIHandles::make_local(THREAD, a); 1636 } 1637 } 1638 return NULL; 1639 JVM_END 1640 1641 1642 static bool jvm_get_field_common(jobject field, fieldDescriptor& fd, TRAPS) { 1643 // some of this code was adapted from from jni_FromReflectedField 1644 1645 oop reflected = JNIHandles::resolve_non_null(field); 1646 oop mirror = java_lang_reflect_Field::clazz(reflected); 1647 Klass* k = java_lang_Class::as_Klass(mirror); 1648 int slot = java_lang_reflect_Field::slot(reflected); 1649 int modifiers = java_lang_reflect_Field::modifiers(reflected); 1650 1651 InstanceKlass* ik = InstanceKlass::cast(k); 1652 intptr_t offset = ik->field_offset(slot); 1791 // For a 0 index, give a NULL symbol 1792 Symbol* sym = 0 != params[i].name_cp_index ? 1793 mh->constants()->symbol_at(params[i].name_cp_index) : NULL; 1794 int flags = params[i].flags; 1795 oop param = Reflection::new_parameter(reflected_method, i, sym, 1796 flags, CHECK_NULL); 1797 result->obj_at_put(i, param); 1798 } 1799 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 1800 } 1801 } 1802 JVM_END 1803 1804 // New (JDK 1.4) reflection implementation ///////////////////////////////////// 1805 1806 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)) 1807 { 1808 JVMWrapper("JVM_GetClassDeclaredFields"); 1809 JvmtiVMObjectAllocEventCollector oam; 1810 1811 oop ofMirror = JNIHandles::resolve_non_null(ofClass); 1812 // Exclude primitive types and array types 1813 if (java_lang_Class::is_primitive(ofMirror) || 1814 java_lang_Class::as_Klass(ofMirror)->is_array_klass()) { 1815 // Return empty array 1816 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL); 1817 return (jobjectArray) JNIHandles::make_local(THREAD, res); 1818 } 1819 1820 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror)); 1821 constantPoolHandle cp(THREAD, k->constants()); 1822 1823 // Ensure class is linked 1824 k->link_class(CHECK_NULL); 1825 1826 // Allocate result 1827 int num_fields; 1828 1829 if (publicOnly) { 1830 num_fields = 0; 1831 for (JavaFieldStream fs(k); !fs.done(); fs.next()) { 1832 if (fs.access_flags().is_public()) ++num_fields; 1833 } 1834 } else { 1835 num_fields = k->java_fields_count(); 1836 } 1837 1838 objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), num_fields, CHECK_NULL); 1839 objArrayHandle result (THREAD, r); 1840 1900 return (jobjectArray)JNIHandles::make_local(THREAD, result); 1901 } 1902 JVM_END 1903 1904 static bool select_method(const methodHandle& method, bool want_constructor) { 1905 if (want_constructor) { 1906 return (method->is_initializer() && !method->is_static()); 1907 } else { 1908 return (!method->is_initializer() && !method->is_overpass()); 1909 } 1910 } 1911 1912 static jobjectArray get_class_declared_methods_helper( 1913 JNIEnv *env, 1914 jclass ofClass, jboolean publicOnly, 1915 bool want_constructor, 1916 Klass* klass, TRAPS) { 1917 1918 JvmtiVMObjectAllocEventCollector oam; 1919 1920 oop ofMirror = JNIHandles::resolve_non_null(ofClass); 1921 // Exclude primitive types and array types 1922 if (java_lang_Class::is_primitive(ofMirror) 1923 || java_lang_Class::as_Klass(ofMirror)->is_array_klass()) { 1924 // Return empty array 1925 oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL); 1926 return (jobjectArray) JNIHandles::make_local(THREAD, res); 1927 } 1928 1929 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror)); 1930 1931 // Ensure class is linked 1932 k->link_class(CHECK_NULL); 1933 1934 Array<Method*>* methods = k->methods(); 1935 int methods_length = methods->length(); 1936 1937 // Save original method_idnum in case of redefinition, which can change 1938 // the idnum of obsolete methods. The new method will have the same idnum 1939 // but if we refresh the methods array, the counts will be wrong. 1940 ResourceMark rm(THREAD); 1941 GrowableArray<int>* idnums = new GrowableArray<int>(methods_length); 1942 int num_methods = 0; 1943 1944 for (int i = 0; i < methods_length; i++) { 1945 methodHandle method(THREAD, methods->at(i)); 1946 if (select_method(method, want_constructor)) { 1947 if (!publicOnly || method->is_public()) { 1948 idnums->push(method->method_idnum()); 1949 ++num_methods; 1983 { 1984 JVMWrapper("JVM_GetClassDeclaredMethods"); 1985 return get_class_declared_methods_helper(env, ofClass, publicOnly, 1986 /*want_constructor*/ false, 1987 SystemDictionary::reflect_Method_klass(), THREAD); 1988 } 1989 JVM_END 1990 1991 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)) 1992 { 1993 JVMWrapper("JVM_GetClassDeclaredConstructors"); 1994 return get_class_declared_methods_helper(env, ofClass, publicOnly, 1995 /*want_constructor*/ true, 1996 SystemDictionary::reflect_Constructor_klass(), THREAD); 1997 } 1998 JVM_END 1999 2000 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)) 2001 { 2002 JVMWrapper("JVM_GetClassAccessFlags"); 2003 oop mirror = JNIHandles::resolve_non_null(cls); 2004 if (java_lang_Class::is_primitive(mirror)) { 2005 // Primitive type 2006 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 2007 } 2008 2009 Klass* k = java_lang_Class::as_Klass(mirror); 2010 return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS; 2011 } 2012 JVM_END 2013 2014 JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member)) 2015 { 2016 JVMWrapper("JVM_AreNestMates"); 2017 Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current)); 2018 assert(c->is_instance_klass(), "must be"); 2019 InstanceKlass* ck = InstanceKlass::cast(c); 2020 Klass* m = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(member)); 2021 assert(m->is_instance_klass(), "must be"); 2022 InstanceKlass* mk = InstanceKlass::cast(m); 2023 return ck->has_nestmate_access_to(mk, THREAD); 2024 } 2025 JVM_END 2026 2027 JVM_ENTRY(jclass, JVM_GetNestHost(JNIEnv* env, jclass current)) 2028 { 2029 // current is not a primitive or array class 2104 objArrayOop r2 = oopFactory::new_objArray(SystemDictionary::Class_klass(), 2105 count + 1, CHECK_NULL); 2106 objArrayHandle result2(THREAD, r2); 2107 for (int i = 0; i < count + 1; i++) { 2108 result2->obj_at_put(i, result->obj_at(i)); 2109 } 2110 return (jobjectArray)JNIHandles::make_local(THREAD, result2()); 2111 } 2112 } 2113 else { 2114 assert(host == ck || ck->is_hidden(), "must be singleton nest or dynamic nestmate"); 2115 } 2116 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 2117 } 2118 } 2119 JVM_END 2120 2121 JVM_ENTRY(jobjectArray, JVM_GetPermittedSubclasses(JNIEnv* env, jclass current)) 2122 { 2123 JVMWrapper("JVM_GetPermittedSubclasses"); 2124 oop mirror = JNIHandles::resolve_non_null(current); 2125 assert(!java_lang_Class::is_primitive(mirror), "should not be"); 2126 Klass* c = java_lang_Class::as_Klass(mirror); 2127 assert(c->is_instance_klass(), "must be"); 2128 InstanceKlass* ik = InstanceKlass::cast(c); 2129 { 2130 JvmtiVMObjectAllocEventCollector oam; 2131 Array<u2>* subclasses = ik->permitted_subclasses(); 2132 int length = subclasses == NULL ? 0 : subclasses->length(); 2133 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 2134 length, CHECK_NULL); 2135 objArrayHandle result(THREAD, r); 2136 for (int i = 0; i < length; i++) { 2137 int cp_index = subclasses->at(i); 2138 // This returns <package-name>/<class-name>. 2139 Symbol* klass_name = ik->constants()->klass_name_at(cp_index); 2140 assert(klass_name != NULL, "Unexpected null klass_name"); 2141 Handle perm_subtype_h = java_lang_String::create_from_symbol(klass_name, CHECK_NULL); 2142 result->obj_at_put(i, perm_subtype_h()); 2143 } 2144 return (jobjectArray)JNIHandles::make_local(THREAD, result()); 2145 } 2146 } 2147 JVM_END 2148 2149 // Constant pool access ////////////////////////////////////////////////////////// 2150 2151 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls)) 2152 { 2153 JVMWrapper("JVM_GetClassConstantPool"); 2154 JvmtiVMObjectAllocEventCollector oam; 2155 oop mirror = JNIHandles::resolve_non_null(cls); 2156 // Return null for primitives and arrays 2157 if (!java_lang_Class::is_primitive(mirror)) { 2158 Klass* k = java_lang_Class::as_Klass(mirror); 2159 if (k->is_instance_klass()) { 2160 InstanceKlass* k_h = InstanceKlass::cast(k); 2161 Handle jcp = reflect_ConstantPool::create(CHECK_NULL); 2162 reflect_ConstantPool::set_cp(jcp(), k_h->constants()); 2163 return JNIHandles::make_local(THREAD, jcp()); 2164 } 2165 } 2166 return NULL; 2167 } 2168 JVM_END 2169 2170 2171 JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused)) 2172 { 2173 JVMWrapper("JVM_ConstantPoolGetSize"); 2174 constantPoolHandle cp = constantPoolHandle(THREAD, reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj))); 2175 return cp->length(); 2176 } 2177 JVM_END 2178 |