xref: /aosp_15_r20/dalvik/dx/tests/087-ssa-local-vars/Blort.java (revision 055d459012065f78d96b68be8421640240ddf631)
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