int instanceMirrorKlass::instance_size(KlassHandle k) { if (k() != NULL && k->oop_is_instance()) { return align_object_size(size_helper() + instanceKlass::cast(k())->static_field_size()); } return size_helper(); }
int klassVtable::initialize_from_super(KlassHandle super) { if (super.is_null()) { return 0; } else { // copy methods from superKlass // can't inherit from array class, so must be instanceKlass assert(super->oop_is_instance(), "must be instance klass"); instanceKlass* sk = (instanceKlass*)super()->klass_part(); klassVtable* superVtable = sk->vtable(); assert(superVtable->length() <= _length, "vtable too short"); #ifdef ASSERT superVtable->verify(tty, true); #endif superVtable->copy_vtable_to(table()); #ifndef PRODUCT if (PrintVtables && Verbose) { tty->print_cr("copy vtable from %s to %s size %d", sk->internal_name(), klass()->internal_name(), _length); } #endif return superVtable->length(); } }
void CHA::process_class(KlassHandle r, GrowableArray<KlassHandle>* receivers, GrowableArray<methodHandle>* methods, symbolHandle name, symbolHandle signature) { // recursively add non-abstract subclasses of r to receivers list assert(!r->is_interface(), "should call process_interface instead"); for (Klass* s = r->subklass(); s != NULL && !methods->is_full(); s = s->next_sibling()) { // preorder traversal, so check subclasses first if (s->is_interface()) { // can only happen if r == Object assert(r->superklass() == NULL, "must be klass Object"); } else { process_class(s, receivers, methods, name, signature); } } // now check r itself (after subclasses because of preorder) if (!methods->is_full()) { // don't add abstract classes to receivers list // (but still consider their methods -- they may be non-abstract) if (!receivers->is_full() && !r->is_abstract()) receivers->push(r); methodOop m = NULL; if (r->oop_is_instance()) m = instanceKlass::cast(r())->find_method(name(), signature()); if (m != NULL && !m->is_abstract()) { if (!methods->contains(m)) methods->push(m); } } }