Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/instanceKlass.hpp @ 5998:49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
Summary: Change implementor to embedded instanceKlass field.
Reviewed-by: sspitsyn, minqi, coleenp
author | jiangli |
---|---|
date | Thu, 29 Mar 2012 22:18:56 -0400 |
parents | f7c4174b33ba |
children | 0105f367a14c |
comparison
equal
deleted
inserted
replaced
5970:0698f5ef5535 | 5998:49036505ab5f |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
54 // [next sibling ] Klass | 54 // [next sibling ] Klass |
55 // [array klasses ] | 55 // [array klasses ] |
56 // [methods ] | 56 // [methods ] |
57 // [local interfaces ] | 57 // [local interfaces ] |
58 // [transitive interfaces ] | 58 // [transitive interfaces ] |
59 // [number of implementors ] | |
60 // [implementors ] klassOop[2] | |
61 // [fields ] | 59 // [fields ] |
62 // [constants ] | 60 // [constants ] |
63 // [class loader ] | 61 // [class loader ] |
64 // [protection domain ] | 62 // [protection domain ] |
65 // [signers ] | 63 // [signers ] |
75 // [initializing thread ] | 73 // [initializing thread ] |
76 // [Java vtable length ] | 74 // [Java vtable length ] |
77 // [oop map cache (stack maps) ] | 75 // [oop map cache (stack maps) ] |
78 // [EMBEDDED Java vtable ] size in words = vtable_len | 76 // [EMBEDDED Java vtable ] size in words = vtable_len |
79 // [EMBEDDED nonstatic oop-map blocks] size in words = nonstatic_oop_map_size | 77 // [EMBEDDED nonstatic oop-map blocks] size in words = nonstatic_oop_map_size |
80 // | 78 // The embedded nonstatic oop-map blocks are short pairs (offset, length) |
81 // The embedded nonstatic oop-map blocks are short pairs (offset, length) indicating | 79 // indicating where oops are located in instances of this klass. |
82 // where oops are located in instances of this klass. | 80 // [EMBEDDED implementor of the interface] only exist for interface |
83 | 81 |
84 | 82 |
85 // forward declaration for class -- see below for definition | 83 // forward declaration for class -- see below for definition |
86 class SuperTypeClosure; | 84 class SuperTypeClosure; |
87 class JNIid; | 85 class JNIid; |
150 }; | 148 }; |
151 | 149 |
152 public: | 150 public: |
153 oop* oop_block_beg() const { return adr_array_klasses(); } | 151 oop* oop_block_beg() const { return adr_array_klasses(); } |
154 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; } | 152 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; } |
155 | |
156 enum { | |
157 implementors_limit = 2 // how many implems can we track? | |
158 }; | |
159 | 153 |
160 protected: | 154 protected: |
161 // | 155 // |
162 // The oop block. See comment in klass.hpp before making changes. | 156 // The oop block. See comment in klass.hpp before making changes. |
163 // | 157 // |
198 // the InnerClasses attribute exists, the _inner_classes array length is | 192 // the InnerClasses attribute exists, the _inner_classes array length is |
199 // number_of_inner_classes * 4. If the class has both InnerClasses | 193 // number_of_inner_classes * 4. If the class has both InnerClasses |
200 // and EnclosingMethod attributes the _inner_classes array length is | 194 // and EnclosingMethod attributes the _inner_classes array length is |
201 // number_of_inner_classes * 4 + enclosing_method_attribute_size. | 195 // number_of_inner_classes * 4 + enclosing_method_attribute_size. |
202 typeArrayOop _inner_classes; | 196 typeArrayOop _inner_classes; |
203 // Implementors of this interface (not valid if it overflows) | |
204 klassOop _implementors[implementors_limit]; | |
205 // Annotations for this class, or null if none. | 197 // Annotations for this class, or null if none. |
206 typeArrayOop _class_annotations; | 198 typeArrayOop _class_annotations; |
207 // Annotation objects (byte arrays) for fields, or null if no annotations. | 199 // Annotation objects (byte arrays) for fields, or null if no annotations. |
208 // Indices correspond to entries (not indices) in fields array. | 200 // Indices correspond to entries (not indices) in fields array. |
209 objArrayOop _fields_annotations; | 201 objArrayOop _fields_annotations; |
255 jmethodID* _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none | 247 jmethodID* _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none |
256 int* _methods_cached_itable_indices; // itable_index cache for JNI invoke corresponding to methods idnum, or NULL | 248 int* _methods_cached_itable_indices; // itable_index cache for JNI invoke corresponding to methods idnum, or NULL |
257 nmethodBucket* _dependencies; // list of dependent nmethods | 249 nmethodBucket* _dependencies; // list of dependent nmethods |
258 nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class | 250 nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class |
259 BreakpointInfo* _breakpoints; // bpt lists, managed by methodOop | 251 BreakpointInfo* _breakpoints; // bpt lists, managed by methodOop |
260 int _nof_implementors; // No of implementors of this interface (zero if not an interface) | |
261 // Array of interesting part(s) of the previous version(s) of this | 252 // Array of interesting part(s) of the previous version(s) of this |
262 // instanceKlass. See PreviousVersionWalker below. | 253 // instanceKlass. See PreviousVersionWalker below. |
263 GrowableArray<PreviousVersionNode *>* _previous_versions; | 254 GrowableArray<PreviousVersionNode *>* _previous_versions; |
264 // JVMTI fields can be moved to their own structure - see 6315920 | 255 // JVMTI fields can be moved to their own structure - see 6315920 |
265 unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH | 256 unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH |
276 | 267 |
277 // embedded Java vtable follows here | 268 // embedded Java vtable follows here |
278 // embedded Java itables follows here | 269 // embedded Java itables follows here |
279 // embedded static fields follows here | 270 // embedded static fields follows here |
280 // embedded nonstatic oop-map blocks follows here | 271 // embedded nonstatic oop-map blocks follows here |
272 // embedded implementor of this interface follows here | |
273 // The embedded implementor only exists if the current klass is an | |
274 // iterface. The possible values of the implementor fall into following | |
275 // three cases: | |
276 // NULL: no implementor. | |
277 // A klassOop that's not itself: one implementor. | |
278 // Itsef: more than one implementors. | |
281 | 279 |
282 friend class instanceKlassKlass; | 280 friend class instanceKlassKlass; |
283 friend class SystemDictionary; | 281 friend class SystemDictionary; |
284 | 282 |
285 public: | 283 public: |
647 static ByteSize init_thread_offset() { return in_ByteSize(sizeof(klassOopDesc) + offset_of(instanceKlass, _init_thread)); } | 645 static ByteSize init_thread_offset() { return in_ByteSize(sizeof(klassOopDesc) + offset_of(instanceKlass, _init_thread)); } |
648 | 646 |
649 // subclass/subinterface checks | 647 // subclass/subinterface checks |
650 bool implements_interface(klassOop k) const; | 648 bool implements_interface(klassOop k) const; |
651 | 649 |
652 // Access to implementors of an interface. We only store the count | 650 // Access to the implementor of an interface. |
653 // of implementors, and in case, there are only a few | 651 klassOop implementor() const |
654 // implementors, we store them in a short list. | 652 { |
655 // This accessor returns NULL if we walk off the end of the list. | 653 klassOop* k = start_of_implementor(); |
656 klassOop implementor(int i) const { | 654 if (k == NULL) { |
657 return (i < implementors_limit)? _implementors[i]: (klassOop) NULL; | 655 return NULL; |
658 } | 656 } else { |
659 int nof_implementors() const { return _nof_implementors; } | 657 return *k; |
658 } | |
659 } | |
660 | |
661 void set_implementor(klassOop k) { | |
662 assert(is_interface(), "not interface"); | |
663 oop* addr = (oop*)start_of_implementor(); | |
664 oop_store_without_check(addr, k); | |
665 } | |
666 | |
667 int nof_implementors() const { | |
668 klassOop k = implementor(); | |
669 if (k == NULL) { | |
670 return 0; | |
671 } else if (k != this->as_klassOop()) { | |
672 return 1; | |
673 } else { | |
674 return 2; | |
675 } | |
676 } | |
677 | |
660 void add_implementor(klassOop k); // k is a new class that implements this interface | 678 void add_implementor(klassOop k); // k is a new class that implements this interface |
661 void init_implementor(); // initialize | 679 void init_implementor(); // initialize |
662 | 680 |
663 // link this class into the implementors list of every interface it implements | 681 // link this class into the implementors list of every interface it implements |
664 void process_interfaces(Thread *thread); | 682 void process_interfaces(Thread *thread); |
691 return (instanceKlass*) kp; | 709 return (instanceKlass*) kp; |
692 } | 710 } |
693 | 711 |
694 // Sizing (in words) | 712 // Sizing (in words) |
695 static int header_size() { return align_object_offset(oopDesc::header_size() + sizeof(instanceKlass)/HeapWordSize); } | 713 static int header_size() { return align_object_offset(oopDesc::header_size() + sizeof(instanceKlass)/HeapWordSize); } |
696 int object_size() const { return object_size(align_object_offset(vtable_length()) + align_object_offset(itable_length()) + nonstatic_oop_map_size()); } | 714 |
715 int object_size() const | |
716 { | |
717 return object_size(align_object_offset(vtable_length()) + | |
718 align_object_offset(itable_length()) + | |
719 (is_interface() ? | |
720 (align_object_offset(nonstatic_oop_map_size()) + (int)sizeof(klassOop)/HeapWordSize) : | |
721 nonstatic_oop_map_size())); | |
722 } | |
697 static int vtable_start_offset() { return header_size(); } | 723 static int vtable_start_offset() { return header_size(); } |
698 static int vtable_length_offset() { return oopDesc::header_size() + offset_of(instanceKlass, _vtable_len) / HeapWordSize; } | 724 static int vtable_length_offset() { return oopDesc::header_size() + offset_of(instanceKlass, _vtable_len) / HeapWordSize; } |
699 static int object_size(int extra) { return align_object_size(header_size() + extra); } | 725 static int object_size(int extra) { return align_object_size(header_size() + extra); } |
700 | 726 |
701 intptr_t* start_of_vtable() const { return ((intptr_t*)as_klassOop()) + vtable_start_offset(); } | 727 intptr_t* start_of_vtable() const { return ((intptr_t*)as_klassOop()) + vtable_start_offset(); } |
707 address static_field_addr(int offset); | 733 address static_field_addr(int offset); |
708 | 734 |
709 OopMapBlock* start_of_nonstatic_oop_maps() const { | 735 OopMapBlock* start_of_nonstatic_oop_maps() const { |
710 return (OopMapBlock*)(start_of_itable() + align_object_offset(itable_length())); | 736 return (OopMapBlock*)(start_of_itable() + align_object_offset(itable_length())); |
711 } | 737 } |
738 | |
739 klassOop* start_of_implementor() const { | |
740 if (is_interface()) { | |
741 return (klassOop*)(start_of_nonstatic_oop_maps() + | |
742 nonstatic_oop_map_count()); | |
743 } else { | |
744 return NULL; | |
745 } | |
746 }; | |
712 | 747 |
713 // Allocation profiling support | 748 // Allocation profiling support |
714 juint alloc_size() const { return _alloc_count * size_helper(); } | 749 juint alloc_size() const { return _alloc_count * size_helper(); } |
715 void set_alloc_size(juint n) {} | 750 void set_alloc_size(juint n) {} |
716 | 751 |
817 oop* adr_class_loader() const { return (oop*)&this->_class_loader;} | 852 oop* adr_class_loader() const { return (oop*)&this->_class_loader;} |
818 oop* adr_protection_domain() const { return (oop*)&this->_protection_domain;} | 853 oop* adr_protection_domain() const { return (oop*)&this->_protection_domain;} |
819 oop* adr_host_klass() const { return (oop*)&this->_host_klass;} | 854 oop* adr_host_klass() const { return (oop*)&this->_host_klass;} |
820 oop* adr_signers() const { return (oop*)&this->_signers;} | 855 oop* adr_signers() const { return (oop*)&this->_signers;} |
821 oop* adr_inner_classes() const { return (oop*)&this->_inner_classes;} | 856 oop* adr_inner_classes() const { return (oop*)&this->_inner_classes;} |
822 oop* adr_implementors() const { return (oop*)&this->_implementors[0];} | 857 oop* adr_implementor() const { return (oop*)start_of_implementor(); } |
823 oop* adr_methods_jmethod_ids() const { return (oop*)&this->_methods_jmethod_ids;} | 858 oop* adr_methods_jmethod_ids() const { return (oop*)&this->_methods_jmethod_ids;} |
824 oop* adr_methods_cached_itable_indices() const { return (oop*)&this->_methods_cached_itable_indices;} | 859 oop* adr_methods_cached_itable_indices() const { return (oop*)&this->_methods_cached_itable_indices;} |
825 oop* adr_class_annotations() const { return (oop*)&this->_class_annotations;} | 860 oop* adr_class_annotations() const { return (oop*)&this->_class_annotations;} |
826 oop* adr_fields_annotations() const { return (oop*)&this->_fields_annotations;} | 861 oop* adr_fields_annotations() const { return (oop*)&this->_fields_annotations;} |
827 oop* adr_methods_annotations() const { return (oop*)&this->_methods_annotations;} | 862 oop* adr_methods_annotations() const { return (oop*)&this->_methods_annotations;} |