comparison src/share/vm/oops/klassVtable.cpp @ 2177:3582bf76420e

6990754: Use native memory and reference counting to implement SymbolTable Summary: move symbols from permgen into C heap and reference count them Reviewed-by: never, acorn, jmasa, stefank
author coleenp
date Thu, 27 Jan 2011 16:11:27 -0800
parents 642e54d1850a
children e5383553fd4e
comparison
equal deleted inserted replaced
2176:27e4ea99855d 2177:3582bf76420e
59 int &num_miranda_methods, 59 int &num_miranda_methods,
60 klassOop super, 60 klassOop super,
61 objArrayOop methods, 61 objArrayOop methods,
62 AccessFlags class_flags, 62 AccessFlags class_flags,
63 Handle classloader, 63 Handle classloader,
64 symbolHandle classname, 64 Symbol* classname,
65 objArrayOop local_interfaces, 65 objArrayOop local_interfaces,
66 TRAPS 66 TRAPS
67 ) { 67 ) {
68 68
69 No_Safepoint_Verifier nsv; 69 No_Safepoint_Verifier nsv;
208 // Called for cases where a method does not override its superclass' vtable entry 208 // Called for cases where a method does not override its superclass' vtable entry
209 // For bytecodes not produced by javac together it is possible that a method does not override 209 // For bytecodes not produced by javac together it is possible that a method does not override
210 // the superclass's method, but might indirectly override a super-super class's vtable entry 210 // the superclass's method, but might indirectly override a super-super class's vtable entry
211 // If none found, return a null superk, else return the superk of the method this does override 211 // If none found, return a null superk, else return the superk of the method this does override
212 instanceKlass* klassVtable::find_transitive_override(instanceKlass* initialsuper, methodHandle target_method, 212 instanceKlass* klassVtable::find_transitive_override(instanceKlass* initialsuper, methodHandle target_method,
213 int vtable_index, Handle target_loader, symbolHandle target_classname, Thread * THREAD) { 213 int vtable_index, Handle target_loader, Symbol* target_classname, Thread * THREAD) {
214 instanceKlass* superk = initialsuper; 214 instanceKlass* superk = initialsuper;
215 while (superk != NULL && superk->super() != NULL) { 215 while (superk != NULL && superk->super() != NULL) {
216 instanceKlass* supersuperklass = instanceKlass::cast(superk->super()); 216 instanceKlass* supersuperklass = instanceKlass::cast(superk->super());
217 klassVtable* ssVtable = supersuperklass->vtable(); 217 klassVtable* ssVtable = supersuperklass->vtable();
218 if (vtable_index < ssVtable->length()) { 218 if (vtable_index < ssVtable->length()) {
219 methodOop super_method = ssVtable->method_at(vtable_index); 219 methodOop super_method = ssVtable->method_at(vtable_index);
220 #ifndef PRODUCT 220 #ifndef PRODUCT
221 symbolHandle name(THREAD,target_method()->name()); 221 Symbol* name= target_method()->name();
222 symbolHandle signature(THREAD,target_method()->signature()); 222 Symbol* signature = target_method()->signature();
223 assert(super_method->name() == name() && super_method->signature() == signature(), "vtable entry name/sig mismatch"); 223 assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch");
224 #endif 224 #endif
225 if (supersuperklass->is_override(super_method, target_loader, target_classname, THREAD)) { 225 if (supersuperklass->is_override(super_method, target_loader, target_classname, THREAD)) {
226 #ifndef PRODUCT 226 #ifndef PRODUCT
227 if (PrintVtables && Verbose) { 227 if (PrintVtables && Verbose) {
228 ResourceMark rm(THREAD); 228 ResourceMark rm(THREAD);
292 // search through the vtable and update overridden entries 292 // search through the vtable and update overridden entries
293 // Since check_signature_loaders acquires SystemDictionary_lock 293 // Since check_signature_loaders acquires SystemDictionary_lock
294 // which can block for gc, once we are in this loop, use handles 294 // which can block for gc, once we are in this loop, use handles
295 // For classfiles built with >= jdk7, we now look for transitive overrides 295 // For classfiles built with >= jdk7, we now look for transitive overrides
296 296
297 symbolHandle name(THREAD,target_method()->name()); 297 Symbol* name = target_method()->name();
298 symbolHandle signature(THREAD,target_method()->signature()); 298 Symbol* signature = target_method()->signature();
299 Handle target_loader(THREAD, _klass->class_loader()); 299 Handle target_loader(THREAD, _klass->class_loader());
300 symbolHandle target_classname(THREAD, _klass->name()); 300 Symbol* target_classname = _klass->name();
301 for(int i = 0; i < super_vtable_len; i++) { 301 for(int i = 0; i < super_vtable_len; i++) {
302 methodOop super_method = method_at(i); 302 methodOop super_method = method_at(i);
303 // Check if method name matches 303 // Check if method name matches
304 if (super_method->name() == name() && super_method->signature() == signature()) { 304 if (super_method->name() == name && super_method->signature() == signature) {
305 305
306 // get super_klass for method_holder for the found method 306 // get super_klass for method_holder for the found method
307 instanceKlass* super_klass = instanceKlass::cast(super_method->method_holder()); 307 instanceKlass* super_klass = instanceKlass::cast(super_method->method_holder());
308 308
309 if ((super_klass->is_override(super_method, target_loader, target_classname, THREAD)) || 309 if ((super_klass->is_override(super_method, target_loader, target_classname, THREAD)) ||
404 // However, the vtable entries are filled in at link time, and therefore 404 // However, the vtable entries are filled in at link time, and therefore
405 // the superclass' vtable may not yet have been filled in. 405 // the superclass' vtable may not yet have been filled in.
406 bool klassVtable::needs_new_vtable_entry(methodHandle target_method, 406 bool klassVtable::needs_new_vtable_entry(methodHandle target_method,
407 klassOop super, 407 klassOop super,
408 Handle classloader, 408 Handle classloader,
409 symbolHandle classname, 409 Symbol* classname,
410 AccessFlags class_flags, 410 AccessFlags class_flags,
411 TRAPS) { 411 TRAPS) {
412 if ((class_flags.is_final() || target_method()->is_final()) || 412 if ((class_flags.is_final() || target_method()->is_final()) ||
413 // a final method never needs a new entry; final methods can be statically 413 // a final method never needs a new entry; final methods can be statically
414 // resolved and they have to be present in the vtable only if they override 414 // resolved and they have to be present in the vtable only if they override
434 } 434 }
435 435
436 // search through the super class hierarchy to see if we need 436 // search through the super class hierarchy to see if we need
437 // a new entry 437 // a new entry
438 ResourceMark rm; 438 ResourceMark rm;
439 symbolOop name = target_method()->name(); 439 Symbol* name = target_method()->name();
440 symbolOop signature = target_method()->signature(); 440 Symbol* signature = target_method()->signature();
441 klassOop k = super; 441 klassOop k = super;
442 methodOop super_method = NULL; 442 methodOop super_method = NULL;
443 instanceKlass *holder = NULL; 443 instanceKlass *holder = NULL;
444 methodOop recheck_method = NULL; 444 methodOop recheck_method = NULL;
445 while (k != NULL) { 445 while (k != NULL) {
483 } 483 }
484 484
485 // Support for miranda methods 485 // Support for miranda methods
486 486
487 // get the vtable index of a miranda method with matching "name" and "signature" 487 // get the vtable index of a miranda method with matching "name" and "signature"
488 int klassVtable::index_of_miranda(symbolOop name, symbolOop signature) { 488 int klassVtable::index_of_miranda(Symbol* name, Symbol* signature) {
489 // search from the bottom, might be faster 489 // search from the bottom, might be faster
490 for (int i = (length() - 1); i >= 0; i--) { 490 for (int i = (length() - 1); i >= 0; i--) {
491 methodOop m = table()[i].method(); 491 methodOop m = table()[i].method();
492 if (is_miranda_entry_at(i) && 492 if (is_miranda_entry_at(i) &&
493 m->name() == name && m->signature() == signature) { 493 m->name() == name && m->signature() == signature) {
514 } 514 }
515 515
516 // check if a method is a miranda method, given a class's methods table and it's super 516 // check if a method is a miranda method, given a class's methods table and it's super
517 // the caller must make sure that the method belongs to an interface implemented by the class 517 // the caller must make sure that the method belongs to an interface implemented by the class
518 bool klassVtable::is_miranda(methodOop m, objArrayOop class_methods, klassOop super) { 518 bool klassVtable::is_miranda(methodOop m, objArrayOop class_methods, klassOop super) {
519 symbolOop name = m->name(); 519 Symbol* name = m->name();
520 symbolOop signature = m->signature(); 520 Symbol* signature = m->signature();
521
522 if (instanceKlass::find_method(class_methods, name, signature) == NULL) { 521 if (instanceKlass::find_method(class_methods, name, signature) == NULL) {
523 // did not find it in the method table of the current class 522 // did not find it in the method table of the current class
524 if (super == NULL) { 523 if (super == NULL) {
525 // super doesn't exist 524 // super doesn't exist
526 return true; 525 return true;
927 // m, method_name, method_signature, klass reset each loop so they 926 // m, method_name, method_signature, klass reset each loop so they
928 // don't need preserving across check_signature_loaders call 927 // don't need preserving across check_signature_loaders call
929 // methods needs a handle in case of gc from check_signature_loaders 928 // methods needs a handle in case of gc from check_signature_loaders
930 for(; i < nof_methods; i++) { 929 for(; i < nof_methods; i++) {
931 methodOop m = (methodOop)methods()->obj_at(i); 930 methodOop m = (methodOop)methods()->obj_at(i);
932 symbolOop method_name = m->name(); 931 Symbol* method_name = m->name();
933 symbolOop method_signature = m->signature(); 932 Symbol* method_signature = m->signature();
934 933
935 // This is same code as in Linkresolver::lookup_instance_method_in_klasses 934 // This is same code as in Linkresolver::lookup_instance_method_in_klasses
936 methodOop target = klass->uncached_lookup_method(method_name, method_signature); 935 methodOop target = klass->uncached_lookup_method(method_name, method_signature);
937 while (target != NULL && target->is_static()) { 936 while (target != NULL && target->is_static()) {
938 // continue with recursive lookup through the superclass 937 // continue with recursive lookup through the superclass