| // TARGET_BACKEND: JVM | |
| // WITH_STDLIB | |
| // SAM_CONVERSIONS: CLASS | |
| // FILE: MyRunnable.java | |
| public interface MyRunnable { | |
| public void run(); | |
| } | |
| // FILE: Foo.kt | |
| package foo | |
| import MyRunnable | |
| class A { | |
| inline fun doWork(noinline job: () -> Unit) { | |
| Runnable(job).run() | |
| } | |
| fun doNoninlineWork(job: () -> Unit) { | |
| Runnable(job).run() | |
| } | |
| } | |
| class B { | |
| inline fun doWork(noinline job: () -> Unit) { | |
| Runnable(job).run() | |
| } | |
| fun doNonInlineWork(job: () -> Unit) { | |
| MyRunnable(job).run() | |
| } | |
| } | |
| // FILE: test.kt | |
| import foo.A | |
| import foo.B | |
| fun classForName(name: String): Class<*>? = | |
| try { | |
| java.lang.Class.forName(name) | |
| } catch (e: Throwable) { | |
| null | |
| } | |
| fun box(): String { | |
| var result = false | |
| A().doWork { result = true } | |
| if (!result) return "Fail 1" | |
| result = false | |
| A().doNoninlineWork { result = true } | |
| if (!result) return "Fail 2" | |
| result = false | |
| B().doWork { result = true } | |
| if (!result) return "Fail 3" | |
| result = false | |
| B().doNonInlineWork { result = true } | |
| if (!result) return "Fail 4" | |
| val inlineWrapperA = classForName("foo.A\$sam\$i\$java_lang_Runnable$0") | |
| if (inlineWrapperA == null) return "Fail 5: Can't find sam wrapper" | |
| if (inlineWrapperA.modifiers and 1 == 0) return "Fail 6: inline sam wrapper is non-public" | |
| val wrapperA = classForName("foo.A\$sam\$java_lang_Runnable$0") | |
| if (wrapperA == null) return "Fail 7: Can't find sam wrapper" | |
| if (wrapperA.modifiers and 1 != 0) return "Fail 8: non-inline sam wrapper is public" | |
| val inlineWrapperB = classForName("foo.B\$sam\$i\$java_lang_Runnable$0") | |
| if (inlineWrapperB != null) return "Fail 9: sam wrapper not cached" | |
| val wrapperB = classForName("foo.B\$sam\$MyRunnable$0") | |
| if (wrapperB == null) return "Fail 10: Can't find sam wrapper" | |
| if (wrapperB.modifiers and 1 != 0) return "Fail 11: non-inline sam wrapper is public" | |
| return "OK" | |
| } |