Mercurial > hg > truffle
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]; |