src/share/vm/prims/jvmtiRedefineClasses.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/prims/jvmtiRedefineClasses.cpp

src/share/vm/prims/jvmtiRedefineClasses.cpp

Print this page

        

*** 609,620 **** // Check superclasses, or rather their names, since superclasses themselves can be // requested to replace. // Check for NULL superclass first since this might be java.lang.Object if (the_class->super() != scratch_class->super() && (the_class->super() == NULL || scratch_class->super() == NULL || ! the_class->super()->name() != ! scratch_class->super()->name())) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; } // Check if the number, names and order of directly implemented interfaces are the same. // I think in principle we should just check if the sets of names of directly implemented --- 609,620 ---- // Check superclasses, or rather their names, since superclasses themselves can be // requested to replace. // Check for NULL superclass first since this might be java.lang.Object if (the_class->super() != scratch_class->super() && (the_class->super() == NULL || scratch_class->super() == NULL || ! the_class->super()->name()->not_equals( ! scratch_class->super()->name()))) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; } // Check if the number, names and order of directly implemented interfaces are the same. // I think in principle we should just check if the sets of names of directly implemented
*** 628,639 **** int n_intfs = k_interfaces->length(); if (n_intfs != k_new_interfaces->length()) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; } for (i = 0; i < n_intfs; i++) { ! if (k_interfaces->at(i)->name() != ! k_new_interfaces->at(i)->name()) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; } } // Check whether class is in the error init state. --- 628,639 ---- int n_intfs = k_interfaces->length(); if (n_intfs != k_new_interfaces->length()) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; } for (i = 0; i < n_intfs; i++) { ! if (k_interfaces->at(i)->name()->not_equals( ! k_new_interfaces->at(i)->name())) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; } } // Check whether class is in the error init state.
*** 667,677 **** // name and signature Symbol* name_sym1 = the_class->constants()->symbol_at(old_fs.name_index()); Symbol* sig_sym1 = the_class->constants()->symbol_at(old_fs.signature_index()); Symbol* name_sym2 = scratch_class->constants()->symbol_at(new_fs.name_index()); Symbol* sig_sym2 = scratch_class->constants()->symbol_at(new_fs.signature_index()); ! if (name_sym1 != name_sym2 || sig_sym1 != sig_sym2) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED; } } // If both streams aren't done then we have a differing number of --- 667,677 ---- // name and signature Symbol* name_sym1 = the_class->constants()->symbol_at(old_fs.name_index()); Symbol* sig_sym1 = the_class->constants()->symbol_at(old_fs.signature_index()); Symbol* name_sym2 = scratch_class->constants()->symbol_at(new_fs.name_index()); Symbol* sig_sym2 = scratch_class->constants()->symbol_at(new_fs.signature_index()); ! if (name_sym1->not_equals(name_sym2) || sig_sym1->not_equals(sig_sym2)) { return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED; } } // If both streams aren't done then we have a differing number of
*** 723,755 **** method_was = deleted; } else { // There are more methods in both the old and new lists k_old_method = k_old_methods->at(oi); k_new_method = k_new_methods->at(ni); ! if (k_old_method->name() != k_new_method->name()) { // Methods are sorted by method name, so a mismatch means added // or deleted if (k_old_method->name()->fast_compare(k_new_method->name()) > 0) { method_was = added; } else { method_was = deleted; } ! } else if (k_old_method->signature() == k_new_method->signature()) { // Both the name and signature match method_was = matched; } else { // The name matches, but the signature doesn't, which means we have to // search forward through the new overloaded methods. int nj; // outside the loop for post-loop check for (nj = ni + 1; nj < n_new_methods; nj++) { Method* m = k_new_methods->at(nj); ! if (k_old_method->name() != m->name()) { // reached another method name so no more overloaded methods method_was = deleted; break; } ! if (k_old_method->signature() == m->signature()) { // found a match so swap the methods k_new_methods->at_put(ni, m); k_new_methods->at_put(nj, k_new_method); k_new_method = m; method_was = matched; --- 723,755 ---- method_was = deleted; } else { // There are more methods in both the old and new lists k_old_method = k_old_methods->at(oi); k_new_method = k_new_methods->at(ni); ! if (k_old_method->name()->not_equals(k_new_method->name())) { // Methods are sorted by method name, so a mismatch means added // or deleted if (k_old_method->name()->fast_compare(k_new_method->name()) > 0) { method_was = added; } else { method_was = deleted; } ! } else if (k_old_method->signature()->equals(k_new_method->signature())) { // Both the name and signature match method_was = matched; } else { // The name matches, but the signature doesn't, which means we have to // search forward through the new overloaded methods. int nj; // outside the loop for post-loop check for (nj = ni + 1; nj < n_new_methods; nj++) { Method* m = k_new_methods->at(nj); ! if (k_old_method->name()->not_equals(m->name())) { // reached another method name so no more overloaded methods method_was = deleted; break; } ! if (k_old_method->signature()->equals(m->signature())) { // found a match so swap the methods k_new_methods->at_put(ni, m); k_new_methods->at_put(nj, k_new_method); k_new_method = m; method_was = matched;
*** 1008,1027 **** // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("parse_stream exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name == vmSymbols::java_lang_UnsupportedClassVersionError()) { return JVMTI_ERROR_UNSUPPORTED_VERSION; ! } else if (ex_name == vmSymbols::java_lang_ClassFormatError()) { return JVMTI_ERROR_INVALID_CLASS_FORMAT; ! } else if (ex_name == vmSymbols::java_lang_ClassCircularityError()) { return JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION; ! } else if (ex_name == vmSymbols::java_lang_NoClassDefFoundError()) { // The message will be "XXX (wrong name: YYY)" return JVMTI_ERROR_NAMES_DONT_MATCH; ! } else if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { // Just in case more exceptions can be thrown.. return JVMTI_ERROR_FAILS_VERIFICATION; } } --- 1008,1027 ---- // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("parse_stream exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name->equals(vmSymbols::java_lang_UnsupportedClassVersionError())) { return JVMTI_ERROR_UNSUPPORTED_VERSION; ! } else if (ex_name->equals(vmSymbols::java_lang_ClassFormatError())) { return JVMTI_ERROR_INVALID_CLASS_FORMAT; ! } else if (ex_name->equals(vmSymbols::java_lang_ClassCircularityError())) { return JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION; ! } else if (ex_name->equals(vmSymbols::java_lang_NoClassDefFoundError())) { // The message will be "XXX (wrong name: YYY)" return JVMTI_ERROR_NAMES_DONT_MATCH; ! } else if (ex_name->equals(vmSymbols::java_lang_OutOfMemoryError())) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { // Just in case more exceptions can be thrown.. return JVMTI_ERROR_FAILS_VERIFICATION; } }
*** 1033,1043 **** Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("link_class exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { return JVMTI_ERROR_INTERNAL; } } --- 1033,1043 ---- Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("link_class exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name->equals(vmSymbols::java_lang_OutOfMemoryError())) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { return JVMTI_ERROR_INTERNAL; } }
*** 1071,1081 **** Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("verify_byte_codes exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { // tell the caller the bytecodes are bad return JVMTI_ERROR_FAILS_VERIFICATION; } --- 1071,1081 ---- Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("verify_byte_codes exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name->equals(vmSymbols::java_lang_OutOfMemoryError())) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { // tell the caller the bytecodes are bad return JVMTI_ERROR_FAILS_VERIFICATION; }
*** 1086,1096 **** Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("merge_cp_and_rewrite exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { return JVMTI_ERROR_INTERNAL; } } --- 1086,1096 ---- Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("merge_cp_and_rewrite exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name->equals(vmSymbols::java_lang_OutOfMemoryError())) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { return JVMTI_ERROR_INTERNAL; } }
*** 1107,1117 **** // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("verify_byte_codes post merge-CP exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { // tell the caller that constant pool merging screwed up return JVMTI_ERROR_INTERNAL; } --- 1107,1117 ---- // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("verify_byte_codes post merge-CP exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name->equals(vmSymbols::java_lang_OutOfMemoryError())) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { // tell the caller that constant pool merging screwed up return JVMTI_ERROR_INTERNAL; }
*** 1126,1136 **** Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("Rewriter::rewrite or link_methods exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { return JVMTI_ERROR_INTERNAL; } } --- 1126,1136 ---- Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark RC_TRACE_WITH_THREAD(0x00000002, THREAD, ("Rewriter::rewrite or link_methods exception: '%s'", ex_name->as_C_string())); CLEAR_PENDING_EXCEPTION; ! if (ex_name->equals(vmSymbols::java_lang_OutOfMemoryError())) { return JVMTI_ERROR_OUT_OF_MEMORY; } else { return JVMTI_ERROR_INTERNAL; } }
*** 3808,3819 **** _deleted_methods[_deleted_methods_length++] = old_method; ++oj; } else { old_method = _old_methods->at(oj); new_method = _new_methods->at(nj); ! if (old_method->name() == new_method->name()) { ! if (old_method->signature() == new_method->signature()) { _matching_old_methods[_matching_methods_length ] = old_method; _matching_new_methods[_matching_methods_length++] = new_method; ++nj; ++oj; } else { --- 3808,3819 ---- _deleted_methods[_deleted_methods_length++] = old_method; ++oj; } else { old_method = _old_methods->at(oj); new_method = _new_methods->at(nj); ! if (old_method->name()->equals(new_method->name())) { ! if (old_method->signature()->equals(new_method->signature())) { _matching_old_methods[_matching_methods_length ] = old_method; _matching_new_methods[_matching_methods_length++] = new_method; ++nj; ++oj; } else {
src/share/vm/prims/jvmtiRedefineClasses.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File