提交 2f30553e 编写于 作者: A amurillo

Merge

...@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013 ...@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25 HS_MAJOR_VER=25
HS_MINOR_VER=0 HS_MINOR_VER=0
HS_BUILD_NUMBER=65 HS_BUILD_NUMBER=66
JDK_MAJOR_VER=1 JDK_MAJOR_VER=1
JDK_MINOR_VER=8 JDK_MINOR_VER=8
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -390,6 +390,20 @@ class MethodFamily : public ResourceObj { ...@@ -390,6 +390,20 @@ class MethodFamily : public ResourceObj {
Symbol* get_exception_message() { return _exception_message; } Symbol* get_exception_message() { return _exception_message; }
Symbol* get_exception_name() { return _exception_name; } 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 // Either sets the target or the exception error message
void determine_target(InstanceKlass* root, TRAPS) { void determine_target(InstanceKlass* root, TRAPS) {
if (has_target() || throws_exception()) { if (has_target() || throws_exception()) {
...@@ -416,19 +430,26 @@ class MethodFamily : public ResourceObj { ...@@ -416,19 +430,26 @@ class MethodFamily : public ResourceObj {
} }
if (num_defaults == 0) { if (num_defaults == 0) {
if (qualified_methods.length() == 0) { // If the root klass has a static method with matching name and signature
_exception_message = generate_no_defaults_message(CHECK); // then do not generate an overpass method because it will hide the
} else { // static method during resolution.
assert(root != NULL, "Null root class"); if (!has_matching_static(root)) {
_exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK); 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 // If only one qualified method is default, select that
} else if (num_defaults == 1) { } else if (num_defaults == 1) {
_selected_target = qualified_methods.at(default_index); _selected_target = qualified_methods.at(default_index);
} else if (num_defaults > 1) {
_exception_message = generate_conflicts_message(&qualified_methods,CHECK); } else if (num_defaults > 1 && !has_matching_static(root)) {
_exception_name = vmSymbols::java_lang_IncompatibleClassChangeError(); _exception_message = generate_conflicts_message(&qualified_methods,CHECK);
_exception_name = vmSymbols::java_lang_IncompatibleClassChangeError();
if (TraceDefaultMethods) { if (TraceDefaultMethods) {
_exception_message->print_value_on(tty); _exception_message->print_value_on(tty);
tty->print_cr(""); tty->print_cr("");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册