8048121: javac complex method references: revamp and simplify
8038776: VerifyError when running successfully compiled java class Add tests missing from the push of 8037404 Reviewed-by: dlsmith, vromero
This commit is contained in:
parent
7aa3c59051
commit
30f70a0e1d
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8044748
|
||||
* @summary JVM cannot access constructor though ::new reference although can call it directly
|
||||
*/
|
||||
|
||||
public class MethodRefNewInnerBootstrap {
|
||||
|
||||
interface Constructor {
|
||||
public MyTest execute(int i);
|
||||
}
|
||||
|
||||
public class MyTest {
|
||||
public MyTest(int i) { System.out.println("Constructor executed " + i); }
|
||||
}
|
||||
|
||||
public Constructor getConstructor() {
|
||||
return MyTest::new;
|
||||
}
|
||||
|
||||
public static void main(String argv[]) {
|
||||
new MethodRefNewInnerBootstrap().call();
|
||||
}
|
||||
|
||||
public void call() {
|
||||
MyTest mt = new MyTest(0);
|
||||
|
||||
Constructor c1 = MyTest::new;
|
||||
c1.execute(1);
|
||||
|
||||
Constructor c2 = getConstructor();
|
||||
c2.execute(2);
|
||||
|
||||
Constructor c3 = new Constructor() {
|
||||
public MyTest execute(int i) {
|
||||
return new MyTest(3);
|
||||
}
|
||||
};
|
||||
c3.execute(3);
|
||||
|
||||
Constructor c4 = new Constructor() {
|
||||
public MyTest execute(int i) {
|
||||
Constructor c = MyTest::new;
|
||||
return c.execute(i);
|
||||
}
|
||||
};
|
||||
c4.execute(4);
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8037404
|
||||
* @summary javac NPE or VerifyError for code with constructor reference of inner class
|
||||
*/
|
||||
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class MethodRefNewInnerInLambdaNPE1 {
|
||||
public static void main(String[] args) {
|
||||
if (new MethodRefNewInnerInLambdaNPE1().getList().get().getClass() != TT.class)
|
||||
throw new AssertionError("sanity failed");
|
||||
}
|
||||
|
||||
Supplier<TT> getList() {
|
||||
return () -> Stream.of(1).map(TT::new).findFirst().get();
|
||||
}
|
||||
|
||||
class TT {
|
||||
public TT(int i) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8044737
|
||||
* @summary Lambda: NPE while obtaining method reference through lambda expression
|
||||
* @compile MethodRefNewInnerInLambdaNPE2.java
|
||||
*/
|
||||
|
||||
public class MethodRefNewInnerInLambdaNPE2 {
|
||||
|
||||
interface Constructor {
|
||||
MyTest execute();
|
||||
}
|
||||
|
||||
class MyTest {
|
||||
MyTest() { System.out.println("Constructor executed"); }
|
||||
}
|
||||
|
||||
public Constructor getConstructor() {
|
||||
return getConstructor(() -> { return MyTest::new; });
|
||||
}
|
||||
|
||||
public static void main(String argv[]) {
|
||||
MethodRefNewInnerInLambdaNPE2 t = new MethodRefNewInnerInLambdaNPE2();
|
||||
MyTest mytest = t.getConstructor().execute();
|
||||
}
|
||||
|
||||
Constructor getConstructor(Wrapper arg) {
|
||||
return arg.unwrap();
|
||||
}
|
||||
|
||||
interface Wrapper {
|
||||
Constructor unwrap();
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8037404
|
||||
* @summary javac NPE or VerifyError for code with constructor reference of inner class
|
||||
*/
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class MethodRefNewInnerInLambdaVerify1 {
|
||||
public static void main(String[] args) {
|
||||
if (new MethodRefNewInnerInLambdaVerify1().map().apply(1).getClass() != TT.class)
|
||||
throw new AssertionError("sanity failed");
|
||||
}
|
||||
|
||||
Function<Integer,TT> map() {
|
||||
return (i) -> Stream.of(i).map(TT::new).findFirst().get();
|
||||
}
|
||||
|
||||
class TT {
|
||||
public TT(int i) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8038776
|
||||
* @summary VerifyError when running successfully compiled java class
|
||||
*/
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Derived from code by:
|
||||
* @author Yawkat
|
||||
*/
|
||||
public class MethodRefNewInnerInLambdaVerify2 {
|
||||
public static void main(String[] args) { new MethodRefNewInnerInLambdaVerify2().runTest(); }
|
||||
|
||||
private void runTest() {
|
||||
Worker worker = new Worker();
|
||||
run(() -> worker.check(field -> new SomeClass(field)));
|
||||
run(() -> worker.check(SomeClass::new));
|
||||
}
|
||||
|
||||
private void run(Runnable runnable) {
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
private class SomeClass {
|
||||
final Object field;
|
||||
|
||||
SomeClass(Object field) {
|
||||
this.field = field;
|
||||
}
|
||||
}
|
||||
|
||||
private static class Worker {
|
||||
void check(Function<Object, SomeClass> i) {
|
||||
if (!i.apply("frank").field.equals("frank")) throw new AssertionError("sanity failed");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8038776
|
||||
* @summary VerifyError when running successfully compiled java class
|
||||
*/
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Derived from code by:
|
||||
* @author Yawkat
|
||||
*/
|
||||
public class MethodRefNewInnerInLambdaVerify2simple {
|
||||
public static void main(String[] args) { new MethodRefNewInnerInLambdaVerify2simple().runTest(); }
|
||||
|
||||
private void runTest() {
|
||||
Runnable r = (() -> { Sup w = SomeClass::new; } );
|
||||
}
|
||||
|
||||
private class SomeClass {
|
||||
SomeClass() { }
|
||||
}
|
||||
}
|
||||
|
||||
interface Sup {
|
||||
Object get();
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8048121
|
||||
* @summary javac complex method references: revamp and simplify
|
||||
*/
|
||||
|
||||
public class MethodRefQualifier1 {
|
||||
|
||||
interface SAM {
|
||||
void m();
|
||||
}
|
||||
|
||||
static int count = 0;
|
||||
|
||||
static void assertTrue(boolean cond, String msg) {
|
||||
if (!cond)
|
||||
throw new AssertionError(msg);
|
||||
}
|
||||
|
||||
MethodRefQualifier1 check() {
|
||||
count++;
|
||||
return this;
|
||||
}
|
||||
|
||||
void ido(Object... args) { }
|
||||
|
||||
public static void main(String[] args) {
|
||||
new MethodRefQualifier1().test();
|
||||
}
|
||||
|
||||
void test() {
|
||||
count = 0;
|
||||
SAM s = check()::ido;
|
||||
assertTrue(count == 1, "creation: unexpected: " + count);
|
||||
count = 0;
|
||||
s.m();
|
||||
assertTrue(count == 0, "evaluation: unexpected: " + count);
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8048121
|
||||
* @summary javac complex method references: revamp and simplify
|
||||
*
|
||||
* Make sure that the method reference receiver is evaluated exactly once
|
||||
* even in this bridging case.
|
||||
*/
|
||||
|
||||
public class MethodRefSingleRefEvalBridge {
|
||||
|
||||
interface SAM {
|
||||
int m();
|
||||
}
|
||||
|
||||
class ZZ {
|
||||
// private to force bridging
|
||||
private int four() { return 4; }
|
||||
}
|
||||
|
||||
static int count = 0;
|
||||
ZZ azz = new ZZ();
|
||||
|
||||
static void assertEqual(int expected, int got) {
|
||||
if (got != expected)
|
||||
throw new AssertionError("Expected " + expected + " got " + got);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
new MethodRefSingleRefEvalBridge().test();
|
||||
}
|
||||
|
||||
ZZ check() {
|
||||
count++;
|
||||
return azz;
|
||||
}
|
||||
|
||||
void test() {
|
||||
count = 0;
|
||||
SAM s = check()::four;
|
||||
assertEqual(1, count);
|
||||
|
||||
count = 0;
|
||||
assertEqual(4, s.m());
|
||||
assertEqual(0, count);
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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 8047341
|
||||
* @summary lambda reference to inner class in base class causes LambdaConversionException
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
class MethodRefToInnerBase {
|
||||
class TestString {
|
||||
String str;
|
||||
TestString(String strin) {
|
||||
str = strin;
|
||||
}
|
||||
}
|
||||
}
|
||||
public class MethodRefToInner extends MethodRefToInnerBase {
|
||||
public static void main(String[] args) {
|
||||
new MethodRefToInner().run();
|
||||
}
|
||||
MethodRefToInner() {
|
||||
super();
|
||||
}
|
||||
void run() {
|
||||
List<String> list = new ArrayList<>();
|
||||
list.stream().forEach(TestString::new);
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 8048121
|
||||
* @summary javac complex method references: revamp and simplify
|
||||
*
|
||||
* Make sure NPE check is done even in the convert to Lambda case
|
||||
*/
|
||||
|
||||
public class MethodReferenceComplexNullCheckTest {
|
||||
public static void main(String[] args) {
|
||||
F fr = null;
|
||||
boolean npeFired = false;
|
||||
try {
|
||||
IForm frf = fr::doit;
|
||||
} catch (NullPointerException npe) {
|
||||
npeFired = true;
|
||||
} finally {
|
||||
if (!npeFired) throw new AssertionError( "NPE should have been thrown");
|
||||
}
|
||||
}
|
||||
|
||||
interface IForm {
|
||||
void xyz(Object... args);
|
||||
}
|
||||
|
||||
class F {
|
||||
private void doit(Object... args) { }
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user