615 testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "<init>", int.class);
616 testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "<init>", Void.class);
617 testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "s0");
618
619 // test dispatch
620 testFindVirtual(SubExample.class, SubExample.class, void.class, "Sub/v0");
621 testFindVirtual(SubExample.class, Example.class, void.class, "Sub/v0");
622 testFindVirtual(SubExample.class, IntExample.class, void.class, "Sub/v0");
623 testFindVirtual(SubExample.class, SubExample.class, void.class, "Sub/pkg_v0");
624 testFindVirtual(SubExample.class, Example.class, void.class, "Sub/pkg_v0");
625 testFindVirtual(Example.class, IntExample.class, void.class, "v0");
626 testFindVirtual(IntExample.Impl.class, IntExample.class, void.class, "Int/v0");
627 }
628
629 @Test
630 public void testFindVirtualClone() throws Throwable {
631 CodeCacheOverflowProcessor.runMHTest(this::testFindVirtualClone0);
632 }
633
634 public void testFindVirtualClone0() throws Throwable {
635 // test some ad hoc system methods
636 testFindVirtual(false, PUBLIC, Object.class, Object.class, "clone");
637
638 // ##### FIXME - disable tests for clone until we figure out how they should work with modules
639
640 /*
641 testFindVirtual(true, PUBLIC, Object[].class, Object.class, "clone");
642 testFindVirtual(true, PUBLIC, int[].class, Object.class, "clone");
643 for (Class<?> cls : new Class<?>[]{ boolean[].class, long[].class, float[].class, char[].class })
644 testFindVirtual(true, PUBLIC, cls, Object.class, "clone");
645 */
646 }
647
648 void testFindVirtual(Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable {
649 Class<?> rcvc = defc;
650 testFindVirtual(rcvc, defc, ret, name, params);
651 }
652 void testFindVirtual(Class<?> rcvc, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable {
653 for (Object[] ac : accessCases(defc, name)) {
654 testFindVirtual((Boolean)ac[0], (Lookup)ac[1], rcvc, defc, ret, name, params);
2781 System.out.println("calling loop for argument types " + lArgTypes + " with predicate at index " + i);
2782 if (verbosity >= 5) {
2783 System.out.println("predicates: " + Arrays.asList(usePreds));
2784 }
2785 }
2786 MethodHandle[] preInits = new MethodHandle[nargs + 1];
2787 MethodHandle[] prePreds = new MethodHandle[nargs + 1];
2788 MethodHandle[] preSteps = new MethodHandle[nargs + 1];
2789 MethodHandle[] preFinis = new MethodHandle[nargs + 1];
2790 System.arraycopy(inits, 0, preInits, 1, nargs);
2791 System.arraycopy(usePreds, 0, prePreds, 0, nargs); // preds are offset by 1 for pre-checked loops
2792 System.arraycopy(steps, 0, preSteps, 1, nargs);
2793 System.arraycopy(finis, 0, preFinis, 0, nargs); // finis are also offset by 1 for pre-checked loops
2794 // Convert to clause-major form.
2795 MethodHandle[][] preClauses = new MethodHandle[nargs + 1][4];
2796 MethodHandle[][] postClauses = new MethodHandle[nargs][4];
2797 toClauseMajor(preClauses, preInits, preSteps, prePreds, preFinis);
2798 toClauseMajor(postClauses, inits, steps, usePreds, finis);
2799 MethodHandle pre = MethodHandles.loop(preClauses);
2800 MethodHandle post = MethodHandles.loop(postClauses);
2801 Object[] preResults = (Object[]) pre.invokeWithArguments(args);
2802 if (verbosity >= 4) {
2803 System.out.println("pre-checked: expected " + Arrays.asList(preCheckedResults[i]) + ", actual " +
2804 Arrays.asList(preResults));
2805 }
2806 Object[] postResults = (Object[]) post.invokeWithArguments(args);
2807 if (verbosity >= 4) {
2808 System.out.println("post-checked: expected " + Arrays.asList(postCheckedResults[i]) + ", actual " +
2809 Arrays.asList(postResults));
2810 }
2811 assertArrayEquals(preCheckedResults[i], preResults);
2812 assertArrayEquals(postCheckedResults[i], postResults);
2813 }
2814 }
2815 static void toClauseMajor(MethodHandle[][] clauses, MethodHandle[] init, MethodHandle[] step, MethodHandle[] pred, MethodHandle[] fini) {
2816 for (int i = 0; i < clauses.length; ++i) {
2817 clauses[i][0] = init[i];
2818 clauses[i][1] = step[i];
2819 clauses[i][2] = pred[i];
2820 clauses[i][3] = fini[i];
2821 }
2822 }
2823 static boolean loopIntPred(int a) {
2824 if (verbosity >= 5) {
2825 System.out.println("int pred " + a + " -> " + (a < 7));
|
615 testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "<init>", int.class);
616 testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "<init>", Void.class);
617 testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "s0");
618
619 // test dispatch
620 testFindVirtual(SubExample.class, SubExample.class, void.class, "Sub/v0");
621 testFindVirtual(SubExample.class, Example.class, void.class, "Sub/v0");
622 testFindVirtual(SubExample.class, IntExample.class, void.class, "Sub/v0");
623 testFindVirtual(SubExample.class, SubExample.class, void.class, "Sub/pkg_v0");
624 testFindVirtual(SubExample.class, Example.class, void.class, "Sub/pkg_v0");
625 testFindVirtual(Example.class, IntExample.class, void.class, "v0");
626 testFindVirtual(IntExample.Impl.class, IntExample.class, void.class, "Int/v0");
627 }
628
629 @Test
630 public void testFindVirtualClone() throws Throwable {
631 CodeCacheOverflowProcessor.runMHTest(this::testFindVirtualClone0);
632 }
633
634 public void testFindVirtualClone0() throws Throwable {
635 if (CAN_SKIP_WORKING) return;
636 // test some ad hoc system methods
637 testFindVirtual(false, PUBLIC, Object.class, Object.class, "clone");
638
639 // ##### FIXME - disable tests for clone until we figure out how they should work with modules
640
641 /*
642 testFindVirtual(true, PUBLIC, Object[].class, Object.class, "clone");
643 testFindVirtual(true, PUBLIC, int[].class, Object.class, "clone");
644 for (Class<?> cls : new Class<?>[]{ boolean[].class, long[].class, float[].class, char[].class })
645 testFindVirtual(true, PUBLIC, cls, Object.class, "clone");
646 */
647 }
648
649 void testFindVirtual(Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable {
650 Class<?> rcvc = defc;
651 testFindVirtual(rcvc, defc, ret, name, params);
652 }
653 void testFindVirtual(Class<?> rcvc, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable {
654 for (Object[] ac : accessCases(defc, name)) {
655 testFindVirtual((Boolean)ac[0], (Lookup)ac[1], rcvc, defc, ret, name, params);
2782 System.out.println("calling loop for argument types " + lArgTypes + " with predicate at index " + i);
2783 if (verbosity >= 5) {
2784 System.out.println("predicates: " + Arrays.asList(usePreds));
2785 }
2786 }
2787 MethodHandle[] preInits = new MethodHandle[nargs + 1];
2788 MethodHandle[] prePreds = new MethodHandle[nargs + 1];
2789 MethodHandle[] preSteps = new MethodHandle[nargs + 1];
2790 MethodHandle[] preFinis = new MethodHandle[nargs + 1];
2791 System.arraycopy(inits, 0, preInits, 1, nargs);
2792 System.arraycopy(usePreds, 0, prePreds, 0, nargs); // preds are offset by 1 for pre-checked loops
2793 System.arraycopy(steps, 0, preSteps, 1, nargs);
2794 System.arraycopy(finis, 0, preFinis, 0, nargs); // finis are also offset by 1 for pre-checked loops
2795 // Convert to clause-major form.
2796 MethodHandle[][] preClauses = new MethodHandle[nargs + 1][4];
2797 MethodHandle[][] postClauses = new MethodHandle[nargs][4];
2798 toClauseMajor(preClauses, preInits, preSteps, prePreds, preFinis);
2799 toClauseMajor(postClauses, inits, steps, usePreds, finis);
2800 MethodHandle pre = MethodHandles.loop(preClauses);
2801 MethodHandle post = MethodHandles.loop(postClauses);
2802 if (verbosity >= 6) {
2803 System.out.println("pre-handle: " + pre);
2804 }
2805 Object[] preResults = (Object[]) pre.invokeWithArguments(args);
2806 if (verbosity >= 4) {
2807 System.out.println("pre-checked: expected " + Arrays.asList(preCheckedResults[i]) + ", actual " +
2808 Arrays.asList(preResults));
2809 }
2810 if (verbosity >= 6) {
2811 System.out.println("post-handle: " + post);
2812 }
2813 Object[] postResults = (Object[]) post.invokeWithArguments(args);
2814 if (verbosity >= 4) {
2815 System.out.println("post-checked: expected " + Arrays.asList(postCheckedResults[i]) + ", actual " +
2816 Arrays.asList(postResults));
2817 }
2818 assertArrayEquals(preCheckedResults[i], preResults);
2819 assertArrayEquals(postCheckedResults[i], postResults);
2820 }
2821 }
2822 static void toClauseMajor(MethodHandle[][] clauses, MethodHandle[] init, MethodHandle[] step, MethodHandle[] pred, MethodHandle[] fini) {
2823 for (int i = 0; i < clauses.length; ++i) {
2824 clauses[i][0] = init[i];
2825 clauses[i][1] = step[i];
2826 clauses[i][2] = pred[i];
2827 clauses[i][3] = fini[i];
2828 }
2829 }
2830 static boolean loopIntPred(int a) {
2831 if (verbosity >= 5) {
2832 System.out.println("int pred " + a + " -> " + (a < 7));
|