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     }