< prev index next >

test/java/lang/invoke/MethodHandlesTest.java

Print this page
rev 15686 : 8161211: better inlining support for loop bytecode intrinsics
Reviewed-by: jrose, vlivanov


 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));


< prev index next >