aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramurillo <none@none>2014-01-13 15:52:53 -0800
committeramurillo <none@none>2014-01-13 15:52:53 -0800
commit74cbba564a1ee35298de9763c5bf9078c11181d5 (patch)
treefa86565e68a2845ade44305e31add88ad738de4e
parent01fe4775a7393980c68a84bb5838fd4f24dc3940 (diff)
parenta9f5ec49d73e38a532298281c6fce5db3c812fb7 (diff)
-rw-r--r--make/hotspot_version2
-rw-r--r--src/share/vm/classfile/defaultMethods.cpp41
2 files changed, 32 insertions, 11 deletions
diff --git a/make/hotspot_version b/make/hotspot_version
index 8903d69ab..20df419b1 100644
--- a/make/hotspot_version
+++ b/make/hotspot_version
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25
HS_MINOR_VER=0
-HS_BUILD_NUMBER=65
+HS_BUILD_NUMBER=66
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
diff --git a/src/share/vm/classfile/defaultMethods.cpp b/src/share/vm/classfile/defaultMethods.cpp
index 0ebeecc62..72020ba78 100644
--- a/src/share/vm/classfile/defaultMethods.cpp
+++ b/src/share/vm/classfile/defaultMethods.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -390,6 +390,20 @@ class MethodFamily : public ResourceObj {
Symbol* get_exception_message() { return _exception_message; }
Symbol* get_exception_name() { return _exception_name; }
+ // Return true if the specified klass has a static method that matches
+ // the name and signature of the target method.
+ bool has_matching_static(InstanceKlass* root) {
+ if (_members.length() > 0) {
+ Pair<Method*,QualifiedState> entry = _members.at(0);
+ Method* impl = root->find_method(entry.first->name(),
+ entry.first->signature());
+ if ((impl != NULL) && impl->is_static()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
// Either sets the target or the exception error message
void determine_target(InstanceKlass* root, TRAPS) {
if (has_target() || throws_exception()) {
@@ -416,19 +430,26 @@ class MethodFamily : public ResourceObj {
}
if (num_defaults == 0) {
- if (qualified_methods.length() == 0) {
- _exception_message = generate_no_defaults_message(CHECK);
- } else {
- assert(root != NULL, "Null root class");
- _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK);
+ // If the root klass has a static method with matching name and signature
+ // then do not generate an overpass method because it will hide the
+ // static method during resolution.
+ if (!has_matching_static(root)) {
+ if (qualified_methods.length() == 0) {
+ _exception_message = generate_no_defaults_message(CHECK);
+ } else {
+ assert(root != NULL, "Null root class");
+ _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK);
+ }
+ _exception_name = vmSymbols::java_lang_AbstractMethodError();
}
- _exception_name = vmSymbols::java_lang_AbstractMethodError();
+
// If only one qualified method is default, select that
} else if (num_defaults == 1) {
_selected_target = qualified_methods.at(default_index);
- } else if (num_defaults > 1) {
- _exception_message = generate_conflicts_message(&qualified_methods,CHECK);
- _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError();
+
+ } else if (num_defaults > 1 && !has_matching_static(root)) {
+ _exception_message = generate_conflicts_message(&qualified_methods,CHECK);
+ _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError();
if (TraceDefaultMethods) {
_exception_message->print_value_on(tty);
tty->print_cr("");