1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 Google Inc.
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.hit;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayInputStream;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.DataInputStream;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashSet;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Set;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class ClassObj extends Instance implements Comparable<ClassObj> {
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String mClassName;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    long mSuperclassId;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String[] mFieldNames;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int[] mFieldTypes;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String[] mStaticFieldNames;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int[] mStaticFieldTypes;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    byte[] mStaticFieldValues;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayList<Instance> mInstances = new ArrayList<Instance>();
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Set<ClassObj> mSubclasses = new HashSet<ClassObj>();
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int mSize;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ClassObj(long id, StackTrace stack, String className) {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mId = id;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mStack = stack;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mClassName = className;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void resolveReferences(State state) {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteArrayInputStream bais =
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new ByteArrayInputStream(mStaticFieldValues);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DataInputStream dis = new DataInputStream(bais);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int[] types = mStaticFieldTypes;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final int N = types.length;
54de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Spin through the list of static fields, find all object references,
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * and list ourselves as a reference holder.  Also add them to
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * the list of root objects.
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < N; i++) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int type = types[i];
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int size = Types.getTypeSize(type);
64de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (type == Types.OBJECT) {
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    long id;
67de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (size == 4) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        id = dis.readInt();
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        id = dis.readLong();
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
73de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    RootObj root = new RootObj(RootType.JAVA_STATIC, id);
75de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (id == 0) {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        root.mComment = String.format(
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            "Static field %s:%s null",
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                mClassName,
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                mStaticFieldNames[i]);
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Instance instance = state.findReference(id);
83de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        instance.addParent(this);
85de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        root.mComment = String.format(
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            "Static field %s:%s %s [%s] 0x%08x",
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                mClassName,
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                mStaticFieldNames[i],
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                instance.getTypeName(),
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                instance.mHeap.mName,
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                id);
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    mHeap.addRoot(root);
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    dis.skipBytes(size);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            e.printStackTrace();
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.exit(1);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //  Lastly, add ourself as a subclass of our superclass
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (mSuperclassId != 0) {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ClassObj superclass = state.findClass(mSuperclassId);
108de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            superclass.addSubclass(this);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void addSubclass(ClassObj subclass) {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mSubclasses.add(subclass);
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void dumpSubclasses() {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (ClassObj subclass: mSubclasses) {
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println("     " + subclass.mClassName);
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final String toString() {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return mClassName.replace('/', '.');
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void addInstance(Instance instance) {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mInstances.add(instance);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void setSuperclassId(long id) {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mSuperclassId = id;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void setFieldNames(String[] names) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mFieldNames = names;
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
138de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void setFieldTypes(int[] types) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mFieldTypes = types;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void setStaticFieldNames(String[] names) {
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mStaticFieldNames = names;
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
146de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void setStaticFieldTypes(int[] types) {
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mStaticFieldTypes = types;
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
150de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void setStaticFieldValues(byte[] values) {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mStaticFieldValues = values;
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void dump() {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("+----------  ClassObj dump for: " + mClassName);
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("+-----  Static fields");
159de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < mStaticFieldNames.length; i++) {
161de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro            System.out.println(mStaticFieldNames[i] + ": "
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                + mStaticFieldTypes[i]);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.out.println("+-----  Instance fields");
166de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < mFieldNames.length; i++) {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println(mFieldNames[i] + ": " + mFieldTypes[i]);
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final String getTypeName() {
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "class " + mClassName;
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void visit(Set<Instance> resultSet, Filter filter) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (resultSet.contains(this)) {
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
182de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (filter != null) {
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (filter.accept(this)) {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                resultSet.add(this);
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            resultSet.add(this);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
190de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteArrayInputStream bais =
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new ByteArrayInputStream(mStaticFieldValues);
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DataInputStream dis = new DataInputStream(bais);
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int[] types = mStaticFieldTypes;
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final int N = types.length;
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        State state = mHeap.mState;
197de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Spin through the list of static fields, find all object references,
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * and visit them.
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < N; i++) {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int type = types[i];
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int size = Types.getTypeSize(type);
206de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (type == Types.OBJECT) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    long id;
209de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (size == 4) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        id = dis.readInt();
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        id = dis.readLong();
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
215de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Instance instance = state.findReference(id);
217de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (instance != null) {
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        instance.visit(resultSet, filter);
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    dis.skipBytes(size);
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            e.printStackTrace();
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int compareTo(ClassObj o) {
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return mClassName.compareTo(o.mClassName);
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean equals(Object o) {
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (! (o instanceof ClassObj)) {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
238de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0 == compareTo((ClassObj) o);
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
242