1466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers/*
20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2011 The Android Open Source Project
3466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers *
4466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
5466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * you may not use this file except in compliance with the License.
6466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * You may obtain a copy of the License at
7466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers *
8466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
9466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers *
10466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * Unless required by applicable law or agreed to in writing, software
11466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
12466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * See the License for the specific language governing permissions and
14466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers * limitations under the License.
15466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers */
16466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogersimport java.lang.reflect.*;
17466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
18466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogerspublic class ReturnsAndArgPassing {
19466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
20466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  public static final String testName = "ReturnsAndArgPassing";
21466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
22466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  static void check(boolean x) {
23466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    if (!x) {
24466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      throw new AssertionError(testName + " Check failed");
25466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    }
26466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  }
27466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
28466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  interface MyInterface {
29466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    void voidFoo();
30466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    void voidBar();
31466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    boolean booleanFoo();
32466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    boolean booleanBar();
33466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    byte byteFoo();
34466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    byte byteBar();
35466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    char charFoo();
36466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    char charBar();
37466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    short shortFoo();
38466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    short shortBar();
39466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    int intFoo();
40466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    int intBar();
41466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    long longFoo();
42466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    long longBar();
43466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    float floatFoo();
44466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    float floatBar();
45466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    double doubleFoo();
46466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    double doubleBar();
47466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    Object selectArg(int select, int a, long b, float c, double d, Object x);
48466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  }
49466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
50466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  static int fooInvocations = 0;
51466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  static int barInvocations = 0;
52466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
53466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  static class MyInvocationHandler implements InvocationHandler {
5462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    boolean causeNpeOnReturn = false;
5562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    Class<?> returnType = null;
56466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    public Object invoke(Object proxy, Method method, Object[] args) {
57466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      check(proxy instanceof Proxy);
58466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      check(method.getDeclaringClass() == MyInterface.class);
59466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      String name = method.getName();
60466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      if (name.endsWith("Foo")) {
61466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        check(args == null);
62466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        fooInvocations++;
63466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      } else if (name.endsWith("Bar")) {
64466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        check(args == null);
65466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        barInvocations++;
66466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      }
6762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      if (causeNpeOnReturn) {
6862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        return null;
6962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      } else if (name.equals("voidFoo") || name.equals("voidBar")) {
7062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        return null;
7162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      } else if (name.equals("booleanFoo")) {
7262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        return true;
7362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      } else if (name.equals("booleanBar")) {
7462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        return false;
7562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      } else if (name.equals("selectArg")) {
76466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        check(args.length == 6);
77466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        int select = (Integer)args[0];
78466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        return args[select];
79466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      } else {
8062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        try {
8162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers          if (name.endsWith("Foo")) {
8262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers            return returnType.getField("MAX_VALUE").get(null);
8362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers          } else {
8462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers            check(name.endsWith("Bar"));
8562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers            return returnType.getField("MIN_VALUE").get(null);
8662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers          }
8762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        } catch (Exception e) {
8862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers          throw new Error("return type = " + returnType, e);
8962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        }
90466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers      }
91466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    }
92466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  }
93466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
94466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  static void testProxyReturns() {
95466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    System.out.println(testName + ".testProxyReturns RUNNING");
96466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    MyInvocationHandler myHandler = new MyInvocationHandler();
97466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    MyInterface proxyMyInterface =
98466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        (MyInterface)Proxy.newProxyInstance(ReturnsAndArgPassing.class.getClassLoader(),
99466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers                                            new Class[] { MyInterface.class },
100466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers                                            myHandler);
101466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 0);
102466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    proxyMyInterface.voidFoo();
103466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 1);
104466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
105466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 0);
106466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    proxyMyInterface.voidBar();
107466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 1);
108466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
109466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 1);
11062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Boolean.class;
111466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.booleanFoo() == true);
112466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 2);
113466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
114466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 1);
115466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.booleanBar() == false);
116466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 2);
117466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
118466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 2);
11962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Byte.class;
120466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.byteFoo() == Byte.MAX_VALUE);
121466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 3);
122466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
123466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 2);
124466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.byteBar() == Byte.MIN_VALUE);
125466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 3);
126466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
127466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 3);
12862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Character.class;
129466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.charFoo() == Character.MAX_VALUE);
130466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 4);
131466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
132466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 3);
133466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.charBar() == Character.MIN_VALUE);
134466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 4);
135466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
136466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 4);
13762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Short.class;
138466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.shortFoo() == Short.MAX_VALUE);
139466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 5);
140466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
141466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 4);
142466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.shortBar() == Short.MIN_VALUE);
143466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 5);
144466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
145466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 5);
14662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Integer.class;
147466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.intFoo() == Integer.MAX_VALUE);
148466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 6);
149466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
150466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 5);
151466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.intBar() == Integer.MIN_VALUE);
152466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 6);
153466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
154466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 6);
15562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Long.class;
156466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.longFoo() == Long.MAX_VALUE);
157466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 7);
158466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
159466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 6);
160466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.longBar() == Long.MIN_VALUE);
161466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 7);
162466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
163466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 7);
16462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Float.class;
165466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.floatFoo() == Float.MAX_VALUE);
166466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 8);
167466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
168466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 7);
169466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.floatBar() == Float.MIN_VALUE);
170466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 8);
171466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
172466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 8);
17362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Double.class;
174466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.doubleFoo() == Double.MAX_VALUE);
175466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(fooInvocations == 9);
176466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
177466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 8);
178466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.doubleBar() == Double.MIN_VALUE);
179466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(barInvocations == 9);
180466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
18162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    // Toggle flag to get return values to cause NPEs
18262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.causeNpeOnReturn = true;
18362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
18462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 9);
18562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
18662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.booleanFoo();
18762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
18862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
18962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
19062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 10);
19162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
19262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 9);
19362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
19462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.booleanBar();
19562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
19662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
19762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
19862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 10);
19962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
20062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 10);
20162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
20262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
20362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
20462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
20562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
20662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 11);
20762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
20862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 10);
20962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
21062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
21162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
21262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
21362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
21462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 11);
21562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
21662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 11);
21762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
21862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.charFoo();
21962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
22062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
22162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
22262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 12);
22362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
22462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 11);
22562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
22662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.charBar();
22762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
22862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
22962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
23062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 12);
23162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
23262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 12);
23362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
23462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.shortFoo();
23562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
23662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
23762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
23862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 13);
23962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
24062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 12);
24162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
24262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.shortBar();
24362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
24462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
24562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
24662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 13);
24762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
24862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 13);
24962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
25062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.intFoo();
25162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
25262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
25362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
25462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 14);
25562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
25662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 13);
25762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
25862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.intBar();
25962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
26062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
26162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
26262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 14);
26362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
26462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 14);
26562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
26662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.longFoo();
26762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
26862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
26962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
27062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 15);
27162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
27262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 14);
27362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
27462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.longBar();
27562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
27662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
27762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
27862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 15);
27962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
28062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 15);
28162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
28262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.floatFoo();
28362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
28462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
28562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
28662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 16);
28762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
28862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 15);
28962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
29062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.floatBar();
29162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
29262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
29362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
29462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 16);
29562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
29662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 16);
29762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
29862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.doubleFoo();
29962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
30062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
30162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
30262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 17);
30362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
30462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 16);
30562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
30662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.doubleBar();
30762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
30862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (NullPointerException e) {
30962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
31062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 17);
31162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
31262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    // Toggle flag to stop NPEs
31362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.causeNpeOnReturn = false;
31462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
31562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 17);
31662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Double.class;  // Double -> byte == fail
31762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
31862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
31962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
32062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
32162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
32262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 18);
32362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
32462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 17);
32562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
32662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
32762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
32862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
32962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
33062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 18);
33162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
33262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 18);
33362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Float.class;  // Float -> byte == fail
33462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
33562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
33662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
33762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
33862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
33962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 19);
34062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
34162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 18);
34262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
34362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
34462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
34562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
34662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
34762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 19);
34862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
34962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 19);
35062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Long.class;  // Long -> byte == fail
35162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
35262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
35362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
35462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
35562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
35662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 20);
35762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
35862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 19);
35962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
36062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
36162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
36262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
36362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
36462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 20);
36562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
36662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 20);
36762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Integer.class;  // Int -> byte == fail
36862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
36962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
37062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
37162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
37262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
37362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 21);
37462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
37562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 20);
37662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
37762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
37862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
37962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
38062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
38162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 21);
38262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
38362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 21);
38462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Short.class;  // Short -> byte == fail
38562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
38662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
38762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
38862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
38962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
39062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 22);
39162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
39262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 21);
39362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
39462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
39562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
39662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
39762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
39862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 22);
39962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
40062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 22);
40162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Character.class;  // Char -> byte == fail
40262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
40362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteFoo();
40462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
40562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
40662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
40762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 23);
40862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
40962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 22);
41062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
41162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.byteBar();
41262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
41362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
41462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
41562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 23);
41662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
41762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 23);
41862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    myHandler.returnType = Character.class;  // Char -> short == fail
41962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
42062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.shortFoo();
42162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected ClassCastException");
42262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
42362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
42462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(fooInvocations == 24);
42562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
42662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 23);
42762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    try {
42862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        proxyMyInterface.shortBar();
42962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers        throw new AssertionError("Expected NPE");
43062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    } catch (ClassCastException e) {
43162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    }
43262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    check(barInvocations == 24);
43362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
434466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    System.out.println(testName + ".testProxyReturns PASSED");
435466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  }
436466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
437466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  static void testProxyArgPassing() {
438466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    System.out.println(testName + ".testProxyArgPassing RUNNING");
439466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    MyInvocationHandler myHandler = new MyInvocationHandler();
440466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    MyInterface proxyMyInterface =
441466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        (MyInterface)Proxy.newProxyInstance(ReturnsAndArgPassing.class.getClassLoader(),
442466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers                                            new Class[] { MyInterface.class },
443466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers                                            myHandler);
444466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
445466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check((Integer)proxyMyInterface.selectArg(0, Integer.MAX_VALUE, Long.MAX_VALUE,
446466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        Float.MAX_VALUE, Double.MAX_VALUE, Object.class) == 0);
447466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check((Integer)proxyMyInterface.selectArg(1, Integer.MAX_VALUE, Long.MAX_VALUE,
448466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        Float.MAX_VALUE, Double.MAX_VALUE, Object.class) == Integer.MAX_VALUE);
449466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check((Long)proxyMyInterface.selectArg(2, Integer.MAX_VALUE, Long.MAX_VALUE,
450466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        Float.MAX_VALUE, Double.MAX_VALUE, Object.class) == Long.MAX_VALUE);
451466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check((Float)proxyMyInterface.selectArg(3, Integer.MAX_VALUE, Long.MAX_VALUE,
452466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        Float.MAX_VALUE, Double.MAX_VALUE, Object.class) == Float.MAX_VALUE);
453466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check((Double)proxyMyInterface.selectArg(4, Integer.MAX_VALUE, Long.MAX_VALUE,
454466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        Float.MAX_VALUE, Double.MAX_VALUE, Object.class) == Double.MAX_VALUE);
455466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    check(proxyMyInterface.selectArg(5, Integer.MAX_VALUE, Long.MAX_VALUE,
456466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers        Float.MAX_VALUE, Double.MAX_VALUE, Object.class) == Object.class);
457466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
458466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    System.out.println(testName + ".testProxyArgPassing PASSED");
459466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  }
460466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers
461466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  public static void main(String args[]) {
462466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    testProxyReturns();
463466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    testProxyArgPassing();
464466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers  }
465466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers}
466