390 if (has_target() || throws_exception()) { |
390 if (has_target() || throws_exception()) { |
391 return; |
391 return; |
392 } |
392 } |
393 |
393 |
394 GrowableArray<Method*> qualified_methods; |
394 GrowableArray<Method*> qualified_methods; |
|
395 int num_defaults = 0; |
|
396 int default_index = -1; |
395 for (int i = 0; i < _members.length(); ++i) { |
397 for (int i = 0; i < _members.length(); ++i) { |
396 Pair<Method*,QualifiedState> entry = _members.at(i); |
398 Pair<Method*,QualifiedState> entry = _members.at(i); |
397 if (entry.second == QUALIFIED) { |
399 if (entry.second == QUALIFIED) { |
398 qualified_methods.append(entry.first); |
400 qualified_methods.append(entry.first); |
|
401 default_index++; |
|
402 if (entry.first->is_default_method()) { |
|
403 num_defaults++; |
|
404 } |
399 } |
405 } |
400 } |
406 } |
401 |
407 |
402 if (qualified_methods.length() == 0) { |
408 if (qualified_methods.length() == 0) { |
403 _exception_message = generate_no_defaults_message(CHECK); |
409 _exception_message = generate_no_defaults_message(CHECK); |
406 // leave abstract methods alone, they will be found via normal search path |
412 // leave abstract methods alone, they will be found via normal search path |
407 Method* method = qualified_methods.at(0); |
413 Method* method = qualified_methods.at(0); |
408 if (!method->is_abstract()) { |
414 if (!method->is_abstract()) { |
409 _selected_target = qualified_methods.at(0); |
415 _selected_target = qualified_methods.at(0); |
410 } |
416 } |
|
417 // If only one qualified method is default, select that |
|
418 } else if (num_defaults == 1) { |
|
419 _selected_target = qualified_methods.at(default_index); |
411 } else { |
420 } else { |
412 _exception_message = generate_conflicts_message(&qualified_methods,CHECK); |
421 _exception_message = generate_conflicts_message(&qualified_methods,CHECK); |
413 _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError(); |
422 _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError(); |
414 if (TraceDefaultMethods) { |
423 if (TraceDefaultMethods) { |
415 _exception_message->print_value_on(tty); |
424 _exception_message->print_value_on(tty); |