equal
deleted
inserted
replaced
55 assert(!m.is_null(), "New mirror should never be null."); |
55 assert(!m.is_null(), "New mirror should never be null."); |
56 assert(_java_mirror.resolve() == NULL, "should only be used to initialize mirror"); |
56 assert(_java_mirror.resolve() == NULL, "should only be used to initialize mirror"); |
57 _java_mirror = class_loader_data()->add_handle(m); |
57 _java_mirror = class_loader_data()->add_handle(m); |
58 } |
58 } |
59 |
59 |
60 oop Klass::java_mirror() const { |
|
61 return _java_mirror.resolve(); |
|
62 } |
|
63 |
|
64 oop Klass::java_mirror_no_keepalive() const { |
60 oop Klass::java_mirror_no_keepalive() const { |
65 return _java_mirror.peek(); |
61 return _java_mirror.peek(); |
66 } |
62 } |
67 |
63 |
68 bool Klass::is_cloneable() const { |
64 bool Klass::is_cloneable() const { |
679 } else if (length < 0) { |
675 } else if (length < 0) { |
680 THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length)); |
676 THROW_MSG(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length)); |
681 } |
677 } |
682 } |
678 } |
683 |
679 |
684 oop Klass::class_loader() const { return class_loader_data()->class_loader(); } |
|
685 |
|
686 // In product mode, this function doesn't have virtual function calls so |
680 // In product mode, this function doesn't have virtual function calls so |
687 // there might be some performance advantage to handling InstanceKlass here. |
681 // there might be some performance advantage to handling InstanceKlass here. |
688 const char* Klass::external_name() const { |
682 const char* Klass::external_name() const { |
689 if (is_instance_klass()) { |
683 if (is_instance_klass()) { |
690 const InstanceKlass* ik = static_cast<const InstanceKlass*>(this); |
684 const InstanceKlass* ik = static_cast<const InstanceKlass*>(this); |
824 |
818 |
825 if (!Symbol::is_valid(k->name())) return false; |
819 if (!Symbol::is_valid(k->name())) return false; |
826 return ClassLoaderDataGraph::is_valid(k->class_loader_data()); |
820 return ClassLoaderDataGraph::is_valid(k->class_loader_data()); |
827 } |
821 } |
828 |
822 |
829 klassVtable Klass::vtable() const { |
|
830 return klassVtable(const_cast<Klass*>(this), start_of_vtable(), vtable_length() / vtableEntry::size()); |
|
831 } |
|
832 |
|
833 vtableEntry* Klass::start_of_vtable() const { |
|
834 return (vtableEntry*) ((address)this + in_bytes(vtable_start_offset())); |
|
835 } |
|
836 |
|
837 Method* Klass::method_at_vtable(int index) { |
823 Method* Klass::method_at_vtable(int index) { |
838 #ifndef PRODUCT |
824 #ifndef PRODUCT |
839 assert(index >= 0, "valid vtable index"); |
825 assert(index >= 0, "valid vtable index"); |
840 if (DebugVtables) { |
826 if (DebugVtables) { |
841 verify_vtable_index(index); |
827 verify_vtable_index(index); |
842 } |
828 } |
843 #endif |
829 #endif |
844 return start_of_vtable()[index].method(); |
830 return start_of_vtable()[index].method(); |
845 } |
831 } |
846 |
832 |
847 ByteSize Klass::vtable_start_offset() { |
|
848 return in_ByteSize(InstanceKlass::header_size() * wordSize); |
|
849 } |
|
850 |
833 |
851 #ifndef PRODUCT |
834 #ifndef PRODUCT |
852 |
835 |
853 bool Klass::verify_vtable_index(int i) { |
836 bool Klass::verify_vtable_index(int i) { |
854 int limit = vtable_length()/vtableEntry::size(); |
837 int limit = vtable_length()/vtableEntry::size(); |