summaryrefslogtreecommitdiff
path: root/test/854-image-inlining/src-ex/Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/854-image-inlining/src-ex/Test.java')
-rw-r--r--test/854-image-inlining/src-ex/Test.java43
1 files changed, 43 insertions, 0 deletions
diff --git a/test/854-image-inlining/src-ex/Test.java b/test/854-image-inlining/src-ex/Test.java
new file mode 100644
index 0000000000..6f56a2759d
--- /dev/null
+++ b/test/854-image-inlining/src-ex/Test.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class WithStatic {
+ public static int field = 42;
+}
+
+// `CallStatic` being part of the profile, the compiler used to think it will be in the app image.
+// However, given it implements `Itf` which is from a different dex file from a different class
+// loader, we cannot encode `CallStatic` in the image. We used to find that information too late in
+// the compilation stage and were therefore wrongly assuming we could inline methods from
+// `CallStatic` without the need for resolving it.
+//
+// Note that to trigger the crash, we needed an interface from a different dex file. We were
+// correctly pruning the class if the superclass was from a different dex file.
+class CallStatic implements Itf {
+ public static int $inline$foo() {
+ // Access a static field to make sure we invoke the runtime, which will then walk the call
+ // stack.
+ return WithStatic.field;
+ }
+}
+
+public class Test {
+ public static int callInstance() {
+ // Call a method from `CallStatic` which will be inlined. If the compiler thinks `CallStatic`
+ // will be in the image, it will skip the slow path of resolving it.
+ return CallStatic.$inline$foo();
+ }
+}