1 | /* |
2 | * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
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 |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #ifndef SHARE_OOPS_INSTANCEKLASS_HPP |
26 | #define SHARE_OOPS_INSTANCEKLASS_HPP |
27 | |
28 | #include "classfile/classLoaderData.hpp" |
29 | #include "memory/referenceType.hpp" |
30 | #include "oops/annotations.hpp" |
31 | #include "oops/constMethod.hpp" |
32 | #include "oops/fieldInfo.hpp" |
33 | #include "oops/instanceOop.hpp" |
34 | #include "oops/klassVtable.hpp" |
35 | #include "runtime/handles.hpp" |
36 | #include "runtime/os.hpp" |
37 | #include "utilities/accessFlags.hpp" |
38 | #include "utilities/align.hpp" |
39 | #include "utilities/macros.hpp" |
40 | #if INCLUDE_JFR |
41 | #include "jfr/support/jfrKlassExtension.hpp" |
42 | #endif |
43 | |
44 | |
45 | // An InstanceKlass is the VM level representation of a Java class. |
46 | // It contains all information needed for at class at execution runtime. |
47 | |
48 | // InstanceKlass embedded field layout (after declared fields): |
49 | // [EMBEDDED Java vtable ] size in words = vtable_len |
50 | // [EMBEDDED nonstatic oop-map blocks] size in words = nonstatic_oop_map_size |
51 | // The embedded nonstatic oop-map blocks are short pairs (offset, length) |
52 | // indicating where oops are located in instances of this klass. |
53 | // [EMBEDDED implementor of the interface] only exist for interface |
54 | // [EMBEDDED unsafe_anonymous_host klass] only exist for an unsafe anonymous class (JSR 292 enabled) |
55 | // [EMBEDDED fingerprint ] only if should_store_fingerprint()==true |
56 | |
57 | |
58 | // forward declaration for class -- see below for definition |
59 | #if INCLUDE_JVMTI |
60 | class BreakpointInfo; |
61 | #endif |
62 | class ClassFileParser; |
63 | class ClassFileStream; |
64 | class KlassDepChange; |
65 | class DependencyContext; |
66 | class fieldDescriptor; |
67 | class jniIdMapBase; |
68 | class JNIid; |
69 | class JvmtiCachedClassFieldMap; |
70 | class nmethodBucket; |
71 | class OopMapCache; |
72 | class InterpreterOopMap; |
73 | class PackageEntry; |
74 | class ModuleEntry; |
75 | |
76 | // This is used in iterators below. |
77 | class FieldClosure: public StackObj { |
78 | public: |
79 | virtual void do_field(fieldDescriptor* fd) = 0; |
80 | }; |
81 | |
82 | #ifndef PRODUCT |
83 | // Print fields. |
84 | // If "obj" argument to constructor is NULL, prints static fields, otherwise prints non-static fields. |
85 | class FieldPrinter: public FieldClosure { |
86 | oop _obj; |
87 | outputStream* _st; |
88 | public: |
89 | FieldPrinter(outputStream* st, oop obj = NULL) : _obj(obj), _st(st) {} |
90 | void do_field(fieldDescriptor* fd); |
91 | }; |
92 | #endif // !PRODUCT |
93 | |
94 | // Describes where oops are located in instances of this klass. |
95 | class OopMapBlock { |
96 | public: |
97 | // Byte offset of the first oop mapped by this block. |
98 | int offset() const { return _offset; } |
99 | void set_offset(int offset) { _offset = offset; } |
100 | |
101 | // Number of oops in this block. |
102 | uint count() const { return _count; } |
103 | void set_count(uint count) { _count = count; } |
104 | |
105 | // sizeof(OopMapBlock) in words. |
106 | static const int size_in_words() { |
107 | return align_up((int)sizeof(OopMapBlock), wordSize) >> |
108 | LogBytesPerWord; |
109 | } |
110 | |
111 | private: |
112 | int _offset; |
113 | uint _count; |
114 | }; |
115 | |
116 | struct JvmtiCachedClassFileData; |
117 | |
118 | class InstanceKlass: public Klass { |
119 | friend class VMStructs; |
120 | friend class JVMCIVMStructs; |
121 | friend class ClassFileParser; |
122 | friend class CompileReplay; |
123 | |
124 | public: |
125 | static const KlassID ID = InstanceKlassID; |
126 | |
127 | protected: |
128 | InstanceKlass(const ClassFileParser& parser, unsigned kind, KlassID id = ID); |
129 | |
130 | public: |
131 | InstanceKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS" ); } |
132 | |
133 | // See "The Java Virtual Machine Specification" section 2.16.2-5 for a detailed description |
134 | // of the class loading & initialization procedure, and the use of the states. |
135 | enum ClassState { |
136 | allocated, // allocated (but not yet linked) |
137 | loaded, // loaded and inserted in class hierarchy (but not linked yet) |
138 | linked, // successfully linked/verified (but not initialized yet) |
139 | being_initialized, // currently running class initializer |
140 | fully_initialized, // initialized (successfull final state) |
141 | initialization_error // error happened during initialization |
142 | }; |
143 | |
144 | private: |
145 | static InstanceKlass* allocate_instance_klass(const ClassFileParser& parser, TRAPS); |
146 | |
147 | protected: |
148 | // If you add a new field that points to any metaspace object, you |
149 | // must add this field to InstanceKlass::metaspace_pointers_do(). |
150 | |
151 | // Annotations for this class |
152 | Annotations* _annotations; |
153 | // Package this class is defined in |
154 | PackageEntry* _package_entry; |
155 | // Array classes holding elements of this class. |
156 | Klass* volatile _array_klasses; |
157 | // Constant pool for this class. |
158 | ConstantPool* _constants; |
159 | // The InnerClasses attribute and EnclosingMethod attribute. The |
160 | // _inner_classes is an array of shorts. If the class has InnerClasses |
161 | // attribute, then the _inner_classes array begins with 4-tuples of shorts |
162 | // [inner_class_info_index, outer_class_info_index, |
163 | // inner_name_index, inner_class_access_flags] for the InnerClasses |
164 | // attribute. If the EnclosingMethod attribute exists, it occupies the |
165 | // last two shorts [class_index, method_index] of the array. If only |
166 | // the InnerClasses attribute exists, the _inner_classes array length is |
167 | // number_of_inner_classes * 4. If the class has both InnerClasses |
168 | // and EnclosingMethod attributes the _inner_classes array length is |
169 | // number_of_inner_classes * 4 + enclosing_method_attribute_size. |
170 | Array<jushort>* _inner_classes; |
171 | |
172 | // The NestMembers attribute. An array of shorts, where each is a |
173 | // class info index for the class that is a nest member. This data |
174 | // has not been validated. |
175 | Array<jushort>* _nest_members; |
176 | |
177 | // The NestHost attribute. The class info index for the class |
178 | // that is the nest-host of this class. This data has not been validated. |
179 | jushort _nest_host_index; |
180 | |
181 | // Resolved nest-host klass: either true nest-host or self if we are not nested. |
182 | // By always being set it makes nest-member access checks simpler. |
183 | InstanceKlass* _nest_host; |
184 | |
185 | // the source debug extension for this klass, NULL if not specified. |
186 | // Specified as UTF-8 string without terminating zero byte in the classfile, |
187 | // it is stored in the instanceklass as a NULL-terminated UTF-8 string |
188 | const char* _source_debug_extension; |
189 | // Array name derived from this class which needs unreferencing |
190 | // if this class is unloaded. |
191 | Symbol* _array_name; |
192 | |
193 | // Number of heapOopSize words used by non-static fields in this klass |
194 | // (including inherited fields but after header_size()). |
195 | int _nonstatic_field_size; |
196 | int _static_field_size; // number words used by static fields (oop and non-oop) in this klass |
197 | // Constant pool index to the utf8 entry of the Generic signature, |
198 | // or 0 if none. |
199 | u2 _generic_signature_index; |
200 | // Constant pool index to the utf8 entry for the name of source file |
201 | // containing this klass, 0 if not specified. |
202 | u2 _source_file_name_index; |
203 | u2 _static_oop_field_count;// number of static oop fields in this klass |
204 | u2 _java_fields_count; // The number of declared Java fields |
205 | int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks |
206 | |
207 | int _itable_len; // length of Java itable (in words) |
208 | // _is_marked_dependent can be set concurrently, thus cannot be part of the |
209 | // _misc_flags. |
210 | bool _is_marked_dependent; // used for marking during flushing and deoptimization |
211 | bool _is_being_redefined; // used for locking redefinition |
212 | |
213 | // The low two bits of _misc_flags contains the kind field. |
214 | // This can be used to quickly discriminate among the four kinds of |
215 | // InstanceKlass. |
216 | |
217 | static const unsigned _misc_kind_field_size = 2; |
218 | static const unsigned _misc_kind_field_pos = 0; |
219 | static const unsigned _misc_kind_field_mask = (1u << _misc_kind_field_size) - 1u; |
220 | |
221 | static const unsigned _misc_kind_other = 0; // concrete InstanceKlass |
222 | static const unsigned _misc_kind_reference = 1; // InstanceRefKlass |
223 | static const unsigned _misc_kind_class_loader = 2; // InstanceClassLoaderKlass |
224 | static const unsigned _misc_kind_mirror = 3; // InstanceMirrorKlass |
225 | |
226 | // Start after _misc_kind field. |
227 | enum { |
228 | _misc_rewritten = 1 << 2, // methods rewritten. |
229 | _misc_has_nonstatic_fields = 1 << 3, // for sizing with UseCompressedOops |
230 | _misc_should_verify_class = 1 << 4, // allow caching of preverification |
231 | _misc_is_unsafe_anonymous = 1 << 5, // has embedded _unsafe_anonymous_host field |
232 | _misc_is_contended = 1 << 6, // marked with contended annotation |
233 | _misc_has_nonstatic_concrete_methods = 1 << 7, // class/superclass/implemented interfaces has non-static, concrete methods |
234 | _misc_declares_nonstatic_concrete_methods = 1 << 8, // directly declares non-static, concrete methods |
235 | _misc_has_been_redefined = 1 << 9, // class has been redefined |
236 | _misc_has_passed_fingerprint_check = 1 << 10, // when this class was loaded, the fingerprint computed from its |
237 | // code source was found to be matching the value recorded by AOT. |
238 | _misc_is_scratch_class = 1 << 11, // class is the redefined scratch class |
239 | _misc_is_shared_boot_class = 1 << 12, // defining class loader is boot class loader |
240 | _misc_is_shared_platform_class = 1 << 13, // defining class loader is platform class loader |
241 | _misc_is_shared_app_class = 1 << 14, // defining class loader is app class loader |
242 | _misc_has_resolved_methods = 1 << 15 // resolved methods table entries added for this class |
243 | }; |
244 | u2 loader_type_bits() { |
245 | return _misc_is_shared_boot_class|_misc_is_shared_platform_class|_misc_is_shared_app_class; |
246 | } |
247 | u2 _misc_flags; |
248 | u2 _minor_version; // minor version number of class file |
249 | u2 _major_version; // major version number of class file |
250 | Thread* _init_thread; // Pointer to current thread doing initialization (to handle recursive initialization) |
251 | OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily) |
252 | JNIid* _jni_ids; // First JNI identifier for static fields in this class |
253 | jmethodID* volatile _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none |
254 | nmethodBucket* volatile _dep_context; // packed DependencyContext structure |
255 | uint64_t volatile _dep_context_last_cleaned; |
256 | nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class |
257 | #if INCLUDE_JVMTI |
258 | BreakpointInfo* _breakpoints; // bpt lists, managed by Method* |
259 | // Linked instanceKlasses of previous versions |
260 | InstanceKlass* _previous_versions; |
261 | // JVMTI fields can be moved to their own structure - see 6315920 |
262 | // JVMTI: cached class file, before retransformable agent modified it in CFLH |
263 | JvmtiCachedClassFileData* _cached_class_file; |
264 | #endif |
265 | |
266 | volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change |
267 | |
268 | // Class states are defined as ClassState (see above). |
269 | // Place the _init_state here to utilize the unused 2-byte after |
270 | // _idnum_allocated_count. |
271 | u1 _init_state; // state of class |
272 | u1 _reference_type; // reference type |
273 | |
274 | u2 _this_class_index; // constant pool entry |
275 | #if INCLUDE_JVMTI |
276 | JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration |
277 | #endif |
278 | |
279 | NOT_PRODUCT(int _verify_count;) // to avoid redundant verifies |
280 | |
281 | // Method array. |
282 | Array<Method*>* _methods; |
283 | // Default Method Array, concrete methods inherited from interfaces |
284 | Array<Method*>* _default_methods; |
285 | // Interfaces (InstanceKlass*s) this class declares locally to implement. |
286 | Array<InstanceKlass*>* _local_interfaces; |
287 | // Interfaces (InstanceKlass*s) this class implements transitively. |
288 | Array<InstanceKlass*>* _transitive_interfaces; |
289 | // Int array containing the original order of method in the class file (for JVMTI). |
290 | Array<int>* _method_ordering; |
291 | // Int array containing the vtable_indices for default_methods |
292 | // offset matches _default_methods offset |
293 | Array<int>* _default_vtable_indices; |
294 | |
295 | // Instance and static variable information, starts with 6-tuples of shorts |
296 | // [access, name index, sig index, initval index, low_offset, high_offset] |
297 | // for all fields, followed by the generic signature data at the end of |
298 | // the array. Only fields with generic signature attributes have the generic |
299 | // signature data set in the array. The fields array looks like following: |
300 | // |
301 | // f1: [access, name index, sig index, initial value index, low_offset, high_offset] |
302 | // f2: [access, name index, sig index, initial value index, low_offset, high_offset] |
303 | // ... |
304 | // fn: [access, name index, sig index, initial value index, low_offset, high_offset] |
305 | // [generic signature index] |
306 | // [generic signature index] |
307 | // ... |
308 | Array<u2>* _fields; |
309 | |
310 | // embedded Java vtable follows here |
311 | // embedded Java itables follows here |
312 | // embedded static fields follows here |
313 | // embedded nonstatic oop-map blocks follows here |
314 | // embedded implementor of this interface follows here |
315 | // The embedded implementor only exists if the current klass is an |
316 | // iterface. The possible values of the implementor fall into following |
317 | // three cases: |
318 | // NULL: no implementor. |
319 | // A Klass* that's not itself: one implementor. |
320 | // Itself: more than one implementors. |
321 | // embedded unsafe_anonymous_host klass follows here |
322 | // The embedded host klass only exists in an unsafe anonymous class for |
323 | // dynamic language support (JSR 292 enabled). The host class grants |
324 | // its access privileges to this class also. The host class is either |
325 | // named, or a previously loaded unsafe anonymous class. A non-anonymous class |
326 | // or an anonymous class loaded through normal classloading does not |
327 | // have this embedded field. |
328 | // |
329 | |
330 | friend class SystemDictionary; |
331 | |
332 | public: |
333 | u2 loader_type() { |
334 | return _misc_flags & loader_type_bits(); |
335 | } |
336 | |
337 | bool is_shared_boot_class() const { |
338 | return (_misc_flags & _misc_is_shared_boot_class) != 0; |
339 | } |
340 | bool is_shared_platform_class() const { |
341 | return (_misc_flags & _misc_is_shared_platform_class) != 0; |
342 | } |
343 | bool is_shared_app_class() const { |
344 | return (_misc_flags & _misc_is_shared_app_class) != 0; |
345 | } |
346 | |
347 | void clear_class_loader_type() { |
348 | _misc_flags &= ~loader_type_bits(); |
349 | } |
350 | |
351 | void set_class_loader_type(s2 loader_type); |
352 | |
353 | bool has_nonstatic_fields() const { |
354 | return (_misc_flags & _misc_has_nonstatic_fields) != 0; |
355 | } |
356 | void set_has_nonstatic_fields(bool b) { |
357 | if (b) { |
358 | _misc_flags |= _misc_has_nonstatic_fields; |
359 | } else { |
360 | _misc_flags &= ~_misc_has_nonstatic_fields; |
361 | } |
362 | } |
363 | |
364 | // field sizes |
365 | int nonstatic_field_size() const { return _nonstatic_field_size; } |
366 | void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; } |
367 | |
368 | int static_field_size() const { return _static_field_size; } |
369 | void set_static_field_size(int size) { _static_field_size = size; } |
370 | |
371 | int static_oop_field_count() const { return (int)_static_oop_field_count; } |
372 | void set_static_oop_field_count(u2 size) { _static_oop_field_count = size; } |
373 | |
374 | // Java itable |
375 | int itable_length() const { return _itable_len; } |
376 | void set_itable_length(int len) { _itable_len = len; } |
377 | |
378 | // array klasses |
379 | Klass* array_klasses() const { return _array_klasses; } |
380 | inline Klass* array_klasses_acquire() const; // load with acquire semantics |
381 | void set_array_klasses(Klass* k) { _array_klasses = k; } |
382 | inline void release_set_array_klasses(Klass* k); // store with release semantics |
383 | |
384 | // methods |
385 | Array<Method*>* methods() const { return _methods; } |
386 | void set_methods(Array<Method*>* a) { _methods = a; } |
387 | Method* method_with_idnum(int idnum); |
388 | Method* method_with_orig_idnum(int idnum); |
389 | Method* method_with_orig_idnum(int idnum, int version); |
390 | |
391 | // method ordering |
392 | Array<int>* method_ordering() const { return _method_ordering; } |
393 | void set_method_ordering(Array<int>* m) { _method_ordering = m; } |
394 | void copy_method_ordering(const intArray* m, TRAPS); |
395 | |
396 | // default_methods |
397 | Array<Method*>* default_methods() const { return _default_methods; } |
398 | void set_default_methods(Array<Method*>* a) { _default_methods = a; } |
399 | |
400 | // default method vtable_indices |
401 | Array<int>* default_vtable_indices() const { return _default_vtable_indices; } |
402 | void set_default_vtable_indices(Array<int>* v) { _default_vtable_indices = v; } |
403 | Array<int>* create_new_default_vtable_indices(int len, TRAPS); |
404 | |
405 | // interfaces |
406 | Array<InstanceKlass*>* local_interfaces() const { return _local_interfaces; } |
407 | void set_local_interfaces(Array<InstanceKlass*>* a) { |
408 | guarantee(_local_interfaces == NULL || a == NULL, "Just checking" ); |
409 | _local_interfaces = a; } |
410 | |
411 | Array<InstanceKlass*>* transitive_interfaces() const { return _transitive_interfaces; } |
412 | void set_transitive_interfaces(Array<InstanceKlass*>* a) { |
413 | guarantee(_transitive_interfaces == NULL || a == NULL, "Just checking" ); |
414 | _transitive_interfaces = a; |
415 | } |
416 | |
417 | private: |
418 | friend class fieldDescriptor; |
419 | FieldInfo* field(int index) const { return FieldInfo::from_field_array(_fields, index); } |
420 | |
421 | public: |
422 | int field_offset (int index) const { return field(index)->offset(); } |
423 | int field_access_flags(int index) const { return field(index)->access_flags(); } |
424 | Symbol* field_name (int index) const { return field(index)->name(constants()); } |
425 | Symbol* field_signature (int index) const { return field(index)->signature(constants()); } |
426 | |
427 | // Number of Java declared fields |
428 | int java_fields_count() const { return (int)_java_fields_count; } |
429 | |
430 | Array<u2>* fields() const { return _fields; } |
431 | void set_fields(Array<u2>* f, u2 java_fields_count) { |
432 | guarantee(_fields == NULL || f == NULL, "Just checking" ); |
433 | _fields = f; |
434 | _java_fields_count = java_fields_count; |
435 | } |
436 | |
437 | // inner classes |
438 | Array<u2>* inner_classes() const { return _inner_classes; } |
439 | void set_inner_classes(Array<u2>* f) { _inner_classes = f; } |
440 | |
441 | // nest members |
442 | Array<u2>* nest_members() const { return _nest_members; } |
443 | void set_nest_members(Array<u2>* m) { _nest_members = m; } |
444 | |
445 | // nest-host index |
446 | jushort nest_host_index() const { return _nest_host_index; } |
447 | void set_nest_host_index(u2 i) { _nest_host_index = i; } |
448 | |
449 | private: |
450 | // Called to verify that k is a member of this nest - does not look at k's nest-host |
451 | bool has_nest_member(InstanceKlass* k, TRAPS) const; |
452 | public: |
453 | // Returns nest-host class, resolving and validating it if needed |
454 | // Returns NULL if an exception occurs during loading, or validation fails |
455 | InstanceKlass* nest_host(Symbol* validationException, TRAPS); |
456 | // Check if this klass is a nestmate of k - resolves this nest-host and k's |
457 | bool has_nestmate_access_to(InstanceKlass* k, TRAPS); |
458 | |
459 | enum InnerClassAttributeOffset { |
460 | // From http://mirror.eng/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc10.html#18814 |
461 | inner_class_inner_class_info_offset = 0, |
462 | inner_class_outer_class_info_offset = 1, |
463 | inner_class_inner_name_offset = 2, |
464 | inner_class_access_flags_offset = 3, |
465 | inner_class_next_offset = 4 |
466 | }; |
467 | |
468 | enum EnclosingMethodAttributeOffset { |
469 | enclosing_method_class_index_offset = 0, |
470 | enclosing_method_method_index_offset = 1, |
471 | enclosing_method_attribute_size = 2 |
472 | }; |
473 | |
474 | // method override check |
475 | bool is_override(const methodHandle& super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS); |
476 | |
477 | // package |
478 | PackageEntry* package() const { return _package_entry; } |
479 | ModuleEntry* module() const; |
480 | bool in_unnamed_package() const { return (_package_entry == NULL); } |
481 | void set_package(PackageEntry* p) { _package_entry = p; } |
482 | void set_package(ClassLoaderData* loader_data, TRAPS); |
483 | bool is_same_class_package(const Klass* class2) const; |
484 | bool is_same_class_package(oop other_class_loader, const Symbol* other_class_name) const; |
485 | |
486 | // find an enclosing class |
487 | InstanceKlass* compute_enclosing_class(bool* inner_is_member, TRAPS) const; |
488 | |
489 | // Find InnerClasses attribute and return outer_class_info_index & inner_name_index. |
490 | bool find_inner_classes_attr(int* ooff, int* noff, TRAPS) const; |
491 | |
492 | private: |
493 | // Check prohibited package ("java/" only loadable by boot or platform loaders) |
494 | static void check_prohibited_package(Symbol* class_name, |
495 | ClassLoaderData* loader_data, |
496 | TRAPS); |
497 | public: |
498 | // initialization state |
499 | bool is_loaded() const { return _init_state >= loaded; } |
500 | bool is_linked() const { return _init_state >= linked; } |
501 | bool is_initialized() const { return _init_state == fully_initialized; } |
502 | bool is_not_initialized() const { return _init_state < being_initialized; } |
503 | bool is_being_initialized() const { return _init_state == being_initialized; } |
504 | bool is_in_error_state() const { return _init_state == initialization_error; } |
505 | bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; } |
506 | ClassState init_state() { return (ClassState)_init_state; } |
507 | bool is_rewritten() const { return (_misc_flags & _misc_rewritten) != 0; } |
508 | |
509 | // defineClass specified verification |
510 | bool should_verify_class() const { |
511 | return (_misc_flags & _misc_should_verify_class) != 0; |
512 | } |
513 | void set_should_verify_class(bool value) { |
514 | if (value) { |
515 | _misc_flags |= _misc_should_verify_class; |
516 | } else { |
517 | _misc_flags &= ~_misc_should_verify_class; |
518 | } |
519 | } |
520 | |
521 | // marking |
522 | bool is_marked_dependent() const { return _is_marked_dependent; } |
523 | void set_is_marked_dependent(bool value) { _is_marked_dependent = value; } |
524 | |
525 | // initialization (virtuals from Klass) |
526 | bool should_be_initialized() const; // means that initialize should be called |
527 | void initialize(TRAPS); |
528 | void link_class(TRAPS); |
529 | bool link_class_or_fail(TRAPS); // returns false on failure |
530 | void rewrite_class(TRAPS); |
531 | void link_methods(TRAPS); |
532 | Method* class_initializer() const; |
533 | |
534 | // set the class to initialized if no static initializer is present |
535 | void eager_initialize(Thread *thread); |
536 | |
537 | // reference type |
538 | ReferenceType reference_type() const { return (ReferenceType)_reference_type; } |
539 | void set_reference_type(ReferenceType t) { |
540 | assert(t == (u1)t, "overflow" ); |
541 | _reference_type = (u1)t; |
542 | } |
543 | |
544 | // this class cp index |
545 | u2 this_class_index() const { return _this_class_index; } |
546 | void set_this_class_index(u2 index) { _this_class_index = index; } |
547 | |
548 | static ByteSize reference_type_offset() { return in_ByteSize(offset_of(InstanceKlass, _reference_type)); } |
549 | |
550 | // find local field, returns true if found |
551 | bool find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const; |
552 | // find field in direct superinterfaces, returns the interface in which the field is defined |
553 | Klass* find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const; |
554 | // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined |
555 | Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const; |
556 | // find instance or static fields according to JVM spec 5.4.3.2, returns the klass in which the field is defined |
557 | Klass* find_field(Symbol* name, Symbol* sig, bool is_static, fieldDescriptor* fd) const; |
558 | |
559 | // find a non-static or static field given its offset within the class. |
560 | bool contains_field_offset(int offset) { |
561 | return instanceOopDesc::contains_field_offset(offset, nonstatic_field_size()); |
562 | } |
563 | |
564 | bool find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const; |
565 | bool find_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const; |
566 | |
567 | // find a local method (returns NULL if not found) |
568 | Method* find_method(const Symbol* name, const Symbol* signature) const; |
569 | static Method* find_method(const Array<Method*>* methods, |
570 | const Symbol* name, |
571 | const Symbol* signature); |
572 | |
573 | // find a local method, but skip static methods |
574 | Method* find_instance_method(const Symbol* name, const Symbol* signature, |
575 | PrivateLookupMode private_mode = find_private) const; |
576 | static Method* find_instance_method(const Array<Method*>* methods, |
577 | const Symbol* name, |
578 | const Symbol* signature, |
579 | PrivateLookupMode private_mode = find_private); |
580 | |
581 | // find a local method (returns NULL if not found) |
582 | Method* find_local_method(const Symbol* name, |
583 | const Symbol* signature, |
584 | OverpassLookupMode overpass_mode, |
585 | StaticLookupMode static_mode, |
586 | PrivateLookupMode private_mode) const; |
587 | |
588 | // find a local method from given methods array (returns NULL if not found) |
589 | static Method* find_local_method(const Array<Method*>* methods, |
590 | const Symbol* name, |
591 | const Symbol* signature, |
592 | OverpassLookupMode overpass_mode, |
593 | StaticLookupMode static_mode, |
594 | PrivateLookupMode private_mode); |
595 | |
596 | // find a local method index in methods or default_methods (returns -1 if not found) |
597 | static int find_method_index(const Array<Method*>* methods, |
598 | const Symbol* name, |
599 | const Symbol* signature, |
600 | OverpassLookupMode overpass_mode, |
601 | StaticLookupMode static_mode, |
602 | PrivateLookupMode private_mode); |
603 | |
604 | // lookup operation (returns NULL if not found) |
605 | Method* uncached_lookup_method(const Symbol* name, |
606 | const Symbol* signature, |
607 | OverpassLookupMode overpass_mode, |
608 | PrivateLookupMode private_mode = find_private) const; |
609 | |
610 | // lookup a method in all the interfaces that this class implements |
611 | // (returns NULL if not found) |
612 | Method* lookup_method_in_all_interfaces(Symbol* name, Symbol* signature, DefaultsLookupMode defaults_mode) const; |
613 | |
614 | // lookup a method in local defaults then in all interfaces |
615 | // (returns NULL if not found) |
616 | Method* lookup_method_in_ordered_interfaces(Symbol* name, Symbol* signature) const; |
617 | |
618 | // Find method indices by name. If a method with the specified name is |
619 | // found the index to the first method is returned, and 'end' is filled in |
620 | // with the index of first non-name-matching method. If no method is found |
621 | // -1 is returned. |
622 | int find_method_by_name(const Symbol* name, int* end) const; |
623 | static int find_method_by_name(const Array<Method*>* methods, |
624 | const Symbol* name, int* end); |
625 | |
626 | // constant pool |
627 | ConstantPool* constants() const { return _constants; } |
628 | void set_constants(ConstantPool* c) { _constants = c; } |
629 | |
630 | // protection domain |
631 | oop protection_domain() const; |
632 | |
633 | // signers |
634 | objArrayOop signers() const; |
635 | |
636 | // host class |
637 | InstanceKlass* unsafe_anonymous_host() const { |
638 | InstanceKlass** hk = adr_unsafe_anonymous_host(); |
639 | if (hk == NULL) { |
640 | assert(!is_unsafe_anonymous(), "Unsafe anonymous classes have host klasses" ); |
641 | return NULL; |
642 | } else { |
643 | assert(*hk != NULL, "host klass should always be set if the address is not null" ); |
644 | assert(is_unsafe_anonymous(), "Only unsafe anonymous classes have host klasses" ); |
645 | return *hk; |
646 | } |
647 | } |
648 | void set_unsafe_anonymous_host(const InstanceKlass* host) { |
649 | assert(is_unsafe_anonymous(), "not unsafe anonymous" ); |
650 | const InstanceKlass** addr = (const InstanceKlass **)adr_unsafe_anonymous_host(); |
651 | assert(addr != NULL, "no reversed space" ); |
652 | if (addr != NULL) { |
653 | *addr = host; |
654 | } |
655 | } |
656 | bool is_unsafe_anonymous() const { |
657 | return (_misc_flags & _misc_is_unsafe_anonymous) != 0; |
658 | } |
659 | void set_is_unsafe_anonymous(bool value) { |
660 | if (value) { |
661 | _misc_flags |= _misc_is_unsafe_anonymous; |
662 | } else { |
663 | _misc_flags &= ~_misc_is_unsafe_anonymous; |
664 | } |
665 | } |
666 | |
667 | bool is_contended() const { |
668 | return (_misc_flags & _misc_is_contended) != 0; |
669 | } |
670 | void set_is_contended(bool value) { |
671 | if (value) { |
672 | _misc_flags |= _misc_is_contended; |
673 | } else { |
674 | _misc_flags &= ~_misc_is_contended; |
675 | } |
676 | } |
677 | |
678 | // source file name |
679 | Symbol* source_file_name() const { |
680 | return (_source_file_name_index == 0) ? |
681 | (Symbol*)NULL : _constants->symbol_at(_source_file_name_index); |
682 | } |
683 | u2 source_file_name_index() const { |
684 | return _source_file_name_index; |
685 | } |
686 | void set_source_file_name_index(u2 sourcefile_index) { |
687 | _source_file_name_index = sourcefile_index; |
688 | } |
689 | |
690 | // minor and major version numbers of class file |
691 | u2 minor_version() const { return _minor_version; } |
692 | void set_minor_version(u2 minor_version) { _minor_version = minor_version; } |
693 | u2 major_version() const { return _major_version; } |
694 | void set_major_version(u2 major_version) { _major_version = major_version; } |
695 | |
696 | // source debug extension |
697 | const char* source_debug_extension() const { return _source_debug_extension; } |
698 | void set_source_debug_extension(const char* array, int length); |
699 | |
700 | // symbol unloading support (refcount already added) |
701 | Symbol* array_name() { return _array_name; } |
702 | void set_array_name(Symbol* name) { assert(_array_name == NULL || name == NULL, "name already created" ); _array_name = name; } |
703 | |
704 | // nonstatic oop-map blocks |
705 | static int nonstatic_oop_map_size(unsigned int oop_map_count) { |
706 | return oop_map_count * OopMapBlock::size_in_words(); |
707 | } |
708 | unsigned int nonstatic_oop_map_count() const { |
709 | return _nonstatic_oop_map_size / OopMapBlock::size_in_words(); |
710 | } |
711 | int nonstatic_oop_map_size() const { return _nonstatic_oop_map_size; } |
712 | void set_nonstatic_oop_map_size(int words) { |
713 | _nonstatic_oop_map_size = words; |
714 | } |
715 | |
716 | #if INCLUDE_JVMTI |
717 | // Redefinition locking. Class can only be redefined by one thread at a time. |
718 | bool is_being_redefined() const { return _is_being_redefined; } |
719 | void set_is_being_redefined(bool value) { _is_being_redefined = value; } |
720 | |
721 | // RedefineClasses() support for previous versions: |
722 | void add_previous_version(InstanceKlass* ik, int emcp_method_count); |
723 | void purge_previous_version_list(); |
724 | |
725 | InstanceKlass* previous_versions() const { return _previous_versions; } |
726 | #else |
727 | InstanceKlass* previous_versions() const { return NULL; } |
728 | #endif |
729 | |
730 | InstanceKlass* get_klass_version(int version) { |
731 | for (InstanceKlass* ik = this; ik != NULL; ik = ik->previous_versions()) { |
732 | if (ik->constants()->version() == version) { |
733 | return ik; |
734 | } |
735 | } |
736 | return NULL; |
737 | } |
738 | |
739 | bool has_been_redefined() const { |
740 | return (_misc_flags & _misc_has_been_redefined) != 0; |
741 | } |
742 | void set_has_been_redefined() { |
743 | _misc_flags |= _misc_has_been_redefined; |
744 | } |
745 | |
746 | bool has_passed_fingerprint_check() const { |
747 | return (_misc_flags & _misc_has_passed_fingerprint_check) != 0; |
748 | } |
749 | void set_has_passed_fingerprint_check(bool b) { |
750 | if (b) { |
751 | _misc_flags |= _misc_has_passed_fingerprint_check; |
752 | } else { |
753 | _misc_flags &= ~_misc_has_passed_fingerprint_check; |
754 | } |
755 | } |
756 | bool supers_have_passed_fingerprint_checks(); |
757 | |
758 | static bool should_store_fingerprint(bool is_unsafe_anonymous); |
759 | bool should_store_fingerprint() const { return should_store_fingerprint(is_unsafe_anonymous()); } |
760 | bool has_stored_fingerprint() const; |
761 | uint64_t get_stored_fingerprint() const; |
762 | void store_fingerprint(uint64_t fingerprint); |
763 | |
764 | bool is_scratch_class() const { |
765 | return (_misc_flags & _misc_is_scratch_class) != 0; |
766 | } |
767 | |
768 | void set_is_scratch_class() { |
769 | _misc_flags |= _misc_is_scratch_class; |
770 | } |
771 | |
772 | bool has_resolved_methods() const { |
773 | return (_misc_flags & _misc_has_resolved_methods) != 0; |
774 | } |
775 | |
776 | void set_has_resolved_methods() { |
777 | _misc_flags |= _misc_has_resolved_methods; |
778 | } |
779 | private: |
780 | |
781 | void set_kind(unsigned kind) { |
782 | assert(kind <= _misc_kind_field_mask, "Invalid InstanceKlass kind" ); |
783 | unsigned fmask = _misc_kind_field_mask << _misc_kind_field_pos; |
784 | unsigned flags = _misc_flags & ~fmask; |
785 | _misc_flags = (flags | (kind << _misc_kind_field_pos)); |
786 | } |
787 | |
788 | bool is_kind(unsigned desired) const { |
789 | unsigned kind = (_misc_flags >> _misc_kind_field_pos) & _misc_kind_field_mask; |
790 | return kind == desired; |
791 | } |
792 | |
793 | public: |
794 | |
795 | // Other is anything that is not one of the more specialized kinds of InstanceKlass. |
796 | bool is_other_instance_klass() const { return is_kind(_misc_kind_other); } |
797 | bool is_reference_instance_klass() const { return is_kind(_misc_kind_reference); } |
798 | bool is_mirror_instance_klass() const { return is_kind(_misc_kind_mirror); } |
799 | bool is_class_loader_instance_klass() const { return is_kind(_misc_kind_class_loader); } |
800 | |
801 | #if INCLUDE_JVMTI |
802 | |
803 | void init_previous_versions() { |
804 | _previous_versions = NULL; |
805 | } |
806 | |
807 | private: |
808 | static bool _has_previous_versions; |
809 | public: |
810 | static void purge_previous_versions(InstanceKlass* ik) { |
811 | if (ik->has_been_redefined()) { |
812 | ik->purge_previous_version_list(); |
813 | } |
814 | } |
815 | |
816 | static bool has_previous_versions_and_reset(); |
817 | static bool has_previous_versions() { return _has_previous_versions; } |
818 | |
819 | // JVMTI: Support for caching a class file before it is modified by an agent that can do retransformation |
820 | void set_cached_class_file(JvmtiCachedClassFileData *data) { |
821 | _cached_class_file = data; |
822 | } |
823 | JvmtiCachedClassFileData * get_cached_class_file(); |
824 | jint get_cached_class_file_len(); |
825 | unsigned char * get_cached_class_file_bytes(); |
826 | |
827 | // JVMTI: Support for caching of field indices, types, and offsets |
828 | void set_jvmti_cached_class_field_map(JvmtiCachedClassFieldMap* descriptor) { |
829 | _jvmti_cached_class_field_map = descriptor; |
830 | } |
831 | JvmtiCachedClassFieldMap* jvmti_cached_class_field_map() const { |
832 | return _jvmti_cached_class_field_map; |
833 | } |
834 | #else // INCLUDE_JVMTI |
835 | |
836 | static void purge_previous_versions(InstanceKlass* ik) { return; }; |
837 | static bool has_previous_versions_and_reset() { return false; } |
838 | |
839 | void set_cached_class_file(JvmtiCachedClassFileData *data) { |
840 | assert(data == NULL, "unexpected call with JVMTI disabled" ); |
841 | } |
842 | JvmtiCachedClassFileData * get_cached_class_file() { return (JvmtiCachedClassFileData *)NULL; } |
843 | |
844 | #endif // INCLUDE_JVMTI |
845 | |
846 | bool has_nonstatic_concrete_methods() const { |
847 | return (_misc_flags & _misc_has_nonstatic_concrete_methods) != 0; |
848 | } |
849 | void set_has_nonstatic_concrete_methods(bool b) { |
850 | if (b) { |
851 | _misc_flags |= _misc_has_nonstatic_concrete_methods; |
852 | } else { |
853 | _misc_flags &= ~_misc_has_nonstatic_concrete_methods; |
854 | } |
855 | } |
856 | |
857 | bool declares_nonstatic_concrete_methods() const { |
858 | return (_misc_flags & _misc_declares_nonstatic_concrete_methods) != 0; |
859 | } |
860 | void set_declares_nonstatic_concrete_methods(bool b) { |
861 | if (b) { |
862 | _misc_flags |= _misc_declares_nonstatic_concrete_methods; |
863 | } else { |
864 | _misc_flags &= ~_misc_declares_nonstatic_concrete_methods; |
865 | } |
866 | } |
867 | |
868 | // for adding methods, ConstMethod::UNSET_IDNUM means no more ids available |
869 | inline u2 next_method_idnum(); |
870 | void set_initial_method_idnum(u2 value) { _idnum_allocated_count = value; } |
871 | |
872 | // generics support |
873 | Symbol* generic_signature() const { |
874 | return (_generic_signature_index == 0) ? |
875 | (Symbol*)NULL : _constants->symbol_at(_generic_signature_index); |
876 | } |
877 | u2 generic_signature_index() const { |
878 | return _generic_signature_index; |
879 | } |
880 | void set_generic_signature_index(u2 sig_index) { |
881 | _generic_signature_index = sig_index; |
882 | } |
883 | |
884 | u2 enclosing_method_data(int offset) const; |
885 | u2 enclosing_method_class_index() const { |
886 | return enclosing_method_data(enclosing_method_class_index_offset); |
887 | } |
888 | u2 enclosing_method_method_index() { |
889 | return enclosing_method_data(enclosing_method_method_index_offset); |
890 | } |
891 | void set_enclosing_method_indices(u2 class_index, |
892 | u2 method_index); |
893 | |
894 | // jmethodID support |
895 | jmethodID get_jmethod_id(const methodHandle& method_h); |
896 | jmethodID get_jmethod_id_fetch_or_update(size_t idnum, |
897 | jmethodID new_id, jmethodID* new_jmeths, |
898 | jmethodID* to_dealloc_id_p, |
899 | jmethodID** to_dealloc_jmeths_p); |
900 | static void get_jmethod_id_length_value(jmethodID* cache, size_t idnum, |
901 | size_t *length_p, jmethodID* id_p); |
902 | void ensure_space_for_methodids(int start_offset = 0); |
903 | jmethodID jmethod_id_or_null(Method* method); |
904 | |
905 | // annotations support |
906 | Annotations* annotations() const { return _annotations; } |
907 | void set_annotations(Annotations* anno) { _annotations = anno; } |
908 | |
909 | AnnotationArray* class_annotations() const { |
910 | return (_annotations != NULL) ? _annotations->class_annotations() : NULL; |
911 | } |
912 | Array<AnnotationArray*>* fields_annotations() const { |
913 | return (_annotations != NULL) ? _annotations->fields_annotations() : NULL; |
914 | } |
915 | AnnotationArray* class_type_annotations() const { |
916 | return (_annotations != NULL) ? _annotations->class_type_annotations() : NULL; |
917 | } |
918 | Array<AnnotationArray*>* fields_type_annotations() const { |
919 | return (_annotations != NULL) ? _annotations->fields_type_annotations() : NULL; |
920 | } |
921 | // allocation |
922 | instanceOop allocate_instance(TRAPS); |
923 | |
924 | // additional member function to return a handle |
925 | instanceHandle allocate_instance_handle(TRAPS); |
926 | |
927 | objArrayOop allocate_objArray(int n, int length, TRAPS); |
928 | // Helper function |
929 | static instanceOop register_finalizer(instanceOop i, TRAPS); |
930 | |
931 | // Check whether reflection/jni/jvm code is allowed to instantiate this class; |
932 | // if not, throw either an Error or an Exception. |
933 | virtual void check_valid_for_instantiation(bool throwError, TRAPS); |
934 | |
935 | // initialization |
936 | void call_class_initializer(TRAPS); |
937 | void set_initialization_state_and_notify(ClassState state, TRAPS); |
938 | |
939 | // OopMapCache support |
940 | OopMapCache* oop_map_cache() { return _oop_map_cache; } |
941 | void set_oop_map_cache(OopMapCache *cache) { _oop_map_cache = cache; } |
942 | void mask_for(const methodHandle& method, int bci, InterpreterOopMap* entry); |
943 | |
944 | // JNI identifier support (for static fields - for jni performance) |
945 | JNIid* jni_ids() { return _jni_ids; } |
946 | void set_jni_ids(JNIid* ids) { _jni_ids = ids; } |
947 | JNIid* jni_id_for(int offset); |
948 | |
949 | // maintenance of deoptimization dependencies |
950 | inline DependencyContext dependencies(); |
951 | int mark_dependent_nmethods(KlassDepChange& changes); |
952 | void add_dependent_nmethod(nmethod* nm); |
953 | void remove_dependent_nmethod(nmethod* nm); |
954 | void clean_dependency_context(); |
955 | |
956 | // On-stack replacement support |
957 | nmethod* osr_nmethods_head() const { return _osr_nmethods_head; }; |
958 | void set_osr_nmethods_head(nmethod* h) { _osr_nmethods_head = h; }; |
959 | void add_osr_nmethod(nmethod* n); |
960 | bool remove_osr_nmethod(nmethod* n); |
961 | int mark_osr_nmethods(const Method* m); |
962 | nmethod* lookup_osr_nmethod(const Method* m, int bci, int level, bool match_level) const; |
963 | |
964 | #if INCLUDE_JVMTI |
965 | // Breakpoint support (see methods on Method* for details) |
966 | BreakpointInfo* breakpoints() const { return _breakpoints; }; |
967 | void set_breakpoints(BreakpointInfo* bps) { _breakpoints = bps; }; |
968 | #endif |
969 | |
970 | // support for stub routines |
971 | static ByteSize init_state_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_state)); } |
972 | JFR_ONLY(DEFINE_KLASS_TRACE_ID_OFFSET;) |
973 | static ByteSize init_thread_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_thread)); } |
974 | |
975 | // subclass/subinterface checks |
976 | bool implements_interface(Klass* k) const; |
977 | bool is_same_or_direct_interface(Klass* k) const; |
978 | |
979 | #ifdef ASSERT |
980 | // check whether this class or one of its superclasses was redefined |
981 | bool has_redefined_this_or_super() const; |
982 | #endif |
983 | |
984 | // Access to the implementor of an interface. |
985 | Klass* implementor() const; |
986 | void set_implementor(Klass* k); |
987 | int nof_implementors() const; |
988 | void add_implementor(Klass* k); // k is a new class that implements this interface |
989 | void init_implementor(); // initialize |
990 | |
991 | // link this class into the implementors list of every interface it implements |
992 | void process_interfaces(Thread *thread); |
993 | |
994 | // virtual operations from Klass |
995 | bool is_leaf_class() const { return _subklass == NULL; } |
996 | GrowableArray<Klass*>* compute_secondary_supers(int , |
997 | Array<InstanceKlass*>* transitive_interfaces); |
998 | bool can_be_primary_super_slow() const; |
999 | int oop_size(oop obj) const { return size_helper(); } |
1000 | // slow because it's a virtual call and used for verifying the layout_helper. |
1001 | // Using the layout_helper bits, we can call is_instance_klass without a virtual call. |
1002 | DEBUG_ONLY(bool is_instance_klass_slow() const { return true; }) |
1003 | |
1004 | // Iterators |
1005 | void do_local_static_fields(FieldClosure* cl); |
1006 | void do_nonstatic_fields(FieldClosure* cl); // including inherited fields |
1007 | void do_local_static_fields(void f(fieldDescriptor*, Handle, TRAPS), Handle, TRAPS); |
1008 | |
1009 | void methods_do(void f(Method* method)); |
1010 | void array_klasses_do(void f(Klass* k)); |
1011 | void array_klasses_do(void f(Klass* k, TRAPS), TRAPS); |
1012 | |
1013 | static InstanceKlass* cast(Klass* k) { |
1014 | return const_cast<InstanceKlass*>(cast(const_cast<const Klass*>(k))); |
1015 | } |
1016 | |
1017 | static const InstanceKlass* cast(const Klass* k) { |
1018 | assert(k != NULL, "k should not be null" ); |
1019 | assert(k->is_instance_klass(), "cast to InstanceKlass" ); |
1020 | return static_cast<const InstanceKlass*>(k); |
1021 | } |
1022 | |
1023 | virtual InstanceKlass* java_super() const { |
1024 | return (super() == NULL) ? NULL : cast(super()); |
1025 | } |
1026 | |
1027 | // Sizing (in words) |
1028 | static int () { return sizeof(InstanceKlass)/wordSize; } |
1029 | |
1030 | static int size(int vtable_length, int itable_length, |
1031 | int nonstatic_oop_map_size, |
1032 | bool is_interface, bool is_unsafe_anonymous, bool has_stored_fingerprint) { |
1033 | return align_metadata_size(header_size() + |
1034 | vtable_length + |
1035 | itable_length + |
1036 | nonstatic_oop_map_size + |
1037 | (is_interface ? (int)sizeof(Klass*)/wordSize : 0) + |
1038 | (is_unsafe_anonymous ? (int)sizeof(Klass*)/wordSize : 0) + |
1039 | (has_stored_fingerprint ? (int)sizeof(uint64_t*)/wordSize : 0)); |
1040 | } |
1041 | int size() const { return size(vtable_length(), |
1042 | itable_length(), |
1043 | nonstatic_oop_map_size(), |
1044 | is_interface(), |
1045 | is_unsafe_anonymous(), |
1046 | has_stored_fingerprint()); |
1047 | } |
1048 | #if INCLUDE_SERVICES |
1049 | virtual void collect_statistics(KlassSizeStats *sz) const; |
1050 | #endif |
1051 | |
1052 | intptr_t* start_of_itable() const { return (intptr_t*)start_of_vtable() + vtable_length(); } |
1053 | intptr_t* end_of_itable() const { return start_of_itable() + itable_length(); } |
1054 | |
1055 | int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; } |
1056 | |
1057 | oop static_field_base_raw() { return java_mirror(); } |
1058 | |
1059 | OopMapBlock* start_of_nonstatic_oop_maps() const { |
1060 | return (OopMapBlock*)(start_of_itable() + itable_length()); |
1061 | } |
1062 | |
1063 | Klass** end_of_nonstatic_oop_maps() const { |
1064 | return (Klass**)(start_of_nonstatic_oop_maps() + |
1065 | nonstatic_oop_map_count()); |
1066 | } |
1067 | |
1068 | Klass* volatile* adr_implementor() const { |
1069 | if (is_interface()) { |
1070 | return (Klass* volatile*)end_of_nonstatic_oop_maps(); |
1071 | } else { |
1072 | return NULL; |
1073 | } |
1074 | }; |
1075 | |
1076 | InstanceKlass** adr_unsafe_anonymous_host() const { |
1077 | if (is_unsafe_anonymous()) { |
1078 | InstanceKlass** adr_impl = (InstanceKlass**)adr_implementor(); |
1079 | if (adr_impl != NULL) { |
1080 | return adr_impl + 1; |
1081 | } else { |
1082 | return (InstanceKlass **)end_of_nonstatic_oop_maps(); |
1083 | } |
1084 | } else { |
1085 | return NULL; |
1086 | } |
1087 | } |
1088 | |
1089 | address adr_fingerprint() const { |
1090 | if (has_stored_fingerprint()) { |
1091 | InstanceKlass** adr_host = adr_unsafe_anonymous_host(); |
1092 | if (adr_host != NULL) { |
1093 | return (address)(adr_host + 1); |
1094 | } |
1095 | |
1096 | Klass* volatile* adr_impl = adr_implementor(); |
1097 | if (adr_impl != NULL) { |
1098 | return (address)(adr_impl + 1); |
1099 | } |
1100 | |
1101 | return (address)end_of_nonstatic_oop_maps(); |
1102 | } else { |
1103 | return NULL; |
1104 | } |
1105 | } |
1106 | |
1107 | // Use this to return the size of an instance in heap words: |
1108 | int size_helper() const { |
1109 | return layout_helper_to_size_helper(layout_helper()); |
1110 | } |
1111 | |
1112 | // This bit is initialized in classFileParser.cpp. |
1113 | // It is false under any of the following conditions: |
1114 | // - the class is abstract (including any interface) |
1115 | // - the class has a finalizer (if !RegisterFinalizersAtInit) |
1116 | // - the class size is larger than FastAllocateSizeLimit |
1117 | // - the class is java/lang/Class, which cannot be allocated directly |
1118 | bool can_be_fastpath_allocated() const { |
1119 | return !layout_helper_needs_slow_path(layout_helper()); |
1120 | } |
1121 | |
1122 | // Java itable |
1123 | klassItable itable() const; // return klassItable wrapper |
1124 | Method* method_at_itable(Klass* holder, int index, TRAPS); |
1125 | |
1126 | #if INCLUDE_JVMTI |
1127 | void adjust_default_methods(bool* trace_name_printed); |
1128 | #endif // INCLUDE_JVMTI |
1129 | |
1130 | void clean_weak_instanceklass_links(); |
1131 | private: |
1132 | void clean_implementors_list(); |
1133 | void clean_method_data(); |
1134 | |
1135 | public: |
1136 | // Explicit metaspace deallocation of fields |
1137 | // For RedefineClasses and class file parsing errors, we need to deallocate |
1138 | // instanceKlasses and the metadata they point to. |
1139 | void deallocate_contents(ClassLoaderData* loader_data); |
1140 | static void deallocate_methods(ClassLoaderData* loader_data, |
1141 | Array<Method*>* methods); |
1142 | void static deallocate_interfaces(ClassLoaderData* loader_data, |
1143 | const Klass* super_klass, |
1144 | Array<InstanceKlass*>* local_interfaces, |
1145 | Array<InstanceKlass*>* transitive_interfaces); |
1146 | |
1147 | // The constant pool is on stack if any of the methods are executing or |
1148 | // referenced by handles. |
1149 | bool on_stack() const { return _constants->on_stack(); } |
1150 | |
1151 | // callbacks for actions during class unloading |
1152 | static void unload_class(InstanceKlass* ik); |
1153 | static void release_C_heap_structures(InstanceKlass* ik); |
1154 | |
1155 | // Naming |
1156 | const char* signature_name() const; |
1157 | static Symbol* package_from_name(const Symbol* name, TRAPS); |
1158 | |
1159 | // Oop fields (and metadata) iterators |
1160 | // |
1161 | // The InstanceKlass iterators also visits the Object's klass. |
1162 | |
1163 | // Forward iteration |
1164 | public: |
1165 | // Iterate over all oop fields in the oop maps. |
1166 | template <typename T, class OopClosureType> |
1167 | inline void oop_oop_iterate_oop_maps(oop obj, OopClosureType* closure); |
1168 | |
1169 | // Iterate over all oop fields and metadata. |
1170 | template <typename T, class OopClosureType> |
1171 | inline void oop_oop_iterate(oop obj, OopClosureType* closure); |
1172 | |
1173 | // Iterate over all oop fields in one oop map. |
1174 | template <typename T, class OopClosureType> |
1175 | inline void oop_oop_iterate_oop_map(OopMapBlock* map, oop obj, OopClosureType* closure); |
1176 | |
1177 | |
1178 | // Reverse iteration |
1179 | // Iterate over all oop fields and metadata. |
1180 | template <typename T, class OopClosureType> |
1181 | inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure); |
1182 | |
1183 | private: |
1184 | // Iterate over all oop fields in the oop maps. |
1185 | template <typename T, class OopClosureType> |
1186 | inline void oop_oop_iterate_oop_maps_reverse(oop obj, OopClosureType* closure); |
1187 | |
1188 | // Iterate over all oop fields in one oop map. |
1189 | template <typename T, class OopClosureType> |
1190 | inline void oop_oop_iterate_oop_map_reverse(OopMapBlock* map, oop obj, OopClosureType* closure); |
1191 | |
1192 | |
1193 | // Bounded range iteration |
1194 | public: |
1195 | // Iterate over all oop fields in the oop maps. |
1196 | template <typename T, class OopClosureType> |
1197 | inline void oop_oop_iterate_oop_maps_bounded(oop obj, OopClosureType* closure, MemRegion mr); |
1198 | |
1199 | // Iterate over all oop fields and metadata. |
1200 | template <typename T, class OopClosureType> |
1201 | inline void oop_oop_iterate_bounded(oop obj, OopClosureType* closure, MemRegion mr); |
1202 | |
1203 | private: |
1204 | // Iterate over all oop fields in one oop map. |
1205 | template <typename T, class OopClosureType> |
1206 | inline void oop_oop_iterate_oop_map_bounded(OopMapBlock* map, oop obj, OopClosureType* closure, MemRegion mr); |
1207 | |
1208 | |
1209 | public: |
1210 | u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
1211 | |
1212 | public: |
1213 | void set_in_error_state() { |
1214 | assert(DumpSharedSpaces, "only call this when dumping archive" ); |
1215 | _init_state = initialization_error; |
1216 | } |
1217 | bool check_sharing_error_state(); |
1218 | |
1219 | private: |
1220 | // initialization state |
1221 | void set_init_state(ClassState state); |
1222 | void set_rewritten() { _misc_flags |= _misc_rewritten; } |
1223 | void set_init_thread(Thread *thread) { _init_thread = thread; } |
1224 | |
1225 | // The RedefineClasses() API can cause new method idnums to be needed |
1226 | // which will cause the caches to grow. Safety requires different |
1227 | // cache management logic if the caches can grow instead of just |
1228 | // going from NULL to non-NULL. |
1229 | bool idnum_can_increment() const { return has_been_redefined(); } |
1230 | inline jmethodID* methods_jmethod_ids_acquire() const; |
1231 | inline void release_set_methods_jmethod_ids(jmethodID* jmeths); |
1232 | |
1233 | // Lock during initialization |
1234 | public: |
1235 | // Lock for (1) initialization; (2) access to the ConstantPool of this class. |
1236 | // Must be one per class and it has to be a VM internal object so java code |
1237 | // cannot lock it (like the mirror). |
1238 | // It has to be an object not a Mutex because it's held through java calls. |
1239 | oop init_lock() const; |
1240 | private: |
1241 | void fence_and_clear_init_lock(); |
1242 | |
1243 | bool link_class_impl (TRAPS); |
1244 | bool verify_code (TRAPS); |
1245 | void initialize_impl (TRAPS); |
1246 | void initialize_super_interfaces (TRAPS); |
1247 | void eager_initialize_impl (); |
1248 | /* jni_id_for_impl for jfieldID only */ |
1249 | JNIid* jni_id_for_impl (int offset); |
1250 | |
1251 | // Returns the array class for the n'th dimension |
1252 | Klass* array_klass_impl(bool or_null, int n, TRAPS); |
1253 | |
1254 | // Returns the array class with this class as element type |
1255 | Klass* array_klass_impl(bool or_null, TRAPS); |
1256 | |
1257 | // find a local method (returns NULL if not found) |
1258 | Method* find_method_impl(const Symbol* name, |
1259 | const Symbol* signature, |
1260 | OverpassLookupMode overpass_mode, |
1261 | StaticLookupMode static_mode, |
1262 | PrivateLookupMode private_mode) const; |
1263 | |
1264 | static Method* find_method_impl(const Array<Method*>* methods, |
1265 | const Symbol* name, |
1266 | const Symbol* signature, |
1267 | OverpassLookupMode overpass_mode, |
1268 | StaticLookupMode static_mode, |
1269 | PrivateLookupMode private_mode); |
1270 | |
1271 | // Free CHeap allocated fields. |
1272 | void release_C_heap_structures(); |
1273 | |
1274 | #if INCLUDE_JVMTI |
1275 | // RedefineClasses support |
1276 | void link_previous_versions(InstanceKlass* pv) { _previous_versions = pv; } |
1277 | void mark_newly_obsolete_methods(Array<Method*>* old_methods, int emcp_method_count); |
1278 | #endif |
1279 | public: |
1280 | // CDS support - remove and restore oops from metadata. Oops are not shared. |
1281 | virtual void remove_unshareable_info(); |
1282 | virtual void remove_java_mirror(); |
1283 | virtual void restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS); |
1284 | |
1285 | // jvm support |
1286 | jint compute_modifier_flags(TRAPS) const; |
1287 | |
1288 | public: |
1289 | // JVMTI support |
1290 | jint jvmti_class_status() const; |
1291 | |
1292 | virtual void metaspace_pointers_do(MetaspaceClosure* iter); |
1293 | |
1294 | public: |
1295 | // Printing |
1296 | #ifndef PRODUCT |
1297 | void print_on(outputStream* st) const; |
1298 | #endif |
1299 | void print_value_on(outputStream* st) const; |
1300 | |
1301 | void oop_print_value_on(oop obj, outputStream* st); |
1302 | |
1303 | #ifndef PRODUCT |
1304 | void oop_print_on (oop obj, outputStream* st); |
1305 | |
1306 | void print_dependent_nmethods(bool verbose = false); |
1307 | bool is_dependent_nmethod(nmethod* nm); |
1308 | bool verify_itable_index(int index); |
1309 | #endif |
1310 | |
1311 | const char* internal_name() const; |
1312 | |
1313 | // Verification |
1314 | void verify_on(outputStream* st); |
1315 | |
1316 | void oop_verify_on(oop obj, outputStream* st); |
1317 | |
1318 | // Logging |
1319 | void print_class_load_logging(ClassLoaderData* loader_data, |
1320 | const char* module_name, |
1321 | const ClassFileStream* cfs) const; |
1322 | }; |
1323 | |
1324 | // for adding methods |
1325 | // UNSET_IDNUM return means no more ids available |
1326 | inline u2 InstanceKlass::next_method_idnum() { |
1327 | if (_idnum_allocated_count == ConstMethod::MAX_IDNUM) { |
1328 | return ConstMethod::UNSET_IDNUM; // no more ids available |
1329 | } else { |
1330 | return _idnum_allocated_count++; |
1331 | } |
1332 | } |
1333 | |
1334 | |
1335 | /* JNIid class for jfieldIDs only */ |
1336 | class JNIid: public CHeapObj<mtClass> { |
1337 | friend class VMStructs; |
1338 | private: |
1339 | Klass* _holder; |
1340 | JNIid* _next; |
1341 | int _offset; |
1342 | #ifdef ASSERT |
1343 | bool _is_static_field_id; |
1344 | #endif |
1345 | |
1346 | public: |
1347 | // Accessors |
1348 | Klass* holder() const { return _holder; } |
1349 | int offset() const { return _offset; } |
1350 | JNIid* next() { return _next; } |
1351 | // Constructor |
1352 | JNIid(Klass* holder, int offset, JNIid* next); |
1353 | // Identifier lookup |
1354 | JNIid* find(int offset); |
1355 | |
1356 | bool find_local_field(fieldDescriptor* fd) { |
1357 | return InstanceKlass::cast(holder())->find_local_field_from_offset(offset(), true, fd); |
1358 | } |
1359 | |
1360 | static void deallocate(JNIid* id); |
1361 | // Debugging |
1362 | #ifdef ASSERT |
1363 | bool is_static_field_id() const { return _is_static_field_id; } |
1364 | void set_is_static_field_id() { _is_static_field_id = true; } |
1365 | #endif |
1366 | void verify(Klass* holder); |
1367 | }; |
1368 | |
1369 | // An iterator that's used to access the inner classes indices in the |
1370 | // InstanceKlass::_inner_classes array. |
1371 | class InnerClassesIterator : public StackObj { |
1372 | private: |
1373 | Array<jushort>* _inner_classes; |
1374 | int _length; |
1375 | int _idx; |
1376 | public: |
1377 | |
1378 | InnerClassesIterator(const InstanceKlass* k) { |
1379 | _inner_classes = k->inner_classes(); |
1380 | if (k->inner_classes() != NULL) { |
1381 | _length = _inner_classes->length(); |
1382 | // The inner class array's length should be the multiple of |
1383 | // inner_class_next_offset if it only contains the InnerClasses |
1384 | // attribute data, or it should be |
1385 | // n*inner_class_next_offset+enclosing_method_attribute_size |
1386 | // if it also contains the EnclosingMethod data. |
1387 | assert((_length % InstanceKlass::inner_class_next_offset == 0 || |
1388 | _length % InstanceKlass::inner_class_next_offset == InstanceKlass::enclosing_method_attribute_size), |
1389 | "just checking" ); |
1390 | // Remove the enclosing_method portion if exists. |
1391 | if (_length % InstanceKlass::inner_class_next_offset == InstanceKlass::enclosing_method_attribute_size) { |
1392 | _length -= InstanceKlass::enclosing_method_attribute_size; |
1393 | } |
1394 | } else { |
1395 | _length = 0; |
1396 | } |
1397 | _idx = 0; |
1398 | } |
1399 | |
1400 | int length() const { |
1401 | return _length; |
1402 | } |
1403 | |
1404 | void next() { |
1405 | _idx += InstanceKlass::inner_class_next_offset; |
1406 | } |
1407 | |
1408 | bool done() const { |
1409 | return (_idx >= _length); |
1410 | } |
1411 | |
1412 | u2 inner_class_info_index() const { |
1413 | return _inner_classes->at( |
1414 | _idx + InstanceKlass::inner_class_inner_class_info_offset); |
1415 | } |
1416 | |
1417 | void set_inner_class_info_index(u2 index) { |
1418 | _inner_classes->at_put( |
1419 | _idx + InstanceKlass::inner_class_inner_class_info_offset, index); |
1420 | } |
1421 | |
1422 | u2 outer_class_info_index() const { |
1423 | return _inner_classes->at( |
1424 | _idx + InstanceKlass::inner_class_outer_class_info_offset); |
1425 | } |
1426 | |
1427 | void set_outer_class_info_index(u2 index) { |
1428 | _inner_classes->at_put( |
1429 | _idx + InstanceKlass::inner_class_outer_class_info_offset, index); |
1430 | } |
1431 | |
1432 | u2 inner_name_index() const { |
1433 | return _inner_classes->at( |
1434 | _idx + InstanceKlass::inner_class_inner_name_offset); |
1435 | } |
1436 | |
1437 | void set_inner_name_index(u2 index) { |
1438 | _inner_classes->at_put( |
1439 | _idx + InstanceKlass::inner_class_inner_name_offset, index); |
1440 | } |
1441 | |
1442 | u2 inner_access_flags() const { |
1443 | return _inner_classes->at( |
1444 | _idx + InstanceKlass::inner_class_access_flags_offset); |
1445 | } |
1446 | }; |
1447 | |
1448 | #endif // SHARE_OOPS_INSTANCEKLASS_HPP |
1449 | |