Mercurial > hg > truffle
comparison src/share/vm/classfile/defaultMethods.cpp @ 17464:5832cdaf89c6
8027804: JCK resolveMethod test fails expecting AbstractMethodError
Summary: Create AME overpass methods and fix method search logic
Reviewed-by: kamg, acorn, lfoltan, coleenp
author | hseigel |
---|---|
date | Mon, 16 Dec 2013 08:24:33 -0500 |
parents | 379f11bc04fc |
children | e9b6b2aa5125 |
comparison
equal
deleted
inserted
replaced
17452:7469c9ca967a | 17464:5832cdaf89c6 |
---|---|
347 guarantee(index != NULL && *index >= 0 && *index < _members.length(), "bad index"); | 347 guarantee(index != NULL && *index >= 0 && *index < _members.length(), "bad index"); |
348 _members.at(*index).second = DISQUALIFIED; | 348 _members.at(*index).second = DISQUALIFIED; |
349 } | 349 } |
350 | 350 |
351 Symbol* generate_no_defaults_message(TRAPS) const; | 351 Symbol* generate_no_defaults_message(TRAPS) const; |
352 Symbol* generate_method_message(Symbol *klass_name, Method* method, TRAPS) const; | |
352 Symbol* generate_conflicts_message(GrowableArray<Method*>* methods, TRAPS) const; | 353 Symbol* generate_conflicts_message(GrowableArray<Method*>* methods, TRAPS) const; |
353 | 354 |
354 public: | 355 public: |
355 | 356 |
356 MethodFamily() | 357 MethodFamily() |
412 | 413 |
413 } | 414 } |
414 } | 415 } |
415 } | 416 } |
416 | 417 |
417 if (qualified_methods.length() == 0) { | 418 if (num_defaults == 0) { |
418 _exception_message = generate_no_defaults_message(CHECK); | 419 if (qualified_methods.length() == 0) { |
420 _exception_message = generate_no_defaults_message(CHECK); | |
421 } else { | |
422 assert(root != NULL, "Null root class"); | |
423 _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK); | |
424 } | |
419 _exception_name = vmSymbols::java_lang_AbstractMethodError(); | 425 _exception_name = vmSymbols::java_lang_AbstractMethodError(); |
420 // If only one qualified method is default, select that | 426 // If only one qualified method is default, select that |
421 } else if (num_defaults == 1) { | 427 } else if (num_defaults == 1) { |
422 _selected_target = qualified_methods.at(default_index); | 428 _selected_target = qualified_methods.at(default_index); |
423 } else if (num_defaults > 1) { | 429 } else if (num_defaults > 1) { |
424 _exception_message = generate_conflicts_message(&qualified_methods,CHECK); | 430 _exception_message = generate_conflicts_message(&qualified_methods,CHECK); |
425 _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError(); | 431 _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError(); |
426 if (TraceDefaultMethods) { | 432 if (TraceDefaultMethods) { |
427 _exception_message->print_value_on(tty); | 433 _exception_message->print_value_on(tty); |
428 tty->print_cr(""); | 434 tty->print_cr(""); |
429 } | 435 } |
430 } | 436 } |
431 // leave abstract methods alone, they will be found via normal search path | |
432 } | 437 } |
433 | 438 |
434 bool contains_signature(Symbol* query) { | 439 bool contains_signature(Symbol* query) { |
435 for (int i = 0; i < _members.length(); ++i) { | 440 for (int i = 0; i < _members.length(); ++i) { |
436 if (query == _members.at(i).first->signature()) { | 441 if (query == _members.at(i).first->signature()) { |
482 #endif // ndef PRODUCT | 487 #endif // ndef PRODUCT |
483 }; | 488 }; |
484 | 489 |
485 Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const { | 490 Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const { |
486 return SymbolTable::new_symbol("No qualifying defaults found", CHECK_NULL); | 491 return SymbolTable::new_symbol("No qualifying defaults found", CHECK_NULL); |
492 } | |
493 | |
494 Symbol* MethodFamily::generate_method_message(Symbol *klass_name, Method* method, TRAPS) const { | |
495 stringStream ss; | |
496 ss.print("Method "); | |
497 Symbol* name = method->name(); | |
498 Symbol* signature = method->signature(); | |
499 ss.write((const char*)klass_name->bytes(), klass_name->utf8_length()); | |
500 ss.print("."); | |
501 ss.write((const char*)name->bytes(), name->utf8_length()); | |
502 ss.write((const char*)signature->bytes(), signature->utf8_length()); | |
503 ss.print(" is abstract"); | |
504 return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL); | |
487 } | 505 } |
488 | 506 |
489 Symbol* MethodFamily::generate_conflicts_message(GrowableArray<Method*>* methods, TRAPS) const { | 507 Symbol* MethodFamily::generate_conflicts_message(GrowableArray<Method*>* methods, TRAPS) const { |
490 stringStream ss; | 508 stringStream ss; |
491 ss.print("Conflicting default methods:"); | 509 ss.print("Conflicting default methods:"); |