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