Mercurial > hg > truffle
comparison src/share/vm/prims/jvm.cpp @ 2177:3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them
Reviewed-by: never, acorn, jmasa, stefank
author | coleenp |
---|---|
date | Thu, 27 Jan 2011 16:11:27 -0800 |
parents | ccfcb502af3f |
children | d70fe6ab4436 |
comparison
equal
deleted
inserted
replaced
2176:27e4ea99855d | 2177:3582bf76420e |
---|---|
122 JavaThread* jthread = JavaThread::current(); | 122 JavaThread* jthread = JavaThread::current(); |
123 if (jthread->has_last_Java_frame()) { | 123 if (jthread->has_last_Java_frame()) { |
124 vframeStream vfst(jthread); | 124 vframeStream vfst(jthread); |
125 | 125 |
126 // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames | 126 // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames |
127 symbolHandle access_controller = oopFactory::new_symbol_handle("java/security/AccessController", CHECK); | 127 TempNewSymbol access_controller = SymbolTable::new_symbol("java/security/AccessController", CHECK); |
128 klassOop access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK); | 128 klassOop access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK); |
129 symbolHandle privileged_action = oopFactory::new_symbol_handle("java/security/PrivilegedAction", CHECK); | 129 TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK); |
130 klassOop privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK); | 130 klassOop privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK); |
131 | 131 |
132 methodOop last_caller = NULL; | 132 methodOop last_caller = NULL; |
133 | 133 |
134 while (!vfst.at_end()) { | 134 while (!vfst.at_end()) { |
173 line_number = vfst.method()->line_number_from_bci(vfst.bci()); | 173 line_number = vfst.method()->line_number_from_bci(vfst.bci()); |
174 if (line_number == -1) { | 174 if (line_number == -1) { |
175 // show method name if it's a native method | 175 // show method name if it's a native method |
176 trace = vfst.method()->name_and_sig_as_C_string(); | 176 trace = vfst.method()->name_and_sig_as_C_string(); |
177 } | 177 } |
178 symbolOop s = instanceKlass::cast(caller)->source_file_name(); | 178 Symbol* s = instanceKlass::cast(caller)->source_file_name(); |
179 if (s != NULL) { | 179 if (s != NULL) { |
180 source_file = s->as_C_string(); | 180 source_file = s->as_C_string(); |
181 } | 181 } |
182 } | 182 } |
183 } | 183 } |
309 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK); | 309 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK); |
310 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK); | 310 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK); |
311 JavaCalls::call_virtual(&r, | 311 JavaCalls::call_virtual(&r, |
312 props, | 312 props, |
313 KlassHandle(THREAD, SystemDictionary::Properties_klass()), | 313 KlassHandle(THREAD, SystemDictionary::Properties_klass()), |
314 vmSymbolHandles::put_name(), | 314 vmSymbols::put_name(), |
315 vmSymbolHandles::object_object_object_signature(), | 315 vmSymbols::object_object_object_signature(), |
316 key_str, | 316 key_str, |
317 value_str, | 317 value_str, |
318 THREAD); | 318 THREAD); |
319 } | 319 } |
320 | 320 |
714 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env, | 714 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env, |
715 const char* name)) | 715 const char* name)) |
716 JVMWrapper2("JVM_FindClassFromBootLoader %s", name); | 716 JVMWrapper2("JVM_FindClassFromBootLoader %s", name); |
717 | 717 |
718 // Java libraries should ensure that name is never null... | 718 // Java libraries should ensure that name is never null... |
719 if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { | 719 if (name == NULL || (int)strlen(name) > Symbol::max_length()) { |
720 // It's impossible to create this class; the name cannot fit | 720 // It's impossible to create this class; the name cannot fit |
721 // into the constant pool. | 721 // into the constant pool. |
722 return NULL; | 722 return NULL; |
723 } | 723 } |
724 | 724 |
725 symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL); | 725 TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); |
726 klassOop k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL); | 726 klassOop k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL); |
727 if (k == NULL) { | 727 if (k == NULL) { |
728 return NULL; | 728 return NULL; |
729 } | 729 } |
730 | 730 |
738 jboolean init, jobject loader, | 738 jboolean init, jobject loader, |
739 jboolean throwError)) | 739 jboolean throwError)) |
740 JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name, | 740 JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name, |
741 throwError ? "error" : "exception"); | 741 throwError ? "error" : "exception"); |
742 // Java libraries should ensure that name is never null... | 742 // Java libraries should ensure that name is never null... |
743 if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { | 743 if (name == NULL || (int)strlen(name) > Symbol::max_length()) { |
744 // It's impossible to create this class; the name cannot fit | 744 // It's impossible to create this class; the name cannot fit |
745 // into the constant pool. | 745 // into the constant pool. |
746 if (throwError) { | 746 if (throwError) { |
747 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); | 747 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); |
748 } else { | 748 } else { |
749 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name); | 749 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name); |
750 } | 750 } |
751 } | 751 } |
752 symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL); | 752 TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); |
753 Handle h_loader(THREAD, JNIHandles::resolve(loader)); | 753 Handle h_loader(THREAD, JNIHandles::resolve(loader)); |
754 jclass result = find_class_from_class_loader(env, h_name, init, h_loader, | 754 jclass result = find_class_from_class_loader(env, h_name, init, h_loader, |
755 Handle(), throwError, THREAD); | 755 Handle(), throwError, THREAD); |
756 | 756 |
757 if (TraceClassResolution && result != NULL) { | 757 if (TraceClassResolution && result != NULL) { |
762 | 762 |
763 | 763 |
764 JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name, | 764 JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name, |
765 jboolean init, jclass from)) | 765 jboolean init, jclass from)) |
766 JVMWrapper2("JVM_FindClassFromClass %s", name); | 766 JVMWrapper2("JVM_FindClassFromClass %s", name); |
767 if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { | 767 if (name == NULL || (int)strlen(name) > Symbol::max_length()) { |
768 // It's impossible to create this class; the name cannot fit | 768 // It's impossible to create this class; the name cannot fit |
769 // into the constant pool. | 769 // into the constant pool. |
770 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); | 770 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); |
771 } | 771 } |
772 symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL); | 772 TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); |
773 oop from_class_oop = JNIHandles::resolve(from); | 773 oop from_class_oop = JNIHandles::resolve(from); |
774 klassOop from_class = (from_class_oop == NULL) | 774 klassOop from_class = (from_class_oop == NULL) |
775 ? (klassOop)NULL | 775 ? (klassOop)NULL |
776 : java_lang_Class::as_klassOop(from_class_oop); | 776 : java_lang_Class::as_klassOop(from_class_oop); |
777 oop class_loader = NULL; | 777 oop class_loader = NULL; |
836 ClassLoader::perf_app_classfile_bytes_read()->inc(len); | 836 ClassLoader::perf_app_classfile_bytes_read()->inc(len); |
837 } | 837 } |
838 | 838 |
839 // Since exceptions can be thrown, class initialization can take place | 839 // Since exceptions can be thrown, class initialization can take place |
840 // if name is NULL no check for class name in .class stream has to be made. | 840 // if name is NULL no check for class name in .class stream has to be made. |
841 symbolHandle class_name; | 841 TempNewSymbol class_name = NULL; |
842 if (name != NULL) { | 842 if (name != NULL) { |
843 const int str_len = (int)strlen(name); | 843 const int str_len = (int)strlen(name); |
844 if (str_len > symbolOopDesc::max_length()) { | 844 if (str_len > Symbol::max_length()) { |
845 // It's impossible to create this class; the name cannot fit | 845 // It's impossible to create this class; the name cannot fit |
846 // into the constant pool. | 846 // into the constant pool. |
847 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); | 847 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); |
848 } | 848 } |
849 class_name = oopFactory::new_symbol_handle(name, str_len, CHECK_NULL); | 849 class_name = SymbolTable::new_symbol(name, str_len, CHECK_NULL); |
850 } | 850 } |
851 | 851 |
852 ResourceMark rm(THREAD); | 852 ResourceMark rm(THREAD); |
853 ClassFileStream st((u1*) buf, len, (char *)source); | 853 ClassFileStream st((u1*) buf, len, (char *)source); |
854 Handle class_loader (THREAD, JNIHandles::resolve(loader)); | 854 Handle class_loader (THREAD, JNIHandles::resolve(loader)); |
903 const char* str = java_lang_String::as_utf8_string(string()); | 903 const char* str = java_lang_String::as_utf8_string(string()); |
904 // Sanity check, don't expect null | 904 // Sanity check, don't expect null |
905 if (str == NULL) return NULL; | 905 if (str == NULL) return NULL; |
906 | 906 |
907 const int str_len = (int)strlen(str); | 907 const int str_len = (int)strlen(str); |
908 if (str_len > symbolOopDesc::max_length()) { | 908 if (str_len > Symbol::max_length()) { |
909 // It's impossible to create this class; the name cannot fit | 909 // It's impossible to create this class; the name cannot fit |
910 // into the constant pool. | 910 // into the constant pool. |
911 return NULL; | 911 return NULL; |
912 } | 912 } |
913 symbolHandle klass_name = oopFactory::new_symbol_handle(str, str_len,CHECK_NULL); | 913 TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len, CHECK_NULL); |
914 | 914 |
915 // Security Note: | 915 // Security Note: |
916 // The Java level wrapper will perform the necessary security check allowing | 916 // The Java level wrapper will perform the necessary security check allowing |
917 // us to pass the NULL as the initiating class loader. | 917 // us to pass the NULL as the initiating class loader. |
918 Handle h_loader(THREAD, JNIHandles::resolve(loader)); | 918 Handle h_loader(THREAD, JNIHandles::resolve(loader)); |
1153 | 1153 |
1154 if ( pending_exception->is_a(SystemDictionary::Exception_klass()) && | 1154 if ( pending_exception->is_a(SystemDictionary::Exception_klass()) && |
1155 !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) { | 1155 !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) { |
1156 // Throw a java.security.PrivilegedActionException(Exception e) exception | 1156 // Throw a java.security.PrivilegedActionException(Exception e) exception |
1157 JavaCallArguments args(pending_exception); | 1157 JavaCallArguments args(pending_exception); |
1158 THROW_ARG_0(vmSymbolHandles::java_security_PrivilegedActionException(), | 1158 THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(), |
1159 vmSymbolHandles::exception_void_signature(), | 1159 vmSymbols::exception_void_signature(), |
1160 &args); | 1160 &args); |
1161 } | 1161 } |
1162 } | 1162 } |
1163 | 1163 |
1164 if (pending_exception.not_null()) THROW_OOP_0(pending_exception()); | 1164 if (pending_exception.not_null()) THROW_OOP_0(pending_exception()); |
1450 ResourceMark rm(THREAD); | 1450 ResourceMark rm(THREAD); |
1451 // Return null for arrays and primatives | 1451 // Return null for arrays and primatives |
1452 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { | 1452 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { |
1453 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls)); | 1453 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls)); |
1454 if (Klass::cast(k)->oop_is_instance()) { | 1454 if (Klass::cast(k)->oop_is_instance()) { |
1455 symbolHandle sym = symbolHandle(THREAD, instanceKlass::cast(k)->generic_signature()); | 1455 Symbol* sym = instanceKlass::cast(k)->generic_signature(); |
1456 if (sym.is_null()) return NULL; | 1456 if (sym == NULL) return NULL; |
1457 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); | 1457 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); |
1458 return (jstring) JNIHandles::make_local(env, str()); | 1458 return (jstring) JNIHandles::make_local(env, str()); |
1459 } | 1459 } |
1460 } | 1460 } |
1461 return NULL; | 1461 return NULL; |
1840 } else { | 1840 } else { |
1841 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref); | 1841 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref); |
1842 if (k_o == NULL) return NULL; | 1842 if (k_o == NULL) return NULL; |
1843 } | 1843 } |
1844 instanceKlassHandle k(THREAD, k_o); | 1844 instanceKlassHandle k(THREAD, k_o); |
1845 symbolOop name = cp->uncached_name_ref_at(index); | 1845 Symbol* name = cp->uncached_name_ref_at(index); |
1846 symbolOop sig = cp->uncached_signature_ref_at(index); | 1846 Symbol* sig = cp->uncached_signature_ref_at(index); |
1847 methodHandle m (THREAD, k->find_method(name, sig)); | 1847 methodHandle m (THREAD, k->find_method(name, sig)); |
1848 if (m.is_null()) { | 1848 if (m.is_null()) { |
1849 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class"); | 1849 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class"); |
1850 } | 1850 } |
1851 oop method; | 1851 oop method; |
1891 } else { | 1891 } else { |
1892 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref); | 1892 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref); |
1893 if (k_o == NULL) return NULL; | 1893 if (k_o == NULL) return NULL; |
1894 } | 1894 } |
1895 instanceKlassHandle k(THREAD, k_o); | 1895 instanceKlassHandle k(THREAD, k_o); |
1896 symbolOop name = cp->uncached_name_ref_at(index); | 1896 Symbol* name = cp->uncached_name_ref_at(index); |
1897 symbolOop sig = cp->uncached_signature_ref_at(index); | 1897 Symbol* sig = cp->uncached_signature_ref_at(index); |
1898 fieldDescriptor fd; | 1898 fieldDescriptor fd; |
1899 klassOop target_klass = k->find_field(name, sig, &fd); | 1899 klassOop target_klass = k->find_field(name, sig, &fd); |
1900 if (target_klass == NULL) { | 1900 if (target_klass == NULL) { |
1901 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class"); | 1901 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class"); |
1902 } | 1902 } |
1935 constantTag tag = cp->tag_at(index); | 1935 constantTag tag = cp->tag_at(index); |
1936 if (!tag.is_field_or_method()) { | 1936 if (!tag.is_field_or_method()) { |
1937 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); | 1937 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); |
1938 } | 1938 } |
1939 int klass_ref = cp->uncached_klass_ref_index_at(index); | 1939 int klass_ref = cp->uncached_klass_ref_index_at(index); |
1940 symbolHandle klass_name (THREAD, cp->klass_name_at(klass_ref)); | 1940 Symbol* klass_name = cp->klass_name_at(klass_ref); |
1941 symbolHandle member_name(THREAD, cp->uncached_name_ref_at(index)); | 1941 Symbol* member_name = cp->uncached_name_ref_at(index); |
1942 symbolHandle member_sig (THREAD, cp->uncached_signature_ref_at(index)); | 1942 Symbol* member_sig = cp->uncached_signature_ref_at(index); |
1943 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::String_klass(), 3, CHECK_NULL); | 1943 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::String_klass(), 3, CHECK_NULL); |
1944 objArrayHandle dest(THREAD, dest_o); | 1944 objArrayHandle dest(THREAD, dest_o); |
1945 Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL); | 1945 Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL); |
1946 dest->obj_at_put(0, str()); | 1946 dest->obj_at_put(0, str()); |
1947 str = java_lang_String::create_from_symbol(member_name, CHECK_NULL); | 1947 str = java_lang_String::create_from_symbol(member_name, CHECK_NULL); |
2026 bounds_check(cp, index, CHECK_NULL); | 2026 bounds_check(cp, index, CHECK_NULL); |
2027 constantTag tag = cp->tag_at(index); | 2027 constantTag tag = cp->tag_at(index); |
2028 if (!tag.is_symbol()) { | 2028 if (!tag.is_symbol()) { |
2029 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); | 2029 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); |
2030 } | 2030 } |
2031 symbolOop sym_o = cp->symbol_at(index); | 2031 Symbol* sym = cp->symbol_at(index); |
2032 symbolHandle sym(THREAD, sym_o); | |
2033 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); | 2032 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); |
2034 return (jstring) JNIHandles::make_local(str()); | 2033 return (jstring) JNIHandles::make_local(str()); |
2035 } | 2034 } |
2036 JVM_END | 2035 JVM_END |
2037 | 2036 |
2354 JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)) | 2353 JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)) |
2355 JVMWrapper("JVM_GetCPClassNameUTF"); | 2354 JVMWrapper("JVM_GetCPClassNameUTF"); |
2356 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); | 2355 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); |
2357 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); | 2356 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2358 constantPoolOop cp = instanceKlass::cast(k)->constants(); | 2357 constantPoolOop cp = instanceKlass::cast(k)->constants(); |
2359 symbolOop classname = cp->klass_name_at(cp_index); | 2358 Symbol* classname = cp->klass_name_at(cp_index); |
2360 return classname->as_utf8(); | 2359 return classname->as_utf8(); |
2361 JVM_END | 2360 JVM_END |
2362 | 2361 |
2363 | 2362 |
2364 JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)) | 2363 JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)) |
2367 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); | 2366 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); |
2368 constantPoolOop cp = instanceKlass::cast(k)->constants(); | 2367 constantPoolOop cp = instanceKlass::cast(k)->constants(); |
2369 switch (cp->tag_at(cp_index).value()) { | 2368 switch (cp->tag_at(cp_index).value()) { |
2370 case JVM_CONSTANT_Fieldref: { | 2369 case JVM_CONSTANT_Fieldref: { |
2371 int class_index = cp->uncached_klass_ref_index_at(cp_index); | 2370 int class_index = cp->uncached_klass_ref_index_at(cp_index); |
2372 symbolOop classname = cp->klass_name_at(class_index); | 2371 Symbol* classname = cp->klass_name_at(class_index); |
2373 return classname->as_utf8(); | 2372 return classname->as_utf8(); |
2374 } | 2373 } |
2375 default: | 2374 default: |
2376 fatal("JVM_GetCPFieldClassNameUTF: illegal constant"); | 2375 fatal("JVM_GetCPFieldClassNameUTF: illegal constant"); |
2377 } | 2376 } |
2387 constantPoolOop cp = instanceKlass::cast(k)->constants(); | 2386 constantPoolOop cp = instanceKlass::cast(k)->constants(); |
2388 switch (cp->tag_at(cp_index).value()) { | 2387 switch (cp->tag_at(cp_index).value()) { |
2389 case JVM_CONSTANT_Methodref: | 2388 case JVM_CONSTANT_Methodref: |
2390 case JVM_CONSTANT_InterfaceMethodref: { | 2389 case JVM_CONSTANT_InterfaceMethodref: { |
2391 int class_index = cp->uncached_klass_ref_index_at(cp_index); | 2390 int class_index = cp->uncached_klass_ref_index_at(cp_index); |
2392 symbolOop classname = cp->klass_name_at(class_index); | 2391 Symbol* classname = cp->klass_name_at(class_index); |
2393 return classname->as_utf8(); | 2392 return classname->as_utf8(); |
2394 } | 2393 } |
2395 default: | 2394 default: |
2396 fatal("JVM_GetCPMethodClassNameUTF: illegal constant"); | 2395 fatal("JVM_GetCPMethodClassNameUTF: illegal constant"); |
2397 } | 2396 } |
2408 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread); | 2407 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread); |
2409 constantPoolOop cp = instanceKlass::cast(k)->constants(); | 2408 constantPoolOop cp = instanceKlass::cast(k)->constants(); |
2410 constantPoolOop cp_called = instanceKlass::cast(k_called)->constants(); | 2409 constantPoolOop cp_called = instanceKlass::cast(k_called)->constants(); |
2411 switch (cp->tag_at(cp_index).value()) { | 2410 switch (cp->tag_at(cp_index).value()) { |
2412 case JVM_CONSTANT_Fieldref: { | 2411 case JVM_CONSTANT_Fieldref: { |
2413 symbolOop name = cp->uncached_name_ref_at(cp_index); | 2412 Symbol* name = cp->uncached_name_ref_at(cp_index); |
2414 symbolOop signature = cp->uncached_signature_ref_at(cp_index); | 2413 Symbol* signature = cp->uncached_signature_ref_at(cp_index); |
2415 typeArrayOop fields = instanceKlass::cast(k_called)->fields(); | 2414 typeArrayOop fields = instanceKlass::cast(k_called)->fields(); |
2416 int fields_count = fields->length(); | 2415 int fields_count = fields->length(); |
2417 for (int i = 0; i < fields_count; i += instanceKlass::next_offset) { | 2416 for (int i = 0; i < fields_count; i += instanceKlass::next_offset) { |
2418 if (cp_called->symbol_at(fields->ushort_at(i + instanceKlass::name_index_offset)) == name && | 2417 if (cp_called->symbol_at(fields->ushort_at(i + instanceKlass::name_index_offset)) == name && |
2419 cp_called->symbol_at(fields->ushort_at(i + instanceKlass::signature_index_offset)) == signature) { | 2418 cp_called->symbol_at(fields->ushort_at(i + instanceKlass::signature_index_offset)) == signature) { |
2438 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread); | 2437 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread); |
2439 constantPoolOop cp = instanceKlass::cast(k)->constants(); | 2438 constantPoolOop cp = instanceKlass::cast(k)->constants(); |
2440 switch (cp->tag_at(cp_index).value()) { | 2439 switch (cp->tag_at(cp_index).value()) { |
2441 case JVM_CONSTANT_Methodref: | 2440 case JVM_CONSTANT_Methodref: |
2442 case JVM_CONSTANT_InterfaceMethodref: { | 2441 case JVM_CONSTANT_InterfaceMethodref: { |
2443 symbolOop name = cp->uncached_name_ref_at(cp_index); | 2442 Symbol* name = cp->uncached_name_ref_at(cp_index); |
2444 symbolOop signature = cp->uncached_signature_ref_at(cp_index); | 2443 Symbol* signature = cp->uncached_signature_ref_at(cp_index); |
2445 objArrayOop methods = instanceKlass::cast(k_called)->methods(); | 2444 objArrayOop methods = instanceKlass::cast(k_called)->methods(); |
2446 int methods_count = methods->length(); | 2445 int methods_count = methods->length(); |
2447 for (int i = 0; i < methods_count; i++) { | 2446 for (int i = 0; i < methods_count; i++) { |
2448 methodOop method = methodOop(methods->obj_at(i)); | 2447 methodOop method = methodOop(methods->obj_at(i)); |
2449 if (method->name() == name && method->signature() == signature) { | 2448 if (method->name() == name && method->signature() == signature) { |
2627 Handle obj(THREAD, thread->threadObj()); | 2626 Handle obj(THREAD, thread->threadObj()); |
2628 JavaValue result(T_VOID); | 2627 JavaValue result(T_VOID); |
2629 JavaCalls::call_virtual(&result, | 2628 JavaCalls::call_virtual(&result, |
2630 obj, | 2629 obj, |
2631 KlassHandle(THREAD, SystemDictionary::Thread_klass()), | 2630 KlassHandle(THREAD, SystemDictionary::Thread_klass()), |
2632 vmSymbolHandles::run_method_name(), | 2631 vmSymbols::run_method_name(), |
2633 vmSymbolHandles::void_method_signature(), | 2632 vmSymbols::void_method_signature(), |
2634 THREAD); | 2633 THREAD); |
2635 } | 2634 } |
2636 | 2635 |
2637 | 2636 |
2638 JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread)) | 2637 JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread)) |
3111 ResourceMark rm(THREAD); | 3110 ResourceMark rm(THREAD); |
3112 Handle h_name (THREAD, JNIHandles::resolve_non_null(name)); | 3111 Handle h_name (THREAD, JNIHandles::resolve_non_null(name)); |
3113 Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0); | 3112 Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0); |
3114 | 3113 |
3115 const char* str = java_lang_String::as_utf8_string(class_name_str()); | 3114 const char* str = java_lang_String::as_utf8_string(class_name_str()); |
3116 symbolHandle class_name_sym = | 3115 TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str)); |
3117 symbolHandle(THREAD, SymbolTable::probe(str, (int)strlen(str))); | 3116 if (class_name_sym == NULL) { |
3118 if (class_name_sym.is_null()) { | |
3119 return -1; | 3117 return -1; |
3120 } | 3118 } |
3121 | 3119 |
3122 int depth = 0; | 3120 int depth = 0; |
3123 | 3121 |
3124 for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { | 3122 for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { |
3125 if (!vfst.method()->is_native()) { | 3123 if (!vfst.method()->is_native()) { |
3126 klassOop holder = vfst.method()->method_holder(); | 3124 klassOop holder = vfst.method()->method_holder(); |
3127 assert(holder->is_klass(), "just checking"); | 3125 assert(holder->is_klass(), "just checking"); |
3128 if (instanceKlass::cast(holder)->name() == class_name_sym()) { | 3126 if (instanceKlass::cast(holder)->name() == class_name_sym) { |
3129 return depth; | 3127 return depth; |
3130 } | 3128 } |
3131 depth++; | 3129 depth++; |
3132 } | 3130 } |
3133 } | 3131 } |
3322 Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName)); | 3320 Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName)); |
3323 Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL); | 3321 Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL); |
3324 | 3322 |
3325 const char* str = java_lang_String::as_utf8_string(string()); | 3323 const char* str = java_lang_String::as_utf8_string(string()); |
3326 | 3324 |
3327 if (str == NULL || (int)strlen(str) > symbolOopDesc::max_length()) { | 3325 if (str == NULL || (int)strlen(str) > Symbol::max_length()) { |
3328 // It's impossible to create this class; the name cannot fit | 3326 // It's impossible to create this class; the name cannot fit |
3329 // into the constant pool. | 3327 // into the constant pool. |
3330 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str); | 3328 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str); |
3331 } | 3329 } |
3332 | 3330 |
3333 symbolHandle name = oopFactory::new_symbol_handle(str, CHECK_NULL); | 3331 TempNewSymbol name = SymbolTable::new_symbol(str, CHECK_NULL); |
3334 Handle curr_klass (THREAD, JNIHandles::resolve(currClass)); | 3332 Handle curr_klass (THREAD, JNIHandles::resolve(currClass)); |
3335 // Find the most recent class on the stack with a non-null classloader | 3333 // Find the most recent class on the stack with a non-null classloader |
3336 oop loader = NULL; | 3334 oop loader = NULL; |
3337 oop protection_domain = NULL; | 3335 oop protection_domain = NULL; |
3338 if (curr_klass.is_null()) { | 3336 if (curr_klass.is_null()) { |
3971 JVM_END | 3969 JVM_END |
3972 | 3970 |
3973 | 3971 |
3974 // Shared JNI/JVM entry points ////////////////////////////////////////////////////////////// | 3972 // Shared JNI/JVM entry points ////////////////////////////////////////////////////////////// |
3975 | 3973 |
3976 jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) { | 3974 jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) { |
3977 // Security Note: | 3975 // Security Note: |
3978 // The Java level wrapper will perform the necessary security check allowing | 3976 // The Java level wrapper will perform the necessary security check allowing |
3979 // us to pass the NULL as the initiating class loader. | 3977 // us to pass the NULL as the initiating class loader. |
3980 klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL); | 3978 klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL); |
3981 | 3979 |
4067 JvmtiVMObjectAllocEventCollector oam; | 4065 JvmtiVMObjectAllocEventCollector oam; |
4068 if (name == NULL) return NULL; | 4066 if (name == NULL) return NULL; |
4069 Handle str (THREAD, JNIHandles::resolve_non_null(name)); | 4067 Handle str (THREAD, JNIHandles::resolve_non_null(name)); |
4070 | 4068 |
4071 const char* cstr = java_lang_String::as_utf8_string(str()); | 4069 const char* cstr = java_lang_String::as_utf8_string(str()); |
4072 symbolHandle field_name = | 4070 TempNewSymbol field_name = SymbolTable::probe(cstr, (int)strlen(cstr)); |
4073 symbolHandle(THREAD, SymbolTable::probe(cstr, (int)strlen(cstr))); | 4071 if (field_name == NULL) { |
4074 if (field_name.is_null()) { | |
4075 THROW_0(vmSymbols::java_lang_NoSuchFieldException()); | 4072 THROW_0(vmSymbols::java_lang_NoSuchFieldException()); |
4076 } | 4073 } |
4077 | 4074 |
4078 oop mirror = JNIHandles::resolve_non_null(cls); | 4075 oop mirror = JNIHandles::resolve_non_null(cls); |
4079 oop result = Reflection::reflect_field(mirror, field_name(), which, CHECK_NULL); | 4076 oop result = Reflection::reflect_field(mirror, field_name, which, CHECK_NULL); |
4080 if (result == NULL) { | 4077 if (result == NULL) { |
4081 THROW_0(vmSymbols::java_lang_NoSuchFieldException()); | 4078 THROW_0(vmSymbols::java_lang_NoSuchFieldException()); |
4082 } | 4079 } |
4083 return JNIHandles::make_local(env, result); | 4080 return JNIHandles::make_local(env, result); |
4084 JVM_END | 4081 JVM_END |
4091 THROW_0(vmSymbols::java_lang_NullPointerException()); | 4088 THROW_0(vmSymbols::java_lang_NullPointerException()); |
4092 } | 4089 } |
4093 Handle str (THREAD, JNIHandles::resolve_non_null(name)); | 4090 Handle str (THREAD, JNIHandles::resolve_non_null(name)); |
4094 | 4091 |
4095 const char* cstr = java_lang_String::as_utf8_string(str()); | 4092 const char* cstr = java_lang_String::as_utf8_string(str()); |
4096 symbolHandle method_name = | 4093 TempNewSymbol method_name = SymbolTable::probe(cstr, (int)strlen(cstr)); |
4097 symbolHandle(THREAD, SymbolTable::probe(cstr, (int)strlen(cstr))); | 4094 if (method_name == NULL) { |
4098 if (method_name.is_null()) { | |
4099 THROW_0(vmSymbols::java_lang_NoSuchMethodException()); | 4095 THROW_0(vmSymbols::java_lang_NoSuchMethodException()); |
4100 } | 4096 } |
4101 | 4097 |
4102 oop mirror = JNIHandles::resolve_non_null(cls); | 4098 oop mirror = JNIHandles::resolve_non_null(cls); |
4103 objArrayHandle tarray (THREAD, objArrayOop(JNIHandles::resolve(types))); | 4099 objArrayHandle tarray (THREAD, objArrayOop(JNIHandles::resolve(types))); |
4466 objArrayHandle dest(THREAD, dest_o); | 4462 objArrayHandle dest(THREAD, dest_o); |
4467 klassOop enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL); | 4463 klassOop enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL); |
4468 dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror()); | 4464 dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror()); |
4469 int encl_method_method_idx = ik_h->enclosing_method_method_index(); | 4465 int encl_method_method_idx = ik_h->enclosing_method_method_index(); |
4470 if (encl_method_method_idx != 0) { | 4466 if (encl_method_method_idx != 0) { |
4471 symbolOop sym_o = ik_h->constants()->symbol_at( | 4467 Symbol* sym = ik_h->constants()->symbol_at( |
4472 extract_low_short_from_int( | 4468 extract_low_short_from_int( |
4473 ik_h->constants()->name_and_type_at(encl_method_method_idx))); | 4469 ik_h->constants()->name_and_type_at(encl_method_method_idx))); |
4474 symbolHandle sym(THREAD, sym_o); | |
4475 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); | 4470 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); |
4476 dest->obj_at_put(1, str()); | 4471 dest->obj_at_put(1, str()); |
4477 sym_o = ik_h->constants()->symbol_at( | 4472 sym = ik_h->constants()->symbol_at( |
4478 extract_high_short_from_int( | 4473 extract_high_short_from_int( |
4479 ik_h->constants()->name_and_type_at(encl_method_method_idx))); | 4474 ik_h->constants()->name_and_type_at(encl_method_method_idx))); |
4480 sym = symbolHandle(THREAD, sym_o); | |
4481 str = java_lang_String::create_from_symbol(sym, CHECK_NULL); | 4475 str = java_lang_String::create_from_symbol(sym, CHECK_NULL); |
4482 dest->obj_at_put(2, str()); | 4476 dest->obj_at_put(2, str()); |
4483 } | 4477 } |
4484 return (jobjectArray) JNIHandles::make_local(dest()); | 4478 return (jobjectArray) JNIHandles::make_local(dest()); |
4485 } | 4479 } |