/* * 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;
}
private Exception testWMT(MethodHandle mh, MethodHandle mh1, int reps) throws Throwable { //VERBOSE: System.out.println("mh="+mh+" mh1="+mh1);
MethodHandle[] mhs = new MethodHandle[100];
Arrays.fill(mhs, mh); int patch = mhs.length-1;
Exception savedEx = null; for (int i = 0; i < REPEAT; i++) {
mhs[patch] = mh;
testWMT(mhs, 10000);
mhs[patch] = mh1;
savedEx = testWMT(mhs, reps);
} return savedEx;
}
privatestaticvoid assertEquals(Object x, Object y) { if (x == y || x != null && x.equals(y)) return; thrownew RuntimeException(x+" != "+y);
}
}
Messung V0.5 in Prozent
¤ 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.0.1Bemerkung:
(vorverarbeitet am 2026-06-04)
¤
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.