1*055d4590SKeyi Gui import java.io.IOException; 2*055d4590SKeyi Gui class Blort { arrayCopyTest(int k)3*055d4590SKeyi Gui private static void arrayCopyTest(int k) { 4*055d4590SKeyi Gui // A local variable assigned from an argument 5*055d4590SKeyi Gui int j = k; 6*055d4590SKeyi Gui // These two locals are defined once and used multiple times 7*055d4590SKeyi Gui String[] stringArray = new String[8]; 8*055d4590SKeyi Gui Object[] objectArray = new Object[8]; 9*055d4590SKeyi Gui // Should cause another move to be inserted 10*055d4590SKeyi Gui Object anotherOne = objectArray; 11*055d4590SKeyi Gui 12*055d4590SKeyi Gui if (anotherOne != null) { 13*055d4590SKeyi Gui System.out.println("foo"); 14*055d4590SKeyi Gui } 15*055d4590SKeyi Gui 16*055d4590SKeyi Gui // "i" is used in a loop 17*055d4590SKeyi Gui for (int i = 0; i < stringArray.length; i++) 18*055d4590SKeyi Gui stringArray[i] = new String(Integer.toString(i)); 19*055d4590SKeyi Gui 20*055d4590SKeyi Gui System.out.println("string -> object"); 21*055d4590SKeyi Gui System.arraycopy(stringArray, 0, objectArray, 0, stringArray.length); 22*055d4590SKeyi Gui System.out.println("object -> string"); 23*055d4590SKeyi Gui System.arraycopy(objectArray, 0, stringArray, 0, stringArray.length); 24*055d4590SKeyi Gui System.out.println("object -> string (modified)"); 25*055d4590SKeyi Gui objectArray[4] = new Object(); 26*055d4590SKeyi Gui try { 27*055d4590SKeyi Gui System.arraycopy(objectArray, 0, stringArray, 0,stringArray.length); 28*055d4590SKeyi Gui } catch (ArrayStoreException ase) { 29*055d4590SKeyi Gui // "ase" is an unused local which still must be preserved 30*055d4590SKeyi Gui System.out.println("caught ArrayStoreException (expected)"); 31*055d4590SKeyi Gui } 32*055d4590SKeyi Gui } 33*055d4590SKeyi Gui testConstructor()34*055d4590SKeyi Gui private void testConstructor() { 35*055d4590SKeyi Gui Blort foo = null; 36*055d4590SKeyi Gui try { 37*055d4590SKeyi Gui foo = new Blort(); 38*055d4590SKeyi Gui } catch (Exception ex) { 39*055d4590SKeyi Gui } 40*055d4590SKeyi Gui System.err.println(foo); 41*055d4590SKeyi Gui } 42*055d4590SKeyi Gui /** 43*055d4590SKeyi Gui * Stolen from 44*055d4590SKeyi Gui * java/android/org/apache/http/impl/io/AbstractMessageParser.java 45*055d4590SKeyi Gui * Simplified. 46*055d4590SKeyi Gui * 47*055d4590SKeyi Gui * Checks to see that local variable assignment is preserved through 48*055d4590SKeyi Gui * phi's. The key component here is the assignment of previous = current. 49*055d4590SKeyi Gui */ parseHeaderGroup( final Object headGroup, final Object inbuffer, int maxHeaderCount, int maxLineLen)50*055d4590SKeyi Gui public static void parseHeaderGroup( 51*055d4590SKeyi Gui final Object headGroup, 52*055d4590SKeyi Gui final Object inbuffer, 53*055d4590SKeyi Gui int maxHeaderCount, 54*055d4590SKeyi Gui int maxLineLen) 55*055d4590SKeyi Gui throws IOException { 56*055d4590SKeyi Gui 57*055d4590SKeyi Gui StringBuilder current = null; 58*055d4590SKeyi Gui StringBuilder previous = null; 59*055d4590SKeyi Gui for (;;) { 60*055d4590SKeyi Gui if (current == null) { 61*055d4590SKeyi Gui current = new StringBuilder(64); 62*055d4590SKeyi Gui } else { 63*055d4590SKeyi Gui current.length(); 64*055d4590SKeyi Gui } 65*055d4590SKeyi Gui int l = inbuffer.hashCode(); 66*055d4590SKeyi Gui if (l == -1 || current.length() < 1) { 67*055d4590SKeyi Gui break; 68*055d4590SKeyi Gui } 69*055d4590SKeyi Gui 70*055d4590SKeyi Gui if ((current.charAt(0) == ' ' || current.charAt(0) == '\t') && previous != null) { 71*055d4590SKeyi Gui int i = 0; 72*055d4590SKeyi Gui while (i < current.length()) { 73*055d4590SKeyi Gui char ch = current.charAt(i); 74*055d4590SKeyi Gui if (ch != ' ' && ch != '\t') { 75*055d4590SKeyi Gui break; 76*055d4590SKeyi Gui } 77*055d4590SKeyi Gui i++; 78*055d4590SKeyi Gui } 79*055d4590SKeyi Gui if (maxLineLen > 0 80*055d4590SKeyi Gui && previous.length() + 1 + current.length() - i > maxLineLen) { 81*055d4590SKeyi Gui throw new IOException("Maximum line length limit exceeded"); 82*055d4590SKeyi Gui } 83*055d4590SKeyi Gui previous.append(' '); 84*055d4590SKeyi Gui previous.append(current, i, current.length() - i); 85*055d4590SKeyi Gui } else { 86*055d4590SKeyi Gui previous = current; 87*055d4590SKeyi Gui current = null; 88*055d4590SKeyi Gui } 89*055d4590SKeyi Gui if (maxHeaderCount > 0) { 90*055d4590SKeyi Gui throw new IOException("Maximum header count exceeded"); 91*055d4590SKeyi Gui } 92*055d4590SKeyi Gui } 93*055d4590SKeyi Gui } 94*055d4590SKeyi Gui } 95