111 linked, // successfully linked/verified (but not initialized yet) |
111 linked, // successfully linked/verified (but not initialized yet) |
112 being_initialized, // currently running class initializer |
112 being_initialized, // currently running class initializer |
113 fully_initialized, // initialized (successfull final state) |
113 fully_initialized, // initialized (successfull final state) |
114 initialization_error // error happened during initialization |
114 initialization_error // error happened during initialization |
115 }; |
115 }; |
|
116 |
|
117 // smaller footprint for boolean flags |
|
118 enum ClassFlags { |
|
119 _noflags = 0, // initial value |
|
120 _rewritten = 0x00000001U, // rewritten |
|
121 _should_verify = 0x00000002U, // defineClass specified conditional verification |
|
122 _has_nonstatic_fields = 0x00000004U, // for sizing with UseCompressedOops |
|
123 _is_marked_dependent = 0x00000008U // used for marking during flushing and deoptimization |
|
124 }; |
116 |
125 |
117 public: |
126 public: |
118 oop* oop_block_beg() const { return adr_array_klasses(); } |
127 oop* oop_block_beg() const { return adr_array_klasses(); } |
119 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; } |
128 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; } |
120 |
129 |
190 // (including inherited fields but after header_size()). |
199 // (including inherited fields but after header_size()). |
191 int _nonstatic_field_size; |
200 int _nonstatic_field_size; |
192 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass |
201 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass |
193 int _static_oop_field_size;// number of static oop fields in this klass |
202 int _static_oop_field_size;// number of static oop fields in this klass |
194 int _nonstatic_oop_map_size;// number of nonstatic oop-map blocks allocated at end of this klass |
203 int _nonstatic_oop_map_size;// number of nonstatic oop-map blocks allocated at end of this klass |
195 bool _is_marked_dependent; // used for marking during flushing and deoptimization |
204 int _class_flags; // internal class state flags |
196 bool _rewritten; // methods rewritten. |
|
197 bool _has_nonstatic_fields; // for sizing with UseCompressedOops |
|
198 u2 _minor_version; // minor version number of class file |
205 u2 _minor_version; // minor version number of class file |
199 u2 _major_version; // major version number of class file |
206 u2 _major_version; // major version number of class file |
200 ClassState _init_state; // state of class |
207 ClassState _init_state; // state of class |
201 Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization) |
208 Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization) |
202 int _vtable_len; // length of Java vtable (in words) |
209 int _vtable_len; // length of Java vtable (in words) |
228 |
235 |
229 friend class instanceKlassKlass; |
236 friend class instanceKlassKlass; |
230 friend class SystemDictionary; |
237 friend class SystemDictionary; |
231 |
238 |
232 public: |
239 public: |
233 bool has_nonstatic_fields() const { return _has_nonstatic_fields; } |
240 bool has_nonstatic_fields() const { return (_class_flags & _has_nonstatic_fields) != 0; } |
234 void set_has_nonstatic_fields(bool b) { _has_nonstatic_fields = b; } |
241 void set_has_nonstatic_fields() { _class_flags |= _has_nonstatic_fields; } |
235 |
242 |
236 // field sizes |
243 // field sizes |
237 int nonstatic_field_size() const { return _nonstatic_field_size; } |
244 int nonstatic_field_size() const { return _nonstatic_field_size; } |
238 void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; } |
245 void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; } |
239 |
246 |
336 bool is_not_initialized() const { return _init_state < being_initialized; } |
343 bool is_not_initialized() const { return _init_state < being_initialized; } |
337 bool is_being_initialized() const { return _init_state == being_initialized; } |
344 bool is_being_initialized() const { return _init_state == being_initialized; } |
338 bool is_in_error_state() const { return _init_state == initialization_error; } |
345 bool is_in_error_state() const { return _init_state == initialization_error; } |
339 bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; } |
346 bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; } |
340 int get_init_state() { return _init_state; } // Useful for debugging |
347 int get_init_state() { return _init_state; } // Useful for debugging |
341 bool is_rewritten() const { return _rewritten; } |
348 bool is_rewritten() const { return (_class_flags & _rewritten) != 0; } |
|
349 |
|
350 // defineClass specified verification |
|
351 bool should_verify_class() const { return (_class_flags & _should_verify) != 0; } |
|
352 void set_should_verify_class() { _class_flags |= _should_verify; } |
342 |
353 |
343 // marking |
354 // marking |
344 bool is_marked_dependent() const { return _is_marked_dependent; } |
355 bool is_marked_dependent() const { return (_class_flags & _is_marked_dependent) != 0; } |
345 void set_is_marked_dependent(bool value) { _is_marked_dependent = value; } |
356 void set_is_marked_dependent() { _class_flags |= _is_marked_dependent; } |
|
357 void clear_is_marked_dependent() { _class_flags &= ~_is_marked_dependent; } |
346 |
358 |
347 // initialization (virtuals from Klass) |
359 // initialization (virtuals from Klass) |
348 bool should_be_initialized() const; // means that initialize should be called |
360 bool should_be_initialized() const; // means that initialize should be called |
349 void initialize(TRAPS); |
361 void initialize(TRAPS); |
350 void link_class(TRAPS); |
362 void link_class(TRAPS); |
713 #ifdef ASSERT |
725 #ifdef ASSERT |
714 void set_init_state(ClassState state); |
726 void set_init_state(ClassState state); |
715 #else |
727 #else |
716 void set_init_state(ClassState state) { _init_state = state; } |
728 void set_init_state(ClassState state) { _init_state = state; } |
717 #endif |
729 #endif |
718 void set_rewritten() { _rewritten = true; } |
730 void clear_class_flags() { _class_flags = _noflags; } |
|
731 void set_rewritten() { _class_flags |= _rewritten; } |
719 void set_init_thread(Thread *thread) { _init_thread = thread; } |
732 void set_init_thread(Thread *thread) { _init_thread = thread; } |
720 |
733 |
721 u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
734 u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
722 jmethodID* methods_jmethod_ids_acquire() const |
735 jmethodID* methods_jmethod_ids_acquire() const |
723 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } |
736 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } |