xref: /aosp_15_r20/art/test/906-iterate-heap/src/art/Test906.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker package art;
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker import java.util.ArrayList;
20*795d594fSAndroid Build Coastguard Worker import java.util.Collections;
21*795d594fSAndroid Build Coastguard Worker import java.util.Random;
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker public class Test906 {
run()24*795d594fSAndroid Build Coastguard Worker   public static void run() throws Exception {
25*795d594fSAndroid Build Coastguard Worker     doTest();
26*795d594fSAndroid Build Coastguard Worker   }
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker   // Number of times we will try to count the heap in various ways. If we are unlucky and end up in
29*795d594fSAndroid Build Coastguard Worker   // the middle of a GC we could incorrectly fail. This is expected to be incredibly rare so 10
30*795d594fSAndroid Build Coastguard Worker   // retries should be more than sufficient.
31*795d594fSAndroid Build Coastguard Worker   private static final int ITERATE_RETRIES = 10;
32*795d594fSAndroid Build Coastguard Worker   private static final class Foobar {}
33*795d594fSAndroid Build Coastguard Worker 
testHeapCount()34*795d594fSAndroid Build Coastguard Worker   private static void testHeapCount() throws Exception {
35*795d594fSAndroid Build Coastguard Worker     IllegalStateException lastThrow = new IllegalStateException(
36*795d594fSAndroid Build Coastguard Worker         "Failed to get consistent counts after " + ITERATE_RETRIES + " retries");
37*795d594fSAndroid Build Coastguard Worker     Foobar[] foobars = new Foobar[123];
38*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < foobars.length; i++) {
39*795d594fSAndroid Build Coastguard Worker       foobars[i] = new Foobar();
40*795d594fSAndroid Build Coastguard Worker     }
41*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ITERATE_RETRIES; i++) {
42*795d594fSAndroid Build Coastguard Worker       try {
43*795d594fSAndroid Build Coastguard Worker         int all = iterateThroughHeapCount(0, null, Integer.MAX_VALUE);
44*795d594fSAndroid Build Coastguard Worker         int tagged = iterateThroughHeapCount(HEAP_FILTER_OUT_UNTAGGED, null, Integer.MAX_VALUE);
45*795d594fSAndroid Build Coastguard Worker         int untagged = iterateThroughHeapCount(HEAP_FILTER_OUT_TAGGED, null, Integer.MAX_VALUE);
46*795d594fSAndroid Build Coastguard Worker         int taggedClass = iterateThroughHeapCount(HEAP_FILTER_OUT_CLASS_UNTAGGED, null,
47*795d594fSAndroid Build Coastguard Worker             Integer.MAX_VALUE);
48*795d594fSAndroid Build Coastguard Worker         int untaggedClass = iterateThroughHeapCount(HEAP_FILTER_OUT_CLASS_TAGGED, null,
49*795d594fSAndroid Build Coastguard Worker             Integer.MAX_VALUE);
50*795d594fSAndroid Build Coastguard Worker         int filteredClass = iterateThroughHeapCount(0, Foobar.class, Integer.MAX_VALUE);
51*795d594fSAndroid Build Coastguard Worker 
52*795d594fSAndroid Build Coastguard Worker         if (all != tagged + untagged) {
53*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException("Instances: " + all + " != " + tagged + " + " + untagged);
54*795d594fSAndroid Build Coastguard Worker         }
55*795d594fSAndroid Build Coastguard Worker         if (all != taggedClass + untaggedClass) {
56*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException("By class: " + all + " != " + taggedClass + " + " +
57*795d594fSAndroid Build Coastguard Worker               untaggedClass);
58*795d594fSAndroid Build Coastguard Worker         }
59*795d594fSAndroid Build Coastguard Worker         if (filteredClass != foobars.length) {
60*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException(
61*795d594fSAndroid Build Coastguard Worker               "Missed objects of foobar type. " + filteredClass + " != " + foobars.length);
62*795d594fSAndroid Build Coastguard Worker         }
63*795d594fSAndroid Build Coastguard Worker         if (tagged != 6) {
64*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException(tagged + " tagged objects");
65*795d594fSAndroid Build Coastguard Worker         }
66*795d594fSAndroid Build Coastguard Worker         if (taggedClass != 2) {
67*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException(tagged + " objects with tagged class");
68*795d594fSAndroid Build Coastguard Worker         }
69*795d594fSAndroid Build Coastguard Worker         if (all == tagged) {
70*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException("All objects tagged");
71*795d594fSAndroid Build Coastguard Worker         }
72*795d594fSAndroid Build Coastguard Worker         if (all == taggedClass) {
73*795d594fSAndroid Build Coastguard Worker           throw new IllegalStateException("All objects have tagged class");
74*795d594fSAndroid Build Coastguard Worker         }
75*795d594fSAndroid Build Coastguard Worker         // Everything worked!
76*795d594fSAndroid Build Coastguard Worker         return;
77*795d594fSAndroid Build Coastguard Worker       } catch (IllegalStateException e) {
78*795d594fSAndroid Build Coastguard Worker         lastThrow.addSuppressed(e);
79*795d594fSAndroid Build Coastguard Worker       }
80*795d594fSAndroid Build Coastguard Worker     }
81*795d594fSAndroid Build Coastguard Worker     throw lastThrow;
82*795d594fSAndroid Build Coastguard Worker   }
83*795d594fSAndroid Build Coastguard Worker 
GenTs(Class<?> k)84*795d594fSAndroid Build Coastguard Worker   private static Object[] GenTs(Class<?> k) throws Exception {
85*795d594fSAndroid Build Coastguard Worker     Object[] ret = new Object[new Random().nextInt(100) + 10];
86*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ret.length; i++) {
87*795d594fSAndroid Build Coastguard Worker       ret[i] = k.newInstance();
88*795d594fSAndroid Build Coastguard Worker     }
89*795d594fSAndroid Build Coastguard Worker     return ret;
90*795d594fSAndroid Build Coastguard Worker   }
91*795d594fSAndroid Build Coastguard Worker 
checkEq(int a, int b)92*795d594fSAndroid Build Coastguard Worker   private static void checkEq(int a, int b) {
93*795d594fSAndroid Build Coastguard Worker     if (a != b) {
94*795d594fSAndroid Build Coastguard Worker       Error e = new Error("Failed: Expected equal " + a + " and " + b);
95*795d594fSAndroid Build Coastguard Worker       System.out.println(e);
96*795d594fSAndroid Build Coastguard Worker       e.printStackTrace(System.out);
97*795d594fSAndroid Build Coastguard Worker     }
98*795d594fSAndroid Build Coastguard Worker   }
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker   public static class Foo {}
101*795d594fSAndroid Build Coastguard Worker   public static class Bar extends Foo {}
102*795d594fSAndroid Build Coastguard Worker   public static class Baz extends Bar {}
103*795d594fSAndroid Build Coastguard Worker   public static class Alpha extends Bar {}
104*795d594fSAndroid Build Coastguard Worker   public static class MISSING extends Baz {}
105*795d594fSAndroid Build Coastguard Worker   public interface Iface {}
106*795d594fSAndroid Build Coastguard Worker   public static class Beta implements Iface {}
107*795d594fSAndroid Build Coastguard Worker   public static class Gamma implements Iface {}
108*795d594fSAndroid Build Coastguard Worker   public static class Delta extends Beta {}
testIterateOverInstances()109*795d594fSAndroid Build Coastguard Worker   private static void testIterateOverInstances() throws Exception {
110*795d594fSAndroid Build Coastguard Worker     Object[] foos = GenTs(Foo.class);
111*795d594fSAndroid Build Coastguard Worker     Object[] bars = GenTs(Bar.class);
112*795d594fSAndroid Build Coastguard Worker     Object[] bazs = GenTs(Baz.class);
113*795d594fSAndroid Build Coastguard Worker     Object[] alphas = GenTs(Alpha.class);
114*795d594fSAndroid Build Coastguard Worker     Object[] betas = GenTs(Beta.class);
115*795d594fSAndroid Build Coastguard Worker     Object[] gammas = GenTs(Gamma.class);
116*795d594fSAndroid Build Coastguard Worker     Object[] deltas = GenTs(Delta.class);
117*795d594fSAndroid Build Coastguard Worker     checkEq(0, iterateOverInstancesCount(MISSING.class));
118*795d594fSAndroid Build Coastguard Worker     checkEq(alphas.length, iterateOverInstancesCount(Alpha.class));
119*795d594fSAndroid Build Coastguard Worker     checkEq(bazs.length, iterateOverInstancesCount(Baz.class));
120*795d594fSAndroid Build Coastguard Worker     checkEq(bazs.length + alphas.length + bars.length, iterateOverInstancesCount(Bar.class));
121*795d594fSAndroid Build Coastguard Worker     checkEq(bazs.length + alphas.length + bars.length + foos.length,
122*795d594fSAndroid Build Coastguard Worker         iterateOverInstancesCount(Foo.class));
123*795d594fSAndroid Build Coastguard Worker     checkEq(betas.length + gammas.length + deltas.length,
124*795d594fSAndroid Build Coastguard Worker         iterateOverInstancesCount(Iface.class));
125*795d594fSAndroid Build Coastguard Worker   }
126*795d594fSAndroid Build Coastguard Worker 
doTest()127*795d594fSAndroid Build Coastguard Worker   public static void doTest() throws Exception {
128*795d594fSAndroid Build Coastguard Worker     A a = new A();
129*795d594fSAndroid Build Coastguard Worker     B b = new B();
130*795d594fSAndroid Build Coastguard Worker     B b2 = new B();
131*795d594fSAndroid Build Coastguard Worker     C c = new C();
132*795d594fSAndroid Build Coastguard Worker     A[] aArray = new A[5];
133*795d594fSAndroid Build Coastguard Worker     String s = "Hello World";
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker     setTag(a, 1);
136*795d594fSAndroid Build Coastguard Worker     setTag(b, 2);
137*795d594fSAndroid Build Coastguard Worker     setTag(b2, 3);
138*795d594fSAndroid Build Coastguard Worker     setTag(aArray, 4);
139*795d594fSAndroid Build Coastguard Worker     setTag(s, 5);
140*795d594fSAndroid Build Coastguard Worker     setTag(B.class, 100);
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker     testHeapCount();
143*795d594fSAndroid Build Coastguard Worker 
144*795d594fSAndroid Build Coastguard Worker     testIterateOverInstances();
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker     long classTags[] = new long[100];
147*795d594fSAndroid Build Coastguard Worker     long sizes[] = new long[100];
148*795d594fSAndroid Build Coastguard Worker     long tags[] = new long[100];
149*795d594fSAndroid Build Coastguard Worker     int lengths[] = new int[100];
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker     int n = iterateThroughHeapData(HEAP_FILTER_OUT_UNTAGGED, null, classTags, sizes, tags, lengths);
152*795d594fSAndroid Build Coastguard Worker     System.out.println(sort(n, classTags, sizes, tags, lengths));
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker     iterateThroughHeapAdd(HEAP_FILTER_OUT_UNTAGGED, null);
155*795d594fSAndroid Build Coastguard Worker     n = iterateThroughHeapData(HEAP_FILTER_OUT_UNTAGGED, null, classTags, sizes, tags, lengths);
156*795d594fSAndroid Build Coastguard Worker     System.out.println(sort(n, classTags, sizes, tags, lengths));
157*795d594fSAndroid Build Coastguard Worker 
158*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapString(getTag(s)));
159*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(s));
160*795d594fSAndroid Build Coastguard Worker 
161*795d594fSAndroid Build Coastguard Worker     boolean[] zArray = new boolean[] { false, true };
162*795d594fSAndroid Build Coastguard Worker     setTag(zArray, 1);
163*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(zArray)));
164*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(zArray));
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker     byte[] bArray = new byte[] { 1, 2, 3 };
167*795d594fSAndroid Build Coastguard Worker     setTag(bArray, 1);
168*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(bArray)));
169*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(bArray));
170*795d594fSAndroid Build Coastguard Worker 
171*795d594fSAndroid Build Coastguard Worker     char[] cArray = new char[] { 'A', 'Z' };
172*795d594fSAndroid Build Coastguard Worker     setTag(cArray, 1);
173*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(cArray)));
174*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(cArray));
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker     short[] sArray = new short[] { 1, 2, 3 };
177*795d594fSAndroid Build Coastguard Worker     setTag(sArray, 1);
178*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(sArray)));
179*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(sArray));
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker     int[] iArray = new int[] { 1, 2, 3 };
182*795d594fSAndroid Build Coastguard Worker     setTag(iArray, 1);
183*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(iArray)));
184*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(iArray));
185*795d594fSAndroid Build Coastguard Worker 
186*795d594fSAndroid Build Coastguard Worker     float[] fArray = new float[] { 0.0f, 1.0f };
187*795d594fSAndroid Build Coastguard Worker     setTag(fArray, 1);
188*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(fArray)));
189*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(fArray));
190*795d594fSAndroid Build Coastguard Worker 
191*795d594fSAndroid Build Coastguard Worker     long[] lArray = new long[] { 1, 2, 3 };
192*795d594fSAndroid Build Coastguard Worker     setTag(lArray, 1);
193*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(lArray)));
194*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(lArray));
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker     double[] dArray = new double[] { 0.0, 1.0 };
197*795d594fSAndroid Build Coastguard Worker     setTag(dArray, 1);
198*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveArray(getTag(dArray)));
199*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(dArray));
200*795d594fSAndroid Build Coastguard Worker 
201*795d594fSAndroid Build Coastguard Worker     // Force GCs to clean up dirt.
202*795d594fSAndroid Build Coastguard Worker     Runtime.getRuntime().gc();
203*795d594fSAndroid Build Coastguard Worker     Runtime.getRuntime().gc();
204*795d594fSAndroid Build Coastguard Worker 
205*795d594fSAndroid Build Coastguard Worker     doTestPrimitiveFieldsClasses();
206*795d594fSAndroid Build Coastguard Worker 
207*795d594fSAndroid Build Coastguard Worker     doTestPrimitiveFieldsIntegral();
208*795d594fSAndroid Build Coastguard Worker 
209*795d594fSAndroid Build Coastguard Worker     // Force GCs to clean up dirt.
210*795d594fSAndroid Build Coastguard Worker     Runtime.getRuntime().gc();
211*795d594fSAndroid Build Coastguard Worker     Runtime.getRuntime().gc();
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker     doTestPrimitiveFieldsFloat();
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker     // Force GCs to clean up dirt.
216*795d594fSAndroid Build Coastguard Worker     Runtime.getRuntime().gc();
217*795d594fSAndroid Build Coastguard Worker     Runtime.getRuntime().gc();
218*795d594fSAndroid Build Coastguard Worker   }
219*795d594fSAndroid Build Coastguard Worker 
doTestPrimitiveFieldsClasses()220*795d594fSAndroid Build Coastguard Worker   private static void doTestPrimitiveFieldsClasses() {
221*795d594fSAndroid Build Coastguard Worker     System.out.println("doTestPrimitiveFieldsClasses");
222*795d594fSAndroid Build Coastguard Worker     setTag(IntObject.class, 10000);
223*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveFields(10000));
224*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(IntObject.class));
225*795d594fSAndroid Build Coastguard Worker     setTag(IntObject.class, 0);
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker     setTag(FloatObject.class, 10000);
228*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveFields(10000));
229*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(FloatObject.class));
230*795d594fSAndroid Build Coastguard Worker     setTag(FloatObject.class, 0);
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker     boolean correctHeapValue = false;
233*795d594fSAndroid Build Coastguard Worker     setTag(Inf1.class, 10000);
234*795d594fSAndroid Build Coastguard Worker     String heapTrace = iterateThroughHeapPrimitiveFields(10000);
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker     if (!checkInitialized(Inf1.class)) {
237*795d594fSAndroid Build Coastguard Worker       correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000000");
238*795d594fSAndroid Build Coastguard Worker     } else {
239*795d594fSAndroid Build Coastguard Worker       correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000001");
240*795d594fSAndroid Build Coastguard Worker     }
241*795d594fSAndroid Build Coastguard Worker 
242*795d594fSAndroid Build Coastguard Worker     if (!correctHeapValue)
243*795d594fSAndroid Build Coastguard Worker       System.out.println("Heap Trace for Inf1 is not as expected:\n" + heapTrace);
244*795d594fSAndroid Build Coastguard Worker 
245*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(Inf1.class));
246*795d594fSAndroid Build Coastguard Worker     setTag(Inf1.class, 0);
247*795d594fSAndroid Build Coastguard Worker 
248*795d594fSAndroid Build Coastguard Worker     setTag(Inf2.class, 10000);
249*795d594fSAndroid Build Coastguard Worker     heapTrace = iterateThroughHeapPrimitiveFields(10000);
250*795d594fSAndroid Build Coastguard Worker 
251*795d594fSAndroid Build Coastguard Worker     if (!checkInitialized(Inf2.class)) {
252*795d594fSAndroid Build Coastguard Worker       correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000000");
253*795d594fSAndroid Build Coastguard Worker     } else {
254*795d594fSAndroid Build Coastguard Worker       correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000001");
255*795d594fSAndroid Build Coastguard Worker     }
256*795d594fSAndroid Build Coastguard Worker 
257*795d594fSAndroid Build Coastguard Worker     if (!correctHeapValue)
258*795d594fSAndroid Build Coastguard Worker       System.out.println("Heap Trace for Inf2 is not as expected:\n" + heapTrace);
259*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(Inf2.class));
260*795d594fSAndroid Build Coastguard Worker 
261*795d594fSAndroid Build Coastguard Worker     setTag(Inf2.class, 0);
262*795d594fSAndroid Build Coastguard Worker   }
263*795d594fSAndroid Build Coastguard Worker 
doTestPrimitiveFieldsIntegral()264*795d594fSAndroid Build Coastguard Worker   private static void doTestPrimitiveFieldsIntegral() {
265*795d594fSAndroid Build Coastguard Worker     System.out.println("doTestPrimitiveFieldsIntegral");
266*795d594fSAndroid Build Coastguard Worker     IntObject intObject = new IntObject();
267*795d594fSAndroid Build Coastguard Worker     setTag(intObject, 10000);
268*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveFields(10000));
269*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(intObject));
270*795d594fSAndroid Build Coastguard Worker   }
271*795d594fSAndroid Build Coastguard Worker 
doTestPrimitiveFieldsFloat()272*795d594fSAndroid Build Coastguard Worker   private static void doTestPrimitiveFieldsFloat() {
273*795d594fSAndroid Build Coastguard Worker     System.out.println("doTestPrimitiveFieldsFloat");
274*795d594fSAndroid Build Coastguard Worker     FloatObject floatObject = new FloatObject();
275*795d594fSAndroid Build Coastguard Worker     setTag(floatObject, 10000);
276*795d594fSAndroid Build Coastguard Worker     System.out.println(iterateThroughHeapPrimitiveFields(10000));
277*795d594fSAndroid Build Coastguard Worker     System.out.println(getTag(floatObject));
278*795d594fSAndroid Build Coastguard Worker   }
279*795d594fSAndroid Build Coastguard Worker 
280*795d594fSAndroid Build Coastguard Worker   static class A {
281*795d594fSAndroid Build Coastguard Worker   }
282*795d594fSAndroid Build Coastguard Worker 
283*795d594fSAndroid Build Coastguard Worker   static class B {
284*795d594fSAndroid Build Coastguard Worker   }
285*795d594fSAndroid Build Coastguard Worker 
286*795d594fSAndroid Build Coastguard Worker   static class C {
287*795d594fSAndroid Build Coastguard Worker   }
288*795d594fSAndroid Build Coastguard Worker 
289*795d594fSAndroid Build Coastguard Worker   static class HeapElem implements Comparable<HeapElem> {
290*795d594fSAndroid Build Coastguard Worker     long classTag;
291*795d594fSAndroid Build Coastguard Worker     long size;
292*795d594fSAndroid Build Coastguard Worker     long tag;
293*795d594fSAndroid Build Coastguard Worker     int length;
294*795d594fSAndroid Build Coastguard Worker 
compareTo(HeapElem other)295*795d594fSAndroid Build Coastguard Worker     public int compareTo(HeapElem other) {
296*795d594fSAndroid Build Coastguard Worker       if (tag != other.tag) {
297*795d594fSAndroid Build Coastguard Worker         return Long.compare(tag, other.tag);
298*795d594fSAndroid Build Coastguard Worker       }
299*795d594fSAndroid Build Coastguard Worker       if (classTag != other.classTag) {
300*795d594fSAndroid Build Coastguard Worker         return Long.compare(classTag, other.classTag);
301*795d594fSAndroid Build Coastguard Worker       }
302*795d594fSAndroid Build Coastguard Worker       if (size != other.size) {
303*795d594fSAndroid Build Coastguard Worker         return Long.compare(size, other.size);
304*795d594fSAndroid Build Coastguard Worker       }
305*795d594fSAndroid Build Coastguard Worker       return Integer.compare(length, other.length);
306*795d594fSAndroid Build Coastguard Worker     }
307*795d594fSAndroid Build Coastguard Worker 
toString()308*795d594fSAndroid Build Coastguard Worker     public String toString() {
309*795d594fSAndroid Build Coastguard Worker       return "{tag=" + tag + ", class-tag=" + classTag + ", size=" +
310*795d594fSAndroid Build Coastguard Worker           (tag >= 100 ? "<class>" : size)  // Class size is dependent on 32-bit vs 64-bit,
311*795d594fSAndroid Build Coastguard Worker                                            // so strip it.
312*795d594fSAndroid Build Coastguard Worker           + ", length=" + length + "}";
313*795d594fSAndroid Build Coastguard Worker     }
314*795d594fSAndroid Build Coastguard Worker   }
315*795d594fSAndroid Build Coastguard Worker 
sort(int n, long classTags[], long sizes[], long tags[], int lengths[])316*795d594fSAndroid Build Coastguard Worker   private static ArrayList<HeapElem> sort(int n, long classTags[], long sizes[], long tags[],
317*795d594fSAndroid Build Coastguard Worker       int lengths[]) {
318*795d594fSAndroid Build Coastguard Worker     ArrayList<HeapElem> ret = new ArrayList<HeapElem>(n);
319*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; i++) {
320*795d594fSAndroid Build Coastguard Worker       HeapElem elem = new HeapElem();
321*795d594fSAndroid Build Coastguard Worker       elem.classTag = classTags[i];
322*795d594fSAndroid Build Coastguard Worker       elem.size = sizes[i];
323*795d594fSAndroid Build Coastguard Worker       elem.tag = tags[i];
324*795d594fSAndroid Build Coastguard Worker       elem.length = lengths[i];
325*795d594fSAndroid Build Coastguard Worker       ret.add(elem);
326*795d594fSAndroid Build Coastguard Worker     }
327*795d594fSAndroid Build Coastguard Worker     Collections.sort(ret);
328*795d594fSAndroid Build Coastguard Worker     return ret;
329*795d594fSAndroid Build Coastguard Worker   }
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker   private static interface Inf1 {
332*795d594fSAndroid Build Coastguard Worker     public final static int A = 1;
333*795d594fSAndroid Build Coastguard Worker   }
334*795d594fSAndroid Build Coastguard Worker 
335*795d594fSAndroid Build Coastguard Worker   private static interface Inf2 extends Inf1 {
336*795d594fSAndroid Build Coastguard Worker     public final static int B = 1;
337*795d594fSAndroid Build Coastguard Worker   }
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker   private static class IntObject implements Inf1 {
340*795d594fSAndroid Build Coastguard Worker     byte b = (byte)1;
341*795d594fSAndroid Build Coastguard Worker     char c= 'a';
342*795d594fSAndroid Build Coastguard Worker     short s = (short)2;
343*795d594fSAndroid Build Coastguard Worker     int i = 3;
344*795d594fSAndroid Build Coastguard Worker     long l = 4;
345*795d594fSAndroid Build Coastguard Worker     Object o = new Object();
346*795d594fSAndroid Build Coastguard Worker     static int sI = 5;
347*795d594fSAndroid Build Coastguard Worker   }
348*795d594fSAndroid Build Coastguard Worker 
349*795d594fSAndroid Build Coastguard Worker   private static class FloatObject extends IntObject implements Inf2 {
350*795d594fSAndroid Build Coastguard Worker     float f = 1.23f;
351*795d594fSAndroid Build Coastguard Worker     double d = 1.23;
352*795d594fSAndroid Build Coastguard Worker     Object p = new Object();
353*795d594fSAndroid Build Coastguard Worker     static int sI = 6;
354*795d594fSAndroid Build Coastguard Worker   }
355*795d594fSAndroid Build Coastguard Worker 
356*795d594fSAndroid Build Coastguard Worker   private final static int HEAP_FILTER_OUT_TAGGED = 0x4;
357*795d594fSAndroid Build Coastguard Worker   private final static int HEAP_FILTER_OUT_UNTAGGED = 0x8;
358*795d594fSAndroid Build Coastguard Worker   private final static int HEAP_FILTER_OUT_CLASS_TAGGED = 0x10;
359*795d594fSAndroid Build Coastguard Worker   private final static int HEAP_FILTER_OUT_CLASS_UNTAGGED = 0x20;
360*795d594fSAndroid Build Coastguard Worker 
setTag(Object o, long tag)361*795d594fSAndroid Build Coastguard Worker   private static void setTag(Object o, long tag) {
362*795d594fSAndroid Build Coastguard Worker     Main.setTag(o, tag);
363*795d594fSAndroid Build Coastguard Worker   }
getTag(Object o)364*795d594fSAndroid Build Coastguard Worker   private static long getTag(Object o) {
365*795d594fSAndroid Build Coastguard Worker     return Main.getTag(o);
366*795d594fSAndroid Build Coastguard Worker   }
367*795d594fSAndroid Build Coastguard Worker 
iterateOverInstancesCount(Class<?> klass)368*795d594fSAndroid Build Coastguard Worker   private static native int iterateOverInstancesCount(Class<?> klass);
369*795d594fSAndroid Build Coastguard Worker 
checkInitialized(Class<?> klass)370*795d594fSAndroid Build Coastguard Worker   private static native boolean checkInitialized(Class<?> klass);
iterateThroughHeapCount(int heapFilter, Class<?> klassFilter, int stopAfter)371*795d594fSAndroid Build Coastguard Worker   private static native int iterateThroughHeapCount(int heapFilter,
372*795d594fSAndroid Build Coastguard Worker       Class<?> klassFilter, int stopAfter);
iterateThroughHeapData(int heapFilter, Class<?> klassFilter, long classTags[], long sizes[], long tags[], int lengths[])373*795d594fSAndroid Build Coastguard Worker   private static native int iterateThroughHeapData(int heapFilter,
374*795d594fSAndroid Build Coastguard Worker       Class<?> klassFilter, long classTags[], long sizes[], long tags[], int lengths[]);
iterateThroughHeapAdd(int heapFilter, Class<?> klassFilter)375*795d594fSAndroid Build Coastguard Worker   private static native int iterateThroughHeapAdd(int heapFilter,
376*795d594fSAndroid Build Coastguard Worker       Class<?> klassFilter);
iterateThroughHeapString(long tag)377*795d594fSAndroid Build Coastguard Worker   private static native String iterateThroughHeapString(long tag);
iterateThroughHeapPrimitiveArray(long tag)378*795d594fSAndroid Build Coastguard Worker   private static native String iterateThroughHeapPrimitiveArray(long tag);
iterateThroughHeapPrimitiveFields(long tag)379*795d594fSAndroid Build Coastguard Worker   private static native String iterateThroughHeapPrimitiveFields(long tag);
380*795d594fSAndroid Build Coastguard Worker }
381