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