463 } |
463 } |
464 |
464 |
465 // RedefineClasses() support for previous versions: |
465 // RedefineClasses() support for previous versions: |
466 void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods, |
466 void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods, |
467 int emcp_method_count); |
467 int emcp_method_count); |
|
468 // If the _previous_versions array is non-NULL, then this klass |
|
469 // has been redefined at least once even if we aren't currently |
|
470 // tracking a previous version. |
|
471 bool has_been_redefined() const { return _previous_versions != NULL; } |
468 bool has_previous_version() const; |
472 bool has_previous_version() const; |
469 void init_previous_versions() { |
473 void init_previous_versions() { |
470 _previous_versions = NULL; |
474 _previous_versions = NULL; |
471 } |
475 } |
472 GrowableArray<PreviousVersionNode *>* previous_versions() const { |
476 GrowableArray<PreviousVersionNode *>* previous_versions() const { |
504 // JSR 292 support |
508 // JSR 292 support |
505 oop bootstrap_method() const { return _bootstrap_method; } |
509 oop bootstrap_method() const { return _bootstrap_method; } |
506 void set_bootstrap_method(oop mh) { oop_store(&_bootstrap_method, mh); } |
510 void set_bootstrap_method(oop mh) { oop_store(&_bootstrap_method, mh); } |
507 |
511 |
508 // jmethodID support |
512 // jmethodID support |
509 static jmethodID get_jmethod_id(instanceKlassHandle ik_h, size_t idnum, |
513 static jmethodID get_jmethod_id(instanceKlassHandle ik_h, |
510 jmethodID new_id, jmethodID* new_jmeths); |
514 methodHandle method_h); |
511 static jmethodID jmethod_id_for_impl(instanceKlassHandle ik_h, methodHandle method_h); |
515 static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h, |
|
516 size_t idnum, jmethodID new_id, jmethodID* new_jmeths, |
|
517 jmethodID* to_dealloc_id_p, |
|
518 jmethodID** to_dealloc_jmeths_p); |
|
519 static void get_jmethod_id_length_value(jmethodID* cache, size_t idnum, |
|
520 size_t *length_p, jmethodID* id_p); |
512 jmethodID jmethod_id_or_null(methodOop method); |
521 jmethodID jmethod_id_or_null(methodOop method); |
513 |
522 |
514 // cached itable index support |
523 // cached itable index support |
515 void set_cached_itable_index(size_t idnum, int index); |
524 void set_cached_itable_index(size_t idnum, int index); |
516 int cached_itable_index(size_t idnum); |
525 int cached_itable_index(size_t idnum); |
752 #endif |
761 #endif |
753 void set_rewritten() { _rewritten = true; } |
762 void set_rewritten() { _rewritten = true; } |
754 void set_init_thread(Thread *thread) { _init_thread = thread; } |
763 void set_init_thread(Thread *thread) { _init_thread = thread; } |
755 |
764 |
756 u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
765 u2 idnum_allocated_count() const { return _idnum_allocated_count; } |
|
766 // The RedefineClasses() API can cause new method idnums to be needed |
|
767 // which will cause the caches to grow. Safety requires different |
|
768 // cache management logic if the caches can grow instead of just |
|
769 // going from NULL to non-NULL. |
|
770 bool idnum_can_increment() const { return has_been_redefined(); } |
757 jmethodID* methods_jmethod_ids_acquire() const |
771 jmethodID* methods_jmethod_ids_acquire() const |
758 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } |
772 { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } |
759 void release_set_methods_jmethod_ids(jmethodID* jmeths) |
773 void release_set_methods_jmethod_ids(jmethodID* jmeths) |
760 { OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); } |
774 { OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); } |
761 |
775 |