/* * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* @test * @summary unit tests for method handles which permute their arguments * @run testng test.java.lang.invoke.ThrowExceptionsTest
*/
int testWMTCallee; privateint testWMTCallee(String x) { return testWMTCallee++;
} privatestatic MethodHandle testWMTCallee() {
MethodHandle callee = findVirtual("testWMTCallee"); // FIXME: should not have to retype callee
callee = callee.asType(callee.type().changeParameterType(0, Object.class)); return callee;
}
private Exception testWMT(MethodHandle[] mhs, int reps) throws Throwable {
testCases += 1;
testWMTCallee = 0; int catches = 0;
Exception savedEx = null; for (int i = 0; i < reps; i++) {
MethodHandle mh = mhs[i % mhs.length]; int n; try { // FIXME: should not have to retype this
n = (int) mh.invokeExact((Object)this, "x");
assertEquals(n, i - catches); // Using the exact type for this causes endless deopt due to // 'non_cached_result' in SystemDictionary::find_method_handle_invoke. // The problem is that the compiler thread needs to access a cached // invoke method, but invoke methods are not cached if one of the // component types is not on the BCP.
} catch (Exception ex) {
savedEx = ex;
catches++;
}
} //VERBOSE: System.out.println("reps="+reps+" catches="+catches); return savedEx;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.