comparison src/share/vm/classfile/javaClasses.cpp @ 14422:2b8e28fdf503

Merge
author kvn
date Tue, 05 Nov 2013 17:38:04 -0800
parents 07f8c2a453f8
children 096c224171c4 d8d1b22b1809 9428a0b94204
comparison
equal deleted inserted replaced
14421:3068270ba476 14422:2b8e28fdf503
430 if (length != len) { 430 if (length != len) {
431 return false; 431 return false;
432 } 432 }
433 for (int i = 0; i < len; i++) { 433 for (int i = 0; i < len; i++) {
434 if (value->char_at(i + offset) != chars[i]) { 434 if (value->char_at(i + offset) != chars[i]) {
435 return false;
436 }
437 }
438 return true;
439 }
440
441 bool java_lang_String::equals(oop str1, oop str2) {
442 assert(str1->klass() == SystemDictionary::String_klass(),
443 "must be java String");
444 assert(str2->klass() == SystemDictionary::String_klass(),
445 "must be java String");
446 typeArrayOop value1 = java_lang_String::value(str1);
447 int offset1 = java_lang_String::offset(str1);
448 int length1 = java_lang_String::length(str1);
449 typeArrayOop value2 = java_lang_String::value(str2);
450 int offset2 = java_lang_String::offset(str2);
451 int length2 = java_lang_String::length(str2);
452
453 if (length1 != length2) {
454 return false;
455 }
456 for (int i = 0; i < length1; i++) {
457 if (value1->char_at(i + offset1) != value2->char_at(i + offset2)) {
435 return false; 458 return false;
436 } 459 }
437 } 460 }
438 return true; 461 return true;
439 } 462 }
1351 // Get strings and string lengths 1374 // Get strings and string lengths
1352 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1375 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1353 const char* klass_name = holder->external_name(); 1376 const char* klass_name = holder->external_name();
1354 int buf_len = (int)strlen(klass_name); 1377 int buf_len = (int)strlen(klass_name);
1355 1378
1356 // pushing to the stack trace added one. 1379 // The method id may point to an obsolete method, can't get more stack information
1357 Method* method = holder->method_with_idnum(method_id); 1380 Method* method = holder->method_with_idnum(method_id);
1381 if (method == NULL) {
1382 char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
1383 // This is what the java code prints in this case - added Redefined
1384 sprintf(buf, "\tat %s.null (Redefined)", klass_name);
1385 return buf;
1386 }
1387
1358 char* method_name = method->name()->as_C_string(); 1388 char* method_name = method->name()->as_C_string();
1359 buf_len += (int)strlen(method_name); 1389 buf_len += (int)strlen(method_name);
1360 1390
1361 char* source_file_name = NULL; 1391 char* source_file_name = NULL;
1362 if (version_matches(method, version)) { 1392 if (version_matches(method, version)) {
1748 1778
1749 oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, CHECK_0); 1779 oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, CHECK_0);
1750 return element; 1780 return element;
1751 } 1781 }
1752 1782
1753 oop java_lang_StackTraceElement::create(Handle mirror, int method_id, int version, int bci, TRAPS) { 1783 oop java_lang_StackTraceElement::create(Handle mirror, int method_id,
1784 int version, int bci, TRAPS) {
1754 // Allocate java.lang.StackTraceElement instance 1785 // Allocate java.lang.StackTraceElement instance
1755 Klass* k = SystemDictionary::StackTraceElement_klass(); 1786 Klass* k = SystemDictionary::StackTraceElement_klass();
1756 assert(k != NULL, "must be loaded in 1.4+"); 1787 assert(k != NULL, "must be loaded in 1.4+");
1757 instanceKlassHandle ik (THREAD, k); 1788 instanceKlassHandle ik (THREAD, k);
1758 if (ik->should_be_initialized()) { 1789 if (ik->should_be_initialized()) {
1765 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1796 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1766 const char* str = holder->external_name(); 1797 const char* str = holder->external_name();
1767 oop classname = StringTable::intern((char*) str, CHECK_0); 1798 oop classname = StringTable::intern((char*) str, CHECK_0);
1768 java_lang_StackTraceElement::set_declaringClass(element(), classname); 1799 java_lang_StackTraceElement::set_declaringClass(element(), classname);
1769 1800
1801 Method* method = holder->method_with_idnum(method_id);
1802 // Method on stack may be obsolete because it was redefined so cannot be
1803 // found by idnum.
1804 if (method == NULL) {
1805 // leave name and fileName null
1806 java_lang_StackTraceElement::set_lineNumber(element(), -1);
1807 return element();
1808 }
1809
1770 // Fill in method name 1810 // Fill in method name
1771 Method* method = holder->method_with_idnum(method_id);
1772 oop methodname = StringTable::intern(method->name(), CHECK_0); 1811 oop methodname = StringTable::intern(method->name(), CHECK_0);
1773 java_lang_StackTraceElement::set_methodName(element(), methodname); 1812 java_lang_StackTraceElement::set_methodName(element(), methodname);
1774 1813
1775 if (!version_matches(method, version)) { 1814 if (!version_matches(method, version)) {
1776 // The method was redefined, accurate line number information isn't available 1815 // The method was redefined, accurate line number information isn't available