hotspot/test/compiler/arraycopy/TestArrayCopyUtils.java
changeset 30629 b6e5ad2f18d5
child 40059 c2304140ed64
equal deleted inserted replaced
30628:3c15b4a3bf4d 30629:b6e5ad2f18d5
       
     1 /*
       
     2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 
       
    24 import java.lang.annotation.*;
       
    25 import java.lang.reflect.*;
       
    26 import java.util.*;
       
    27 
       
    28 abstract class TestArrayCopyUtils {
       
    29     public enum ArraySrc {
       
    30         SMALL,
       
    31         LARGE,
       
    32         ZERO
       
    33     }
       
    34 
       
    35     public enum ArrayDst {
       
    36         NONE,
       
    37         NEW,
       
    38         SRC
       
    39     }
       
    40 
       
    41     static class A {
       
    42     }
       
    43 
       
    44     static class B extends A {
       
    45     }
       
    46 
       
    47     static final A[] small_a_src = new A[5];
       
    48     static final A[] large_a_src = new A[10];
       
    49     static final A[] zero_a_src = new A[0];
       
    50     static final int[] small_int_src = new int[5];
       
    51     static final int[] large_int_src = new int[10];
       
    52     static final int[] zero_int_src = new int[0];
       
    53     static final Object[] small_object_src = new Object[5];
       
    54     static Object src;
       
    55 
       
    56     @Retention(RetentionPolicy.RUNTIME)
       
    57     @interface Args {
       
    58         ArraySrc src();
       
    59         ArrayDst dst() default ArrayDst.NONE;
       
    60         int[] extra_args() default {};
       
    61     }
       
    62 
       
    63     final HashMap<String,Method> tests = new HashMap<>();
       
    64     {
       
    65         for (Method m : this.getClass().getDeclaredMethods()) {
       
    66             if (m.getName().matches("m[0-9]+(_check)?")) {
       
    67                 assert(Modifier.isStatic(m.getModifiers())) : m;
       
    68                 tests.put(m.getName(), m);
       
    69             }
       
    70         }
       
    71     }
       
    72 
       
    73     boolean success = true;
       
    74 
       
    75     void doTest(String name) throws Exception {
       
    76         Method m = tests.get(name);
       
    77         Method m_check = tests.get(name + "_check");
       
    78         Class[] paramTypes = m.getParameterTypes();
       
    79         Object[] params = new Object[paramTypes.length];
       
    80         Class retType = m.getReturnType();
       
    81         boolean isIntArray = (retType.isPrimitive() && !retType.equals(Void.TYPE)) ||
       
    82             (retType.equals(Void.TYPE) && paramTypes[0].getComponentType().isPrimitive()) ||
       
    83             (retType.isArray() && retType.getComponentType().isPrimitive());
       
    84 
       
    85         Args args = m.getAnnotation(Args.class);
       
    86 
       
    87         Object src = null;
       
    88         switch(args.src()) {
       
    89         case SMALL: {
       
    90             if (isIntArray) {
       
    91                 src = small_int_src;
       
    92             } else {
       
    93                 src = small_a_src;
       
    94             }
       
    95             break;
       
    96         }
       
    97         case LARGE: {
       
    98             if (isIntArray) {
       
    99                 src = large_int_src;
       
   100             } else {
       
   101                 src = large_a_src;
       
   102             }
       
   103             break;
       
   104         }
       
   105         case ZERO: {
       
   106             if (isIntArray) {
       
   107                 src = zero_int_src;
       
   108             } else {
       
   109                 src = zero_a_src;
       
   110             }
       
   111             break;
       
   112         }
       
   113         }
       
   114 
       
   115         for (int i = 0; i < 20000; i++) {
       
   116             boolean failure = false;
       
   117 
       
   118             int p = 0;
       
   119 
       
   120             if (params.length > 0) {
       
   121                 if (isIntArray) {
       
   122                     params[0] = ((int[])src).clone();
       
   123                 } else {
       
   124                     params[0] = ((A[])src).clone();
       
   125                 }
       
   126                 p++;
       
   127             }
       
   128 
       
   129             if (params.length > 1) {
       
   130                 switch(args.dst()) {
       
   131                 case NEW: {
       
   132                     if (isIntArray) {
       
   133                         params[1] = new int[((int[])params[0]).length];
       
   134                     } else {
       
   135                         params[1] = new A[((A[])params[0]).length];
       
   136                     }
       
   137                     p++;
       
   138                     break;
       
   139                 }
       
   140                 case SRC: {
       
   141                     params[1] = params[0];
       
   142                     p++;
       
   143                     break;
       
   144                 }
       
   145                 case NONE: break;
       
   146                 }
       
   147             }
       
   148 
       
   149             for (int j = 0; j < args.extra_args().length; j++) {
       
   150                 params[p+j] = args.extra_args()[j];
       
   151             }
       
   152 
       
   153             Object res = m.invoke(null, params);
       
   154 
       
   155             if (retType.isPrimitive() && !retType.equals(Void.TYPE)) {
       
   156                 int s = (int)res;
       
   157                 int sum = 0;
       
   158                 int[] int_res = (int[])src;
       
   159                 for (int j = 0; j < int_res.length; j++) {
       
   160                     sum += int_res[j];
       
   161                 }
       
   162                 failure = (s != sum);
       
   163                 if (failure) {
       
   164                     System.out.println("Test " + name + " failed: result = " + s + " != " + sum);
       
   165                 }
       
   166             } else {
       
   167                 Object dest = null;
       
   168                 if (!retType.equals(Void.TYPE)) {
       
   169                     dest = res;
       
   170                 } else {
       
   171                     dest = params[1];
       
   172                 }
       
   173 
       
   174                 if (m_check != null) {
       
   175                     failure = (boolean)m_check.invoke(null,  new Object[] { src, dest });
       
   176                 } else {
       
   177                     if (isIntArray) {
       
   178                         int[] int_res = (int[])src;
       
   179                         int[] int_dest = (int[])dest;
       
   180                         for (int j = 0; j < int_res.length; j++) {
       
   181                             if (int_res[j] != int_dest[j]) {
       
   182                                 System.out.println("Test " + name + " failed for " + j + " src[" + j +"]=" + int_res[j] + ", dest[" + j + "]=" + int_dest[j]);
       
   183                                 failure = true;
       
   184                             }
       
   185                         }
       
   186                     } else {
       
   187                         Object[] object_res = (Object[])src;
       
   188                         Object[] object_dest = (Object[])dest;
       
   189                         for (int j = 0; j < object_res.length; j++) {
       
   190                             if (object_res[j] != object_dest[j]) {
       
   191                                 System.out.println("Test " + name + " failed for " + j + " src[" + j +"]=" + object_res[j] + ", dest[" + j + "]=" + object_dest[j]);
       
   192                                 failure = true;
       
   193                             }
       
   194                         }
       
   195                     }
       
   196                 }
       
   197             }
       
   198 
       
   199             if (failure) {
       
   200                 success = false;
       
   201                 break;
       
   202             }
       
   203         }
       
   204     }
       
   205 
       
   206     TestArrayCopyUtils() {
       
   207         for (int i = 0; i < small_a_src.length; i++) {
       
   208             small_a_src[i] = new A();
       
   209         }
       
   210 
       
   211         for (int i = 0; i < small_int_src.length; i++) {
       
   212             small_int_src[i] = i;
       
   213         }
       
   214 
       
   215         for (int i = 0; i < large_int_src.length; i++) {
       
   216             large_int_src[i] = i;
       
   217         }
       
   218 
       
   219         for (int i = 0; i < 5; i++) {
       
   220             small_object_src[i] = new Object();
       
   221         }
       
   222     }
       
   223 }