1791 JVM_END 1792 1793 1794 static void bounds_check(constantPoolHandle cp, jint index, TRAPS) { 1795 if (!cp->is_within_bounds(index)) { 1796 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds"); 1797 } 1798 } 1799 1800 1801 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)) 1802 { 1803 JVMWrapper("JVM_ConstantPoolGetClassAt"); 1804 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool))); 1805 bounds_check(cp, index, CHECK_NULL); 1806 constantTag tag = cp->tag_at(index); 1807 if (!tag.is_klass() && !tag.is_unresolved_klass()) { 1808 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); 1809 } 1810 klassOop k = cp->klass_at(index, CHECK_NULL); 1811 return (jclass) JNIHandles::make_local(k->klass_part()->java_mirror()); 1812 } 1813 JVM_END 1814 1815 1816 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)) 1817 { 1818 JVMWrapper("JVM_ConstantPoolGetClassAtIfLoaded"); 1819 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool))); 1820 bounds_check(cp, index, CHECK_NULL); 1821 constantTag tag = cp->tag_at(index); 1822 if (!tag.is_klass() && !tag.is_unresolved_klass()) { 1823 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); 1824 } 1825 klassOop k = constantPoolOopDesc::klass_at_if_loaded(cp, index); 1826 if (k == NULL) return NULL; 1827 return (jclass) JNIHandles::make_local(k->klass_part()->java_mirror()); 1828 } 1829 JVM_END 1830 1831 static jobject get_method_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) { 1832 constantTag tag = cp->tag_at(index); 1833 if (!tag.is_method() && !tag.is_interface_method()) { 1834 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); 1835 } 1836 int klass_ref = cp->uncached_klass_ref_index_at(index); 1837 klassOop k_o; 1838 if (force_resolution) { 1839 k_o = cp->klass_at(klass_ref, CHECK_NULL); 1840 } else { 1841 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref); 1842 if (k_o == NULL) return NULL; 1843 } 1844 instanceKlassHandle k(THREAD, k_o); 1845 Symbol* name = cp->uncached_name_ref_at(index); 1846 Symbol* sig = cp->uncached_signature_ref_at(index); 1847 methodHandle m (THREAD, k->find_method(name, sig)); | 1791 JVM_END 1792 1793 1794 static void bounds_check(constantPoolHandle cp, jint index, TRAPS) { 1795 if (!cp->is_within_bounds(index)) { 1796 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds"); 1797 } 1798 } 1799 1800 1801 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)) 1802 { 1803 JVMWrapper("JVM_ConstantPoolGetClassAt"); 1804 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool))); 1805 bounds_check(cp, index, CHECK_NULL); 1806 constantTag tag = cp->tag_at(index); 1807 if (!tag.is_klass() && !tag.is_unresolved_klass()) { 1808 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); 1809 } 1810 klassOop k = cp->klass_at(index, CHECK_NULL); 1811 return (jclass) JNIHandles::make_local(k->java_mirror()); 1812 } 1813 JVM_END 1814 1815 1816 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)) 1817 { 1818 JVMWrapper("JVM_ConstantPoolGetClassAtIfLoaded"); 1819 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool))); 1820 bounds_check(cp, index, CHECK_NULL); 1821 constantTag tag = cp->tag_at(index); 1822 if (!tag.is_klass() && !tag.is_unresolved_klass()) { 1823 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); 1824 } 1825 klassOop k = constantPoolOopDesc::klass_at_if_loaded(cp, index); 1826 if (k == NULL) return NULL; 1827 return (jclass) JNIHandles::make_local(k->java_mirror()); 1828 } 1829 JVM_END 1830 1831 static jobject get_method_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) { 1832 constantTag tag = cp->tag_at(index); 1833 if (!tag.is_method() && !tag.is_interface_method()) { 1834 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); 1835 } 1836 int klass_ref = cp->uncached_klass_ref_index_at(index); 1837 klassOop k_o; 1838 if (force_resolution) { 1839 k_o = cp->klass_at(klass_ref, CHECK_NULL); 1840 } else { 1841 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref); 1842 if (k_o == NULL) return NULL; 1843 } 1844 instanceKlassHandle k(THREAD, k_o); 1845 Symbol* name = cp->uncached_name_ref_at(index); 1846 Symbol* sig = cp->uncached_signature_ref_at(index); 1847 methodHandle m (THREAD, k->find_method(name, sig)); |