133 linked, // successfully linked/verified (but not initialized yet) |
133 linked, // successfully linked/verified (but not initialized yet) |
134 being_initialized, // currently running class initializer |
134 being_initialized, // currently running class initializer |
135 fully_initialized, // initialized (successfull final state) |
135 fully_initialized, // initialized (successfull final state) |
136 initialization_error // error happened during initialization |
136 initialization_error // error happened during initialization |
137 }; |
137 }; |
138 |
|
139 // smaller footprint for boolean flags |
|
140 enum ClassFlags { |
|
141 _noflags = 0, // initial value |
|
142 _rewritten = 0x00000001U, // rewritten |
|
143 _should_verify = 0x00000002U, // defineClass specified conditional verification |
|
144 _has_nonstatic_fields = 0x00000004U, // for sizing with UseCompressedOops |
|
145 _is_marked_dependent = 0x00000008U // used for marking during flushing and deoptimization |
|
146 }; |
|
147 |
138 |
148 public: |
139 public: |
149 oop* oop_block_beg() const { return adr_array_klasses(); } |
140 oop* oop_block_beg() const { return adr_array_klasses(); } |
150 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; } |
141 oop* oop_block_end() const { return adr_methods_default_annotations() + 1; } |
151 |
142 |
221 // (including inherited fields but after header_size()). |
212 // (including inherited fields but after header_size()). |
222 int _nonstatic_field_size; |
213 int _nonstatic_field_size; |
223 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass |
214 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass |
224 int _static_oop_field_size;// number of static oop fields in this klass |
215 int _static_oop_field_size;// number of static oop fields in this klass |
225 int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks |
216 int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks |
226 int _class_flags; // internal class state flags |
217 bool _is_marked_dependent; // used for marking during flushing and deoptimization |
|
218 bool _rewritten; // methods rewritten. |
|
219 bool _has_nonstatic_fields; // for sizing with UseCompressedOops |
|
220 bool _should_verify_class; // allow caching of preverification |
227 u2 _minor_version; // minor version number of class file |
221 u2 _minor_version; // minor version number of class file |
228 u2 _major_version; // major version number of class file |
222 u2 _major_version; // major version number of class file |
229 ClassState _init_state; // state of class |
223 ClassState _init_state; // state of class |
230 Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization) |
224 Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization) |
231 int _vtable_len; // length of Java vtable (in words) |
225 int _vtable_len; // length of Java vtable (in words) |
257 |
251 |
258 friend class instanceKlassKlass; |
252 friend class instanceKlassKlass; |
259 friend class SystemDictionary; |
253 friend class SystemDictionary; |
260 |
254 |
261 public: |
255 public: |
262 bool has_nonstatic_fields() const { return (_class_flags & _has_nonstatic_fields) != 0; } |
256 bool has_nonstatic_fields() const { return _has_nonstatic_fields; } |
263 void set_has_nonstatic_fields() { _class_flags |= _has_nonstatic_fields; } |
257 void set_has_nonstatic_fields(bool b) { _has_nonstatic_fields = b; } |
264 |
258 |
265 // field sizes |
259 // field sizes |
266 int nonstatic_field_size() const { return _nonstatic_field_size; } |
260 int nonstatic_field_size() const { return _nonstatic_field_size; } |
267 void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; } |
261 void set_nonstatic_field_size(int size) { _nonstatic_field_size = size; } |
268 |
262 |
365 bool is_not_initialized() const { return _init_state < being_initialized; } |
359 bool is_not_initialized() const { return _init_state < being_initialized; } |
366 bool is_being_initialized() const { return _init_state == being_initialized; } |
360 bool is_being_initialized() const { return _init_state == being_initialized; } |
367 bool is_in_error_state() const { return _init_state == initialization_error; } |
361 bool is_in_error_state() const { return _init_state == initialization_error; } |
368 bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; } |
362 bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; } |
369 int get_init_state() { return _init_state; } // Useful for debugging |
363 int get_init_state() { return _init_state; } // Useful for debugging |
370 bool is_rewritten() const { return (_class_flags & _rewritten) != 0; } |
364 bool is_rewritten() const { return _rewritten; } |
371 |
365 |
372 // defineClass specified verification |
366 // defineClass specified verification |
373 bool should_verify_class() const { return (_class_flags & _should_verify) != 0; } |
367 bool should_verify_class() const { return _should_verify_class; } |
374 void set_should_verify_class() { _class_flags |= _should_verify; } |
368 void set_should_verify_class(bool value) { _should_verify_class = value; } |
375 |
369 |
376 // marking |
370 // marking |
377 bool is_marked_dependent() const { return (_class_flags & _is_marked_dependent) != 0; } |
371 bool is_marked_dependent() const { return _is_marked_dependent; } |
378 void set_is_marked_dependent() { _class_flags |= _is_marked_dependent; } |
372 void set_is_marked_dependent(bool value) { _is_marked_dependent = value; } |
379 void clear_is_marked_dependent() { _class_flags &= ~_is_marked_dependent; } |
|
380 |
373 |
381 // initialization (virtuals from Klass) |
374 // initialization (virtuals from Klass) |
382 bool should_be_initialized() const; // means that initialize should be called |
375 bool should_be_initialized() const; // means that initialize should be called |
383 void initialize(TRAPS); |
376 void initialize(TRAPS); |
384 void link_class(TRAPS); |
377 void link_class(TRAPS); |
755 #ifdef ASSERT |
748 #ifdef ASSERT |
756 void set_init_state(ClassState state); |
749 void set_init_state(ClassState state); |
757 #else |
750 #else |
758 void set_init_state(ClassState state) { _init_state = state; } |
751 void set_init_state(ClassState state) { _init_state = state; } |
759 #endif |
752 #endif |
760 void clear_class_flags() { _class_flags = _noflags; } |
753 void set_rewritten() { _rewritten = true; } |
761 void set_rewritten() { _class_flags |= _rewritten; } |
|
762 void set_init_thread(Thread *thread) { _init_thread = thread; } |
754 void set_init_thread(Thread *thread) { _init_thread = thread; } |
763 |
755 |
764 u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
756 u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
765 jmethodID* methods_jmethod_ids_acquire() const |
757 jmethodID* methods_jmethod_ids_acquire() const |
766 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } |
758 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } |