1 cananian 1.1.2.1 // ArrayCopy.java, created Tue Jan 23 16:09:31 2001 by cananian 2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Runtime; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 /** 7 cananian 1.1.2.1 * <code>ArrayCopy</code> contains a pure java implementation of 8 cananian 1.1.2.1 * the <code>System.arraycopy()</code> method. This is used 9 cananian 1.1.2.1 * by the <code>ArrayCopyImplementer</code> <code>HCodeFactory</code>. 10 cananian 1.1.2.1 * 11 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 12 cananian 1.2 * @version $Id: ArrayCopy.java,v 1.2 2002/02/25 21:06:26 cananian Exp $ 13 cananian 1.1.2.1 */ 14 cananian 1.1.2.1 public final class ArrayCopy { 15 cananian 1.1.2.1 private ArrayCopy() { } 16 cananian 1.1.2.1 17 cananian 1.1.2.1 /* pure-java implementation of System.arraycopy() */ 18 cananian 1.1.2.1 public static void arraycopy(Object src, int src_position, 19 cananian 1.1.2.1 Object dst, int dst_position, 20 cananian 1.1.2.1 int length) { 21 cananian 1.1.2.2 // tricky tricky: spec allows for overlapping copies. 22 cananian 1.1.2.2 if (src==dst && src_position < dst_position) { 23 cananian 1.1.2.2 // hopefully intelligent pointer analysis will be able to 24 cananian 1.1.2.2 // statically evaluate the condition above when this is 25 cananian 1.1.2.2 // inlined. 26 cananian 1.1.2.2 arraycopy_backwards(src, src_position, dst, dst_position, length); 27 cananian 1.1.2.2 return; // wow, that was a close one! 28 cananian 1.1.2.2 } 29 cananian 1.1.2.1 if (src==null || dst==null) 30 cananian 1.1.2.1 throw new NullPointerException(); 31 cananian 1.1.2.1 if (src_position < 0 || dst_position < 0 || length < 0) 32 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 33 cananian 1.1.2.1 if (src instanceof boolean[] && dst instanceof boolean[]) { 34 cananian 1.1.2.1 boolean[] sa = (boolean[]) src, da = (boolean[]) dst; 35 cananian 1.1.2.1 if (src_position+length > sa.length || 36 cananian 1.1.2.1 dst_position+length > da.length) 37 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 38 cananian 1.1.2.1 for (int i=0; i<length; i++) 39 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 40 cananian 1.1.2.1 return; 41 cananian 1.1.2.1 } 42 cananian 1.1.2.1 if (src instanceof byte[] && dst instanceof byte[]) { 43 cananian 1.1.2.1 byte[] sa = (byte[]) src, da = (byte[]) dst; 44 cananian 1.1.2.1 if (src_position+length > sa.length || 45 cananian 1.1.2.1 dst_position+length > da.length) 46 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 47 cananian 1.1.2.1 for (int i=0; i<length; i++) 48 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 49 cananian 1.1.2.1 return; 50 cananian 1.1.2.1 } 51 cananian 1.1.2.1 if (src instanceof char[] && dst instanceof char[]) { 52 cananian 1.1.2.1 char[] sa = (char[]) src, da = (char[]) dst; 53 cananian 1.1.2.1 if (src_position+length > sa.length || 54 cananian 1.1.2.1 dst_position+length > da.length) 55 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 56 cananian 1.1.2.1 for (int i=0; i<length; i++) 57 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 58 cananian 1.1.2.1 return; 59 cananian 1.1.2.1 } 60 cananian 1.1.2.1 if (src instanceof short[] && dst instanceof short[]) { 61 cananian 1.1.2.1 short[] sa = (short[]) src, da = (short[]) dst; 62 cananian 1.1.2.1 if (src_position+length > sa.length || 63 cananian 1.1.2.1 dst_position+length > da.length) 64 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 65 cananian 1.1.2.1 for (int i=0; i<length; i++) 66 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 67 cananian 1.1.2.1 return; 68 cananian 1.1.2.1 } 69 cananian 1.1.2.1 if (src instanceof int[] && dst instanceof int[]) { 70 cananian 1.1.2.1 int[] sa = (int[]) src, da = (int[]) dst; 71 cananian 1.1.2.1 if (src_position+length > sa.length || 72 cananian 1.1.2.1 dst_position+length > da.length) 73 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 74 cananian 1.1.2.1 for (int i=0; i<length; i++) 75 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 76 cananian 1.1.2.1 return; 77 cananian 1.1.2.1 } 78 cananian 1.1.2.1 if (src instanceof long[] && dst instanceof long[]) { 79 cananian 1.1.2.1 long[] sa = (long[]) src, da = (long[]) dst; 80 cananian 1.1.2.1 if (src_position+length > sa.length || 81 cananian 1.1.2.1 dst_position+length > da.length) 82 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 83 cananian 1.1.2.1 for (int i=0; i<length; i++) 84 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 85 cananian 1.1.2.1 return; 86 cananian 1.1.2.1 } 87 cananian 1.1.2.1 if (src instanceof float[] && dst instanceof float[]) { 88 cananian 1.1.2.1 float[] sa = (float[]) src, da = (float[]) dst; 89 cananian 1.1.2.1 if (src_position+length > sa.length || 90 cananian 1.1.2.1 dst_position+length > da.length) 91 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 92 cananian 1.1.2.1 for (int i=0; i<length; i++) 93 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 94 cananian 1.1.2.1 return; 95 cananian 1.1.2.1 } 96 cananian 1.1.2.1 if (src instanceof double[] && dst instanceof double[]) { 97 cananian 1.1.2.1 double[] sa = (double[]) src, da = (double[]) dst; 98 cananian 1.1.2.1 if (src_position+length > sa.length || 99 cananian 1.1.2.1 dst_position+length > da.length) 100 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 101 cananian 1.1.2.1 for (int i=0; i<length; i++) 102 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 103 cananian 1.1.2.1 return; 104 cananian 1.1.2.1 } 105 cananian 1.1.2.1 if (src instanceof Object[] && dst instanceof Object[]) { 106 cananian 1.1.2.1 Object[] sa = (Object[]) src, da = (Object[]) dst; 107 cananian 1.1.2.1 if (src_position+length > sa.length || 108 cananian 1.1.2.1 dst_position+length > da.length) 109 cananian 1.1.2.1 throw new ArrayIndexOutOfBoundsException(); 110 cananian 1.1.2.1 for (int i=0; i<length; i++) 111 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 112 cananian 1.1.2.2 return; 113 cananian 1.1.2.2 } 114 cananian 1.1.2.2 throw new ArrayStoreException(); 115 cananian 1.1.2.2 } 116 cananian 1.1.2.2 // same as arraycopy, except the copy is done in the reverse direction. 117 cananian 1.1.2.2 public static void arraycopy_backwards(Object src, int src_position, 118 cananian 1.1.2.2 Object dst, int dst_position, 119 cananian 1.1.2.2 int length) { 120 cananian 1.1.2.2 if (src==null || dst==null) 121 cananian 1.1.2.2 throw new NullPointerException(); 122 cananian 1.1.2.2 if (src_position < 0 || dst_position < 0 || length < 0) 123 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 124 cananian 1.1.2.2 if (src instanceof boolean[] && dst instanceof boolean[]) { 125 cananian 1.1.2.2 boolean[] sa = (boolean[]) src, da = (boolean[]) dst; 126 cananian 1.1.2.2 if (src_position+length > sa.length || 127 cananian 1.1.2.2 dst_position+length > da.length) 128 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 129 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 130 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 131 cananian 1.1.2.2 return; 132 cananian 1.1.2.2 } 133 cananian 1.1.2.2 if (src instanceof byte[] && dst instanceof byte[]) { 134 cananian 1.1.2.2 byte[] sa = (byte[]) src, da = (byte[]) dst; 135 cananian 1.1.2.2 if (src_position+length > sa.length || 136 cananian 1.1.2.2 dst_position+length > da.length) 137 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 138 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 139 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 140 cananian 1.1.2.2 return; 141 cananian 1.1.2.2 } 142 cananian 1.1.2.2 if (src instanceof char[] && dst instanceof char[]) { 143 cananian 1.1.2.2 char[] sa = (char[]) src, da = (char[]) dst; 144 cananian 1.1.2.2 if (src_position+length > sa.length || 145 cananian 1.1.2.2 dst_position+length > da.length) 146 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 147 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 148 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 149 cananian 1.1.2.2 return; 150 cananian 1.1.2.2 } 151 cananian 1.1.2.2 if (src instanceof short[] && dst instanceof short[]) { 152 cananian 1.1.2.2 short[] sa = (short[]) src, da = (short[]) dst; 153 cananian 1.1.2.2 if (src_position+length > sa.length || 154 cananian 1.1.2.2 dst_position+length > da.length) 155 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 156 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 157 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 158 cananian 1.1.2.2 return; 159 cananian 1.1.2.2 } 160 cananian 1.1.2.2 if (src instanceof int[] && dst instanceof int[]) { 161 cananian 1.1.2.2 int[] sa = (int[]) src, da = (int[]) dst; 162 cananian 1.1.2.2 if (src_position+length > sa.length || 163 cananian 1.1.2.2 dst_position+length > da.length) 164 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 165 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 166 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 167 cananian 1.1.2.2 return; 168 cananian 1.1.2.2 } 169 cananian 1.1.2.2 if (src instanceof long[] && dst instanceof long[]) { 170 cananian 1.1.2.2 long[] sa = (long[]) src, da = (long[]) dst; 171 cananian 1.1.2.2 if (src_position+length > sa.length || 172 cananian 1.1.2.2 dst_position+length > da.length) 173 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 174 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 175 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 176 cananian 1.1.2.2 return; 177 cananian 1.1.2.2 } 178 cananian 1.1.2.2 if (src instanceof float[] && dst instanceof float[]) { 179 cananian 1.1.2.2 float[] sa = (float[]) src, da = (float[]) dst; 180 cananian 1.1.2.2 if (src_position+length > sa.length || 181 cananian 1.1.2.2 dst_position+length > da.length) 182 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 183 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 184 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 185 cananian 1.1.2.2 return; 186 cananian 1.1.2.2 } 187 cananian 1.1.2.2 if (src instanceof double[] && dst instanceof double[]) { 188 cananian 1.1.2.2 double[] sa = (double[]) src, da = (double[]) dst; 189 cananian 1.1.2.2 if (src_position+length > sa.length || 190 cananian 1.1.2.2 dst_position+length > da.length) 191 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 192 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 193 cananian 1.1.2.2 da[dst_position+i] = sa[src_position+i]; 194 cananian 1.1.2.2 return; 195 cananian 1.1.2.2 } 196 cananian 1.1.2.2 if (src instanceof Object[] && dst instanceof Object[]) { 197 cananian 1.1.2.2 Object[] sa = (Object[]) src, da = (Object[]) dst; 198 cananian 1.1.2.2 if (src_position+length > sa.length || 199 cananian 1.1.2.2 dst_position+length > da.length) 200 cananian 1.1.2.2 throw new ArrayIndexOutOfBoundsException(); 201 cananian 1.1.2.2 for (int i=length-1; i>=0; i--) 202 cananian 1.1.2.1 da[dst_position+i] = sa[src_position+i]; 203 cananian 1.1.2.1 return; 204 cananian 1.1.2.1 } 205 cananian 1.1.2.1 throw new ArrayStoreException(); 206 cananian 1.1.2.1 } 207 cananian 1.2 }