hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 46271 979ebd346ecf
parent 46257 3e95288ce4ca
child 46289 1904e7ec236e
equal deleted inserted replaced
46270:2e7898927798 46271:979ebd346ecf
   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) \