comparison src/share/vm/prims/jvmtiRedefineClasses.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 8012aa3ccede
children c5a923563727
comparison
equal deleted inserted replaced
2176:27e4ea99855d 2177:3582bf76420e
233 // This was an indirect CP entry, but it has been changed into 233 // This was an indirect CP entry, but it has been changed into
234 // an interned string so this entry can be directly appended. 234 // an interned string so this entry can be directly appended.
235 case JVM_CONSTANT_String: // fall through 235 case JVM_CONSTANT_String: // fall through
236 236
237 // These were indirect CP entries, but they have been changed into 237 // These were indirect CP entries, but they have been changed into
238 // symbolOops so these entries can be directly appended. 238 // Symbol*s so these entries can be directly appended.
239 case JVM_CONSTANT_UnresolvedClass: // fall through 239 case JVM_CONSTANT_UnresolvedClass: // fall through
240 case JVM_CONSTANT_UnresolvedString: 240 case JVM_CONSTANT_UnresolvedString:
241 { 241 {
242 constantPoolOopDesc::copy_entry_to(scratch_cp, scratch_i, *merge_cp_p, *merge_cp_length_p, 242 constantPoolOopDesc::copy_entry_to(scratch_cp, scratch_i, *merge_cp_p, *merge_cp_length_p,
243 THREAD); 243 THREAD);
573 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED; 573 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED;
574 } 574 }
575 // name and signature 575 // name and signature
576 jshort name_index = k_old_fields->short_at(i + instanceKlass::name_index_offset); 576 jshort name_index = k_old_fields->short_at(i + instanceKlass::name_index_offset);
577 jshort sig_index = k_old_fields->short_at(i +instanceKlass::signature_index_offset); 577 jshort sig_index = k_old_fields->short_at(i +instanceKlass::signature_index_offset);
578 symbolOop name_sym1 = the_class->constants()->symbol_at(name_index); 578 Symbol* name_sym1 = the_class->constants()->symbol_at(name_index);
579 symbolOop sig_sym1 = the_class->constants()->symbol_at(sig_index); 579 Symbol* sig_sym1 = the_class->constants()->symbol_at(sig_index);
580 name_index = k_new_fields->short_at(i + instanceKlass::name_index_offset); 580 name_index = k_new_fields->short_at(i + instanceKlass::name_index_offset);
581 sig_index = k_new_fields->short_at(i + instanceKlass::signature_index_offset); 581 sig_index = k_new_fields->short_at(i + instanceKlass::signature_index_offset);
582 symbolOop name_sym2 = scratch_class->constants()->symbol_at(name_index); 582 Symbol* name_sym2 = scratch_class->constants()->symbol_at(name_index);
583 symbolOop sig_sym2 = scratch_class->constants()->symbol_at(sig_index); 583 Symbol* sig_sym2 = scratch_class->constants()->symbol_at(sig_index);
584 if (name_sym1 != name_sym2 || sig_sym1 != sig_sym2) { 584 if (name_sym1 != name_sym2 || sig_sym1 != sig_sym2) {
585 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED; 585 return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED;
586 } 586 }
587 } 587 }
588 588
853 if (!is_modifiable_class(mirror)) { 853 if (!is_modifiable_class(mirror)) {
854 return JVMTI_ERROR_UNMODIFIABLE_CLASS; 854 return JVMTI_ERROR_UNMODIFIABLE_CLASS;
855 } 855 }
856 klassOop the_class_oop = java_lang_Class::as_klassOop(mirror); 856 klassOop the_class_oop = java_lang_Class::as_klassOop(mirror);
857 instanceKlassHandle the_class = instanceKlassHandle(THREAD, the_class_oop); 857 instanceKlassHandle the_class = instanceKlassHandle(THREAD, the_class_oop);
858 symbolHandle the_class_sym = symbolHandle(THREAD, the_class->name()); 858 Symbol* the_class_sym = the_class->name();
859 859
860 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark 860 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
861 RC_TRACE_WITH_THREAD(0x00000001, THREAD, 861 RC_TRACE_WITH_THREAD(0x00000001, THREAD,
862 ("loading name=%s (avail_mem=" UINT64_FORMAT "K)", 862 ("loading name=%s (avail_mem=" UINT64_FORMAT "K)",
863 the_class->external_name(), os::available_memory() >> 10)); 863 the_class->external_name(), os::available_memory() >> 10));
884 // TODO: if this is retransform, and nothing changed we can skip it 884 // TODO: if this is retransform, and nothing changed we can skip it
885 885
886 instanceKlassHandle scratch_class (THREAD, k); 886 instanceKlassHandle scratch_class (THREAD, k);
887 887
888 if (HAS_PENDING_EXCEPTION) { 888 if (HAS_PENDING_EXCEPTION) {
889 symbolOop ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); 889 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name();
890 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark 890 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
891 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("parse_stream exception: '%s'", 891 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("parse_stream exception: '%s'",
892 ex_name->as_C_string())); 892 ex_name->as_C_string()));
893 CLEAR_PENDING_EXCEPTION; 893 CLEAR_PENDING_EXCEPTION;
894 894
910 910
911 // Ensure class is linked before redefine 911 // Ensure class is linked before redefine
912 if (!the_class->is_linked()) { 912 if (!the_class->is_linked()) {
913 the_class->link_class(THREAD); 913 the_class->link_class(THREAD);
914 if (HAS_PENDING_EXCEPTION) { 914 if (HAS_PENDING_EXCEPTION) {
915 symbolOop ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); 915 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name();
916 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark 916 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
917 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("link_class exception: '%s'", 917 RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("link_class exception: '%s'",
918 ex_name->as_C_string())); 918 ex_name->as_C_string()));
919 CLEAR_PENDING_EXCEPTION; 919 CLEAR_PENDING_EXCEPTION;
920 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { 920 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) {
948 Verifier::verify( 948 Verifier::verify(
949 scratch_class, Verifier::ThrowException, true, THREAD); 949 scratch_class, Verifier::ThrowException, true, THREAD);
950 } 950 }
951 951
952 if (HAS_PENDING_EXCEPTION) { 952 if (HAS_PENDING_EXCEPTION) {
953 symbolOop ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); 953 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name();
954 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark 954 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
955 RC_TRACE_WITH_THREAD(0x00000002, THREAD, 955 RC_TRACE_WITH_THREAD(0x00000002, THREAD,
956 ("verify_byte_codes exception: '%s'", ex_name->as_C_string())); 956 ("verify_byte_codes exception: '%s'", ex_name->as_C_string()));
957 CLEAR_PENDING_EXCEPTION; 957 CLEAR_PENDING_EXCEPTION;
958 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { 958 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) {
974 RedefineVerifyMark rvm(&the_class, &scratch_class, state); 974 RedefineVerifyMark rvm(&the_class, &scratch_class, state);
975 Verifier::verify(scratch_class, Verifier::ThrowException, true, THREAD); 975 Verifier::verify(scratch_class, Verifier::ThrowException, true, THREAD);
976 } 976 }
977 977
978 if (HAS_PENDING_EXCEPTION) { 978 if (HAS_PENDING_EXCEPTION) {
979 symbolOop ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); 979 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name();
980 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark 980 // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
981 RC_TRACE_WITH_THREAD(0x00000002, THREAD, 981 RC_TRACE_WITH_THREAD(0x00000002, THREAD,
982 ("verify_byte_codes post merge-CP exception: '%s'", 982 ("verify_byte_codes post merge-CP exception: '%s'",
983 ex_name->as_C_string())); 983 ex_name->as_C_string()));
984 CLEAR_PENDING_EXCEPTION; 984 CLEAR_PENDING_EXCEPTION;
991 } 991 }
992 } 992 }
993 993
994 Rewriter::rewrite(scratch_class, THREAD); 994 Rewriter::rewrite(scratch_class, THREAD);
995 if (HAS_PENDING_EXCEPTION) { 995 if (HAS_PENDING_EXCEPTION) {
996 symbolOop ex_name = PENDING_EXCEPTION->klass()->klass_part()->name(); 996 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name();
997 CLEAR_PENDING_EXCEPTION; 997 CLEAR_PENDING_EXCEPTION;
998 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { 998 if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) {
999 return JVMTI_ERROR_OUT_OF_MEMORY; 999 return JVMTI_ERROR_OUT_OF_MEMORY;
1000 } else { 1000 } else {
1001 return JVMTI_ERROR_INTERNAL; 1001 return JVMTI_ERROR_INTERNAL;
2855 // Branch at each depth in the binary tree is: 2855 // Branch at each depth in the binary tree is:
2856 // (1) without the prefix. 2856 // (1) without the prefix.
2857 // (2) with the prefix. 2857 // (2) with the prefix.
2858 // where 'prefix' is the prefix at that 'depth' (first prefix, second prefix,...) 2858 // where 'prefix' is the prefix at that 'depth' (first prefix, second prefix,...)
2859 methodOop search_prefix_name_space(int depth, char* name_str, size_t name_len, 2859 methodOop search_prefix_name_space(int depth, char* name_str, size_t name_len,
2860 symbolOop signature) { 2860 Symbol* signature) {
2861 symbolOop name_symbol = SymbolTable::probe(name_str, (int)name_len); 2861 TempNewSymbol name_symbol = SymbolTable::probe(name_str, (int)name_len);
2862 if (name_symbol != NULL) { 2862 if (name_symbol != NULL) {
2863 methodOop method = Klass::cast(the_class())->lookup_method(name_symbol, signature); 2863 methodOop method = Klass::cast(the_class())->lookup_method(name_symbol, signature);
2864 if (method != NULL) { 2864 if (method != NULL) {
2865 // Even if prefixed, intermediate methods must exist. 2865 // Even if prefixed, intermediate methods must exist.
2866 if (method->is_native()) { 2866 if (method->is_native()) {
2895 return NULL; // This whole branch bore nothing 2895 return NULL; // This whole branch bore nothing
2896 } 2896 }
2897 2897
2898 // Return the method name with old prefixes stripped away. 2898 // Return the method name with old prefixes stripped away.
2899 char* method_name_without_prefixes(methodOop method) { 2899 char* method_name_without_prefixes(methodOop method) {
2900 symbolOop name = method->name(); 2900 Symbol* name = method->name();
2901 char* name_str = name->as_utf8(); 2901 char* name_str = name->as_utf8();
2902 2902
2903 // Old prefixing may be defunct, strip prefixes, if any. 2903 // Old prefixing may be defunct, strip prefixes, if any.
2904 for (int i = prefix_count-1; i >= 0; i--) { 2904 for (int i = prefix_count-1; i >= 0; i--) {
2905 char* prefix = prefixes[i]; 2905 char* prefix = prefixes[i];