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