summaryrefslogtreecommitdiff
path: root/test/files/run/noInlineUnknownIndy
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-07-08 12:40:39 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-07-08 12:40:39 +0200
commit0e98c59aa180053a2684150bb9234bef4685d0be (patch)
treeb90c677c3ec148b251010c5adeb954eadfcdca34 /test/files/run/noInlineUnknownIndy
parentd1f2084563288e9198e7c00f8a4d078802f53eaf (diff)
downloadscala-0e98c59aa180053a2684150bb9234bef4685d0be.tar.gz
scala-0e98c59aa180053a2684150bb9234bef4685d0be.tar.bz2
scala-0e98c59aa180053a2684150bb9234bef4685d0be.zip
Test warnings when an indy cannot be inlined
There are two cases tested here - An indyLMF where the lambda body method is private - An indy where the bootstrap method is not LMF
Diffstat (limited to 'test/files/run/noInlineUnknownIndy')
-rw-r--r--test/files/run/noInlineUnknownIndy/A_1.java9
-rw-r--r--test/files/run/noInlineUnknownIndy/Test.scala28
2 files changed, 37 insertions, 0 deletions
diff --git a/test/files/run/noInlineUnknownIndy/A_1.java b/test/files/run/noInlineUnknownIndy/A_1.java
new file mode 100644
index 0000000000..a9144a9fa6
--- /dev/null
+++ b/test/files/run/noInlineUnknownIndy/A_1.java
@@ -0,0 +1,9 @@
+public class A_1 {
+ interface Fun {
+ String m(String s);
+ }
+ public static final String test() {
+ Fun f = s -> s.trim();
+ return f.m(" eh ");
+ }
+}
diff --git a/test/files/run/noInlineUnknownIndy/Test.scala b/test/files/run/noInlineUnknownIndy/Test.scala
new file mode 100644
index 0000000000..16d8126543
--- /dev/null
+++ b/test/files/run/noInlineUnknownIndy/Test.scala
@@ -0,0 +1,28 @@
+import java.io.File
+
+import scala.collection.convert.decorateAsScala._
+import scala.tools.asm.tree.{ClassNode, InvokeDynamicInsnNode}
+import scala.tools.asm.{Handle, Opcodes}
+import scala.tools.partest.BytecodeTest.modifyClassFile
+import scala.tools.partest._
+
+object Test extends DirectTest {
+ def code = ???
+
+ def compileCode(code: String) = {
+ val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+ compileString(newCompiler("-cp", classpath, "-d", testOutput.path, "-Yopt:l:classpath", "-Yopt-inline-heuristics:everything", "-Yopt-warnings:_"))(code)
+ }
+
+ def show(): Unit = {
+ val unknownBootstrapMethod = new Handle(Opcodes.H_INVOKESTATIC, "not/java/lang/SomeLambdaMetafactory", "notAMetaFactoryMethod", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;")
+ modifyClassFile(new File(testOutput.toFile, "A_1.class"))((cn: ClassNode) => {
+ val testMethod = cn.methods.iterator.asScala.find(_.name == "test").head
+ val indy = testMethod.instructions.iterator.asScala.collect({ case i: InvokeDynamicInsnNode => i }).next()
+ indy.bsm = unknownBootstrapMethod
+ cn
+ })
+
+ compileCode("class T { def foo = A_1.test }")
+ }
+}