diff options
| author | 2017-03-16 16:19:15 -0700 | |
|---|---|---|
| committer | 2017-03-22 14:26:20 -0700 | |
| commit | fb185130f35bbfe2ba1875974ed39ef0b3c7a77f (patch) | |
| tree | 47cab7e151d7de2d86d9499e264273f7262699b9 /test/616-cha-proxy-method-inline/src | |
| parent | a861b0daacd508dacfdac6c337c1128904e5b386 (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')
| -rw-r--r-- | test/616-cha-proxy-method-inline/src/Main.java | 70 |
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); +} |