hotspot/src/share/vm/classfile/defaultMethods.cpp
changeset 23999 22eb7be3d99d
parent 22493 af3de4cee5e5
child 24424 2658d7834c6e
equal deleted inserted replaced
23998:418ac4fe9834 23999:22eb7be3d99d
   388 
   388 
   389   Method* get_selected_target() { return _selected_target; }
   389   Method* get_selected_target() { return _selected_target; }
   390   Symbol* get_exception_message() { return _exception_message; }
   390   Symbol* get_exception_message() { return _exception_message; }
   391   Symbol* get_exception_name() { return _exception_name; }
   391   Symbol* get_exception_name() { return _exception_name; }
   392 
   392 
   393   // Return true if the specified klass has a static method that matches
       
   394   // the name and signature of the target method.
       
   395   bool has_matching_static(InstanceKlass* root) {
       
   396     if (_members.length() > 0) {
       
   397       Pair<Method*,QualifiedState> entry = _members.at(0);
       
   398       Method* impl = root->find_method(entry.first->name(),
       
   399                                        entry.first->signature());
       
   400       if ((impl != NULL) && impl->is_static()) {
       
   401         return true;
       
   402       }
       
   403     }
       
   404     return false;
       
   405   }
       
   406 
       
   407   // Either sets the target or the exception error message
   393   // Either sets the target or the exception error message
   408   void determine_target(InstanceKlass* root, TRAPS) {
   394   void determine_target(InstanceKlass* root, TRAPS) {
   409     if (has_target() || throws_exception()) {
   395     if (has_target() || throws_exception()) {
   410       return;
   396       return;
   411     }
   397     }
   431 
   417 
   432     if (num_defaults == 0) {
   418     if (num_defaults == 0) {
   433       // If the root klass has a static method with matching name and signature
   419       // If the root klass has a static method with matching name and signature
   434       // then do not generate an overpass method because it will hide the
   420       // then do not generate an overpass method because it will hide the
   435       // static method during resolution.
   421       // static method during resolution.
   436       if (!has_matching_static(root)) {
   422       if (qualified_methods.length() == 0) {
   437         if (qualified_methods.length() == 0) {
   423         _exception_message = generate_no_defaults_message(CHECK);
   438           _exception_message = generate_no_defaults_message(CHECK);
   424       } else {
   439         } else {
   425         assert(root != NULL, "Null root class");
   440           assert(root != NULL, "Null root class");
   426         _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK);
   441           _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK);
   427       }
   442         }
   428       _exception_name = vmSymbols::java_lang_AbstractMethodError();
   443         _exception_name = vmSymbols::java_lang_AbstractMethodError();
       
   444       }
       
   445 
   429 
   446     // If only one qualified method is default, select that
   430     // If only one qualified method is default, select that
   447     } else if (num_defaults == 1) {
   431     } else if (num_defaults == 1) {
   448         _selected_target = qualified_methods.at(default_index);
   432         _selected_target = qualified_methods.at(default_index);
   449 
   433 
   450     } else if (num_defaults > 1 && !has_matching_static(root)) {
   434     } else if (num_defaults > 1) {
   451       _exception_message = generate_conflicts_message(&qualified_methods,CHECK);
   435       _exception_message = generate_conflicts_message(&qualified_methods,CHECK);
   452       _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError();
   436       _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError();
   453       if (TraceDefaultMethods) {
   437       if (TraceDefaultMethods) {
   454         _exception_message->print_value_on(tty);
   438         _exception_message->print_value_on(tty);
   455         tty->print_cr("");
   439         tty->print_cr("");