594 595 Klass* Klass::array_klass_or_null() { 596 EXCEPTION_MARK; 597 // No exception can be thrown by array_klass_impl when called with or_null == true. 598 // (In anycase, the execption mark will fail if it do so) 599 return array_klass_impl(true, THREAD); 600 } 601 602 603 Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) { 604 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); 605 return NULL; 606 } 607 608 609 Klass* Klass::array_klass_impl(bool or_null, TRAPS) { 610 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); 611 return NULL; 612 } 613 614 oop Klass::class_loader() const { return class_loader_data()->class_loader(); } 615 616 // In product mode, this function doesn't have virtual function calls so 617 // there might be some performance advantage to handling InstanceKlass here. 618 const char* Klass::external_name() const { 619 if (is_instance_klass()) { 620 const InstanceKlass* ik = static_cast<const InstanceKlass*>(this); 621 if (ik->is_unsafe_anonymous()) { 622 char addr_buf[20]; 623 jio_snprintf(addr_buf, 20, "/" INTPTR_FORMAT, p2i(ik)); 624 size_t addr_len = strlen(addr_buf); 625 size_t name_len = name()->utf8_length(); 626 char* result = NEW_RESOURCE_ARRAY(char, name_len + addr_len + 1); 627 name()->as_klass_external_name(result, (int) name_len + 1); 628 assert(strlen(result) == name_len, ""); 629 strcpy(result + name_len, addr_buf); 630 assert(strlen(result) == name_len + addr_len, ""); 631 return result; 632 } 633 } | 594 595 Klass* Klass::array_klass_or_null() { 596 EXCEPTION_MARK; 597 // No exception can be thrown by array_klass_impl when called with or_null == true. 598 // (In anycase, the execption mark will fail if it do so) 599 return array_klass_impl(true, THREAD); 600 } 601 602 603 Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) { 604 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); 605 return NULL; 606 } 607 608 609 Klass* Klass::array_klass_impl(bool or_null, TRAPS) { 610 fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass"); 611 return NULL; 612 } 613 614 void Klass::check_array_allocation_length(int length, int max_length, TRAPS) { 615 if (length > max_length) { 616 if (!THREAD->in_retryable_allocation()) { 617 report_java_out_of_memory("Requested array size exceeds VM limit"); 618 JvmtiExport::post_array_size_exhausted(); 619 THROW_OOP(Universe::out_of_memory_error_array_size()); 620 } else { 621 THROW_OOP(Universe::out_of_memory_error_retry()); 622 } 623 } else if (length < 0) { 624 THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length)); 625 } 626 } 627 628 oop Klass::class_loader() const { return class_loader_data()->class_loader(); } 629 630 // In product mode, this function doesn't have virtual function calls so 631 // there might be some performance advantage to handling InstanceKlass here. 632 const char* Klass::external_name() const { 633 if (is_instance_klass()) { 634 const InstanceKlass* ik = static_cast<const InstanceKlass*>(this); 635 if (ik->is_unsafe_anonymous()) { 636 char addr_buf[20]; 637 jio_snprintf(addr_buf, 20, "/" INTPTR_FORMAT, p2i(ik)); 638 size_t addr_len = strlen(addr_buf); 639 size_t name_len = name()->utf8_length(); 640 char* result = NEW_RESOURCE_ARRAY(char, name_len + addr_len + 1); 641 name()->as_klass_external_name(result, (int) name_len + 1); 642 assert(strlen(result) == name_len, ""); 643 strcpy(result + name_len, addr_buf); 644 assert(strlen(result) == name_len + addr_len, ""); 645 return result; 646 } 647 } |