512 assert(result_length >= length + 1, "must not be shorter"); |
512 assert(result_length >= length + 1, "must not be shorter"); |
513 assert(result_length == (int)strlen(result) + 1, "must match"); |
513 assert(result_length == (int)strlen(result) + 1, "must match"); |
514 return result; |
514 return result; |
515 } |
515 } |
516 |
516 |
517 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) { |
517 Symbol* java_lang_String::as_symbol(oop java_string, TRAPS) { |
518 oop obj = java_string(); |
518 typeArrayOop value = java_lang_String::value(java_string); |
519 typeArrayOop value = java_lang_String::value(obj); |
519 int length = java_lang_String::length(java_string); |
520 int length = java_lang_String::length(obj); |
520 bool is_latin1 = java_lang_String::is_latin1(java_string); |
521 bool is_latin1 = java_lang_String::is_latin1(obj); |
|
522 if (!is_latin1) { |
521 if (!is_latin1) { |
523 jchar* base = (length == 0) ? NULL : value->char_at_addr(0); |
522 jchar* base = (length == 0) ? NULL : value->char_at_addr(0); |
524 Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD); |
523 Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD); |
525 return sym; |
524 return sym; |
526 } else { |
525 } else { |
751 fs.set_offset(real_offset); |
750 fs.set_offset(real_offset); |
752 } |
751 } |
753 } |
752 } |
754 } |
753 } |
755 } |
754 } |
756 create_mirror(k, Handle(NULL), Handle(NULL), Handle(NULL), CHECK); |
755 create_mirror(k, Handle(), Handle(), Handle(), CHECK); |
757 } |
756 } |
758 |
757 |
759 void java_lang_Class::initialize_mirror_fields(KlassHandle k, |
758 void java_lang_Class::initialize_mirror_fields(KlassHandle k, |
760 Handle mirror, |
759 Handle mirror, |
761 Handle protection_domain, |
760 Handle protection_domain, |
826 k->set_modifier_flags(computed_modifiers); |
825 k->set_modifier_flags(computed_modifiers); |
827 // Class_klass has to be loaded because it is used to allocate |
826 // Class_klass has to be loaded because it is used to allocate |
828 // the mirror. |
827 // the mirror. |
829 if (SystemDictionary::Class_klass_loaded()) { |
828 if (SystemDictionary::Class_klass_loaded()) { |
830 // Allocate mirror (java.lang.Class instance) |
829 // Allocate mirror (java.lang.Class instance) |
831 Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK); |
830 oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK); |
|
831 Handle mirror(THREAD, mirror_oop); |
832 |
832 |
833 // Setup indirection from mirror->klass |
833 // Setup indirection from mirror->klass |
834 if (!k.is_null()) { |
834 if (!k.is_null()) { |
835 java_lang_Class::set_klass(mirror(), k()); |
835 java_lang_Class::set_klass(mirror(), k()); |
836 } |
836 } |
840 |
840 |
841 java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); |
841 java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); |
842 |
842 |
843 // It might also have a component mirror. This mirror must already exist. |
843 // It might also have a component mirror. This mirror must already exist. |
844 if (k->is_array_klass()) { |
844 if (k->is_array_klass()) { |
845 Handle comp_mirror; |
845 oop comp_mirror; |
846 if (k->is_typeArray_klass()) { |
846 if (k->is_typeArray_klass()) { |
847 BasicType type = TypeArrayKlass::cast(k())->element_type(); |
847 BasicType type = TypeArrayKlass::cast(k())->element_type(); |
848 comp_mirror = Universe::java_mirror(type); |
848 comp_mirror = Universe::java_mirror(type); |
849 } else { |
849 } else { |
850 assert(k->is_objArray_klass(), "Must be"); |
850 assert(k->is_objArray_klass(), "Must be"); |
851 Klass* element_klass = ObjArrayKlass::cast(k())->element_klass(); |
851 Klass* element_klass = ObjArrayKlass::cast(k())->element_klass(); |
852 assert(element_klass != NULL, "Must have an element klass"); |
852 assert(element_klass != NULL, "Must have an element klass"); |
853 comp_mirror = element_klass->java_mirror(); |
853 comp_mirror = element_klass->java_mirror(); |
854 } |
854 } |
855 assert(comp_mirror.not_null(), "must have a mirror"); |
855 assert(comp_mirror != NULL, "must have a mirror"); |
856 |
856 |
857 // Two-way link between the array klass and its component mirror: |
857 // Two-way link between the array klass and its component mirror: |
858 // (array_klass) k -> mirror -> component_mirror -> array_klass -> k |
858 // (array_klass) k -> mirror -> component_mirror -> array_klass -> k |
859 set_component_mirror(mirror(), comp_mirror()); |
859 set_component_mirror(mirror(), comp_mirror); |
860 set_array_klass(comp_mirror(), k()); |
860 set_array_klass(comp_mirror, k()); |
861 } else { |
861 } else { |
862 assert(k->is_instance_klass(), "Must be"); |
862 assert(k->is_instance_klass(), "Must be"); |
863 |
863 |
864 initialize_mirror_fields(k, mirror, protection_domain, THREAD); |
864 initialize_mirror_fields(k, mirror, protection_domain, THREAD); |
865 if (HAS_PENDING_EXCEPTION) { |
865 if (HAS_PENDING_EXCEPTION) { |
1516 |
1516 |
1517 void java_lang_Throwable::set_depth(oop throwable, int value) { |
1517 void java_lang_Throwable::set_depth(oop throwable, int value) { |
1518 throwable->int_field_put(depth_offset, value); |
1518 throwable->int_field_put(depth_offset, value); |
1519 } |
1519 } |
1520 |
1520 |
1521 oop java_lang_Throwable::message(Handle throwable) { |
1521 oop java_lang_Throwable::message(oop throwable) { |
1522 return throwable->obj_field(detailMessage_offset); |
1522 return throwable->obj_field(detailMessage_offset); |
1523 } |
1523 } |
1524 |
1524 |
1525 |
1525 |
1526 // Return Symbol for detailed_message or NULL |
1526 // Return Symbol for detailed_message or NULL |
1545 void java_lang_Throwable::clear_stacktrace(oop throwable) { |
1545 void java_lang_Throwable::clear_stacktrace(oop throwable) { |
1546 set_stacktrace(throwable, NULL); |
1546 set_stacktrace(throwable, NULL); |
1547 } |
1547 } |
1548 |
1548 |
1549 |
1549 |
1550 void java_lang_Throwable::print(Handle throwable, outputStream* st) { |
1550 void java_lang_Throwable::print(oop throwable, outputStream* st) { |
1551 ResourceMark rm; |
1551 ResourceMark rm; |
1552 Klass* k = throwable->klass(); |
1552 Klass* k = throwable->klass(); |
1553 assert(k != NULL, "just checking"); |
1553 assert(k != NULL, "just checking"); |
1554 st->print("%s", k->external_name()); |
1554 st->print("%s", k->external_name()); |
1555 oop msg = message(throwable); |
1555 oop msg = message(throwable); |
1617 public: |
1617 public: |
1618 |
1618 |
1619 // constructor for new backtrace |
1619 // constructor for new backtrace |
1620 BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL), _mirrors(NULL), _names(NULL) { |
1620 BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL), _mirrors(NULL), _names(NULL) { |
1621 expand(CHECK); |
1621 expand(CHECK); |
1622 _backtrace = _head; |
1622 _backtrace = Handle(THREAD, _head); |
1623 _index = 0; |
1623 _index = 0; |
1624 } |
1624 } |
1625 |
1625 |
1626 BacktraceBuilder(objArrayHandle backtrace) { |
1626 BacktraceBuilder(Thread* thread, objArrayHandle backtrace) { |
1627 _methods = get_methods(backtrace); |
1627 _methods = get_methods(backtrace); |
1628 _bcis = get_bcis(backtrace); |
1628 _bcis = get_bcis(backtrace); |
1629 _mirrors = get_mirrors(backtrace); |
1629 _mirrors = get_mirrors(backtrace); |
1630 _names = get_names(backtrace); |
1630 _names = get_names(backtrace); |
1631 assert(_methods->length() == _bcis->length() && |
1631 assert(_methods->length() == _bcis->length() && |
1632 _methods->length() == _mirrors->length() && |
1632 _methods->length() == _mirrors->length() && |
1633 _mirrors->length() == _names->length(), |
1633 _mirrors->length() == _names->length(), |
1634 "method and source information arrays should match"); |
1634 "method and source information arrays should match"); |
1635 |
1635 |
1636 // head is the preallocated backtrace |
1636 // head is the preallocated backtrace |
1637 _backtrace = _head = backtrace(); |
1637 _head = backtrace(); |
|
1638 _backtrace = Handle(thread, _head); |
1638 _index = 0; |
1639 _index = 0; |
1639 } |
1640 } |
1640 |
1641 |
1641 void expand(TRAPS) { |
1642 void expand(TRAPS) { |
1642 objArrayHandle old_head(THREAD, _head); |
1643 objArrayHandle old_head(THREAD, _head); |
1838 |
1839 |
1839 st->print_cr("%s", buf); |
1840 st->print_cr("%s", buf); |
1840 } |
1841 } |
1841 |
1842 |
1842 void java_lang_Throwable::print_stack_element(outputStream *st, const methodHandle& method, int bci) { |
1843 void java_lang_Throwable::print_stack_element(outputStream *st, const methodHandle& method, int bci) { |
1843 Handle mirror = method->method_holder()->java_mirror(); |
1844 Handle mirror (Thread::current(), method->method_holder()->java_mirror()); |
1844 int method_id = method->orig_method_idnum(); |
1845 int method_id = method->orig_method_idnum(); |
1845 int version = method->constants()->version(); |
1846 int version = method->constants()->version(); |
1846 print_stack_element_to_stream(st, mirror, method_id, version, bci, method->name()); |
1847 print_stack_element_to_stream(st, mirror, method_id, version, bci, method->name()); |
1847 } |
1848 } |
1848 |
1849 |
1850 * Print the throwable message and its stack trace plus all causes by walking the |
1851 * Print the throwable message and its stack trace plus all causes by walking the |
1851 * cause chain. The output looks the same as of Throwable.printStackTrace(). |
1852 * cause chain. The output looks the same as of Throwable.printStackTrace(). |
1852 */ |
1853 */ |
1853 void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st) { |
1854 void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st) { |
1854 // First, print the message. |
1855 // First, print the message. |
1855 print(throwable, st); |
1856 print(throwable(), st); |
1856 st->cr(); |
1857 st->cr(); |
1857 |
1858 |
1858 // Now print the stack trace. |
1859 // Now print the stack trace. |
1859 Thread* THREAD = Thread::current(); |
1860 Thread* THREAD = Thread::current(); |
1860 while (throwable.not_null()) { |
1861 while (throwable.not_null()) { |
1885 throwable = Handle(); |
1886 throwable = Handle(); |
1886 } else { |
1887 } else { |
1887 throwable = Handle(THREAD, (oop) cause.get_jobject()); |
1888 throwable = Handle(THREAD, (oop) cause.get_jobject()); |
1888 if (throwable.not_null()) { |
1889 if (throwable.not_null()) { |
1889 st->print("Caused by: "); |
1890 st->print("Caused by: "); |
1890 print(throwable, st); |
1891 print(throwable(), st); |
1891 st->cr(); |
1892 st->cr(); |
1892 } |
1893 } |
1893 } |
1894 } |
1894 } |
1895 } |
1895 } |
1896 } |
2089 assert(backtrace.not_null(), "backtrace should have been preallocated"); |
2090 assert(backtrace.not_null(), "backtrace should have been preallocated"); |
2090 |
2091 |
2091 ResourceMark rm(THREAD); |
2092 ResourceMark rm(THREAD); |
2092 vframeStream st(THREAD); |
2093 vframeStream st(THREAD); |
2093 |
2094 |
2094 BacktraceBuilder bt(backtrace); |
2095 BacktraceBuilder bt(THREAD, backtrace); |
2095 |
2096 |
2096 // Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init |
2097 // Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init |
2097 // methods as preallocated errors aren't created by "java" code. |
2098 // methods as preallocated errors aren't created by "java" code. |
2098 |
2099 |
2099 // fill in as much stack trace as possible |
2100 // fill in as much stack trace as possible |
2228 return method; |
2229 return method; |
2229 } |
2230 } |
2230 |
2231 |
2231 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { |
2232 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { |
2232 // set Method* or mid/cpref |
2233 // set Method* or mid/cpref |
2233 oop mname = stackFrame->obj_field(_memberName_offset); |
2234 Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset)); |
2234 InstanceKlass* ik = method->method_holder(); |
2235 InstanceKlass* ik = method->method_holder(); |
2235 CallInfo info(method(), ik); |
2236 CallInfo info(method(), ik); |
2236 MethodHandles::init_method_MemberName(mname, info); |
2237 MethodHandles::init_method_MemberName(mname, info); |
2237 // set bci |
2238 // set bci |
2238 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); |
2239 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); |
3956 |
3957 |
3957 // Check the hard-coded field offsets of all the classes in this file |
3958 // Check the hard-coded field offsets of all the classes in this file |
3958 |
3959 |
3959 void JavaClasses::check_offsets() { |
3960 void JavaClasses::check_offsets() { |
3960 bool valid = true; |
3961 bool valid = true; |
3961 HandleMark hm; |
|
3962 |
3962 |
3963 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3963 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3964 valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) |
3964 valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) |
3965 |
3965 |
3966 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3966 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |