# HG changeset patch # User lana # Date 1473973729 0 # Node ID be790ce222ec3a69714e8937e8d0759b73bf5b63 # Parent d4f217b05bcef4f0cbf8cf60fd25dcb12431d441# Parent 869e95ade880aafe0a1cd577fa74b859c4704b9c Merge diff -r d4f217b05bce -r be790ce222ec langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Thu Sep 15 17:15:55 2016 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Thu Sep 15 21:08:49 2016 +0000 @@ -2256,6 +2256,12 @@ types.erasure(owner.enclClass().asType())); } + boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage() { + return ((tree.sym.flags() & PROTECTED) != 0 && + tree.sym.packge() != owner.packge() && + !owner.enclClass().isSubClass(tree.sym.owner, types)); + } + /** * Signature polymorphic methods need special handling. * e.g. MethodHandle.invoke() MethodHandle.invokeExact() @@ -2293,6 +2299,7 @@ needsVarArgsConversion() || isArrayOp() || isPrivateInOtherClass() || + isProtectedInSuperClassOfEnclosingClassInOtherPackage() || !receiverAccessible() || (tree.getMode() == ReferenceMode.NEW && tree.kind != ReferenceKind.ARRAY_CTOR && diff -r d4f217b05bce -r be790ce222ec langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Thu Sep 15 17:15:55 2016 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Thu Sep 15 21:08:49 2016 +0000 @@ -1232,7 +1232,7 @@ Chain exit = switchEnv.info.exit; if (exit != null) { code.resolve(exit); - exit.state.defined.excludeFrom(code.nextreg); + exit.state.defined.excludeFrom(limit); } // If we have not set the default offset, we do so now. diff -r d4f217b05bce -r be790ce222ec langtools/test/tools/javac/SwitchExitStateTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/SwitchExitStateTest.java Thu Sep 15 21:08:49 2016 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8160699 + * @summary Verify that having finished executing a switch statement live locals are exactly the same as it was upon entry of the switch. + * @run main SwitchExitStateTest + */ + +public class SwitchExitStateTest { + public static void main(String[] args) throws Exception { + switch (0) { + case 0: + String a = ""; + break; + default: + throw new Exception("Unknown "); + } + + switch (0) { + case 0: + String b = ""; + break; + default: + throw new Exception("Unknown "); + } + } +} \ No newline at end of file diff -r d4f217b05bce -r be790ce222ec langtools/test/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest.java Thu Sep 15 21:08:49 2016 +0000 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8138667 + * @summary Verify that javac emits suitable accessors when a method reference mentions a protected method that would need an accessor + * @run main ProtectedInaccessibleMethodRefTest + */ + + +import pack.SuperClass; + +import java.util.concurrent.Callable; + +public final class ProtectedInaccessibleMethodRefTest extends SuperClass { + + static String message = "NOT OK"; + + public void doTest() throws Exception { + new Callable() { + @Override + public Void call() throws Exception { + final Runnable r = ProtectedInaccessibleMethodRefTest.this::myDo; + r.run(); + return null; + } + }.call(); + + new Callable() { + @Override + public Void call() throws Exception { + final Runnable r = ProtectedInaccessibleMethodRefTest::myStaticDo; + r.run(); + return null; + } + }.call(); + } + + public void message(String s) { + message = s; + } + + public static void main(String[] args) throws Exception { + new ProtectedInaccessibleMethodRefTest().doTest(); + if (!message.equals("OK!")) + throw new AssertionError("Unexpected output"); + if (!sMessage.equals("OK!")) + throw new AssertionError("Unexpected output"); + } +} diff -r d4f217b05bce -r be790ce222ec langtools/test/tools/javac/lambda/methodReference/pack/SuperClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/methodReference/pack/SuperClass.java Thu Sep 15 21:08:49 2016 +0000 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pack; + +public class SuperClass { + + public static String sMessage = "Not OK"; + + protected final void myDo() { + message("OK!"); + } + + protected static final void myStaticDo() { + sMessage = "OK!"; + } + + public void message(String s) { + } +}