summaryrefslogtreecommitdiff
path: root/test/616-cha-proxy-method-inline/src/Main.java
diff options
context:
space:
mode:
author Mingyao Yang <mingyao@google.com> 2017-03-16 16:19:15 -0700
committer Mingyao Yang <mingyao@google.com> 2017-03-22 14:26:20 -0700
commitfb185130f35bbfe2ba1875974ed39ef0b3c7a77f (patch)
tree47cab7e151d7de2d86d9499e264273f7262699b9 /test/616-cha-proxy-method-inline/src/Main.java
parenta861b0daacd508dacfdac6c337c1128904e5b386 (diff)
Revert^4 "CHA for interface method."
This reverts commit 43e99be9db10111a2d6e094882cd06c248c69e11. Also fix the issue that tries to change invoke-interface to an invoke-virtual of a cross-dexfile proxy method. Added a testcase. Test: run-libcore-tests.sh --mode=host --variant=X64 --debug Test: ART_TEST_JIT=true m -j20 test-art-host-run-test Change-Id: Iacdf9d7ad93590e8163ed59d5838d70700a69018
Diffstat (limited to 'test/616-cha-proxy-method-inline/src/Main.java')
-rw-r--r--test/616-cha-proxy-method-inline/src/Main.java70
1 files changed, 70 insertions, 0 deletions
diff --git a/test/616-cha-proxy-method-inline/src/Main.java b/test/616-cha-proxy-method-inline/src/Main.java
new file mode 100644
index 0000000000..be7bc820b3
--- /dev/null
+++ b/test/616-cha-proxy-method-inline/src/Main.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
+class DebugProxy implements java.lang.reflect.InvocationHandler {
+ private Object obj;
+ static Class<?>[] interfaces = {Foo.class};
+
+ public static Object newInstance(Object obj) {
+ return java.lang.reflect.Proxy.newProxyInstance(
+ Foo.class.getClassLoader(),
+ interfaces,
+ new DebugProxy(obj));
+ }
+
+ private DebugProxy(Object obj) {
+ this.obj = obj;
+ }
+
+ public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
+ Object result;
+ if (obj == null) {
+ return null;
+ }
+ try {
+ System.out.println("before invoking method " + m.getName());
+ result = m.invoke(obj, args);
+ } catch (InvocationTargetException e) {
+ throw e.getTargetException();
+ } catch (Exception e) {
+ throw new RuntimeException("unexpected invocation exception: " + e.getMessage());
+ } finally {
+ System.out.println("after invoking method " + m.getName());
+ }
+ return result;
+ }
+}
+
+public class Main {
+ public static void call(Foo foo) {
+ if (foo == null) {
+ return;
+ }
+ foo.bar(null);
+ }
+
+ public static void main(String[] args) {
+ System.loadLibrary(args[0]);
+ Foo foo = (Foo)DebugProxy.newInstance(null);
+ ensureJitCompiled(Main.class, "call");
+ call(foo);
+ }
+
+ private static native void ensureJitCompiled(Class<?> itf, String method_name);
+}