1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 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.dx.dex.file; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilsonimport com.android.dex.SizeOf; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotations; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.AnnotationsList; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.AccessFlags; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstArray; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstFieldRef; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstMethodRef; 27333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.StdTypeList; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeList; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Writers; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.PrintWriter; 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Writer; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Representation of a Dalvik class, which is basically a set of 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * members (fields or methods) along with a few more pieces of 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * information. 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class ClassDefItem extends IndexedItem { 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} type constant for this class */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final CstType thisClass; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** access flags */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final int accessFlags; 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 5299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} superclass or {@code null} if this class is a/the 53de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * root class 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final CstType superclass; 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code null-ok;} list of implemented interfaces */ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private TypeListItem interfaces; 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code null-ok;} source file name or {@code null} if unknown */ 61333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson private final CstString sourceFile; 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} associated class data object */ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final ClassDataItem classData; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} item wrapper for the static values, initialized 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in {@link #addContents} 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private EncodedArrayItem staticValuesItem; 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} annotations directory */ 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private AnnotationsDirectoryItem annotationsDirectory; 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. Its sets of members and annotations are 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * initially empty. 78de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 7999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param thisClass {@code non-null;} type constant for this class 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param accessFlags access flags 8199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param superclass {@code null-ok;} superclass or {@code null} if 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this class is a/the root class 8399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param interfaces {@code non-null;} list of implemented interfaces 8499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param sourceFile {@code null-ok;} source file name or 8599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null} if unknown 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ClassDefItem(CstType thisClass, int accessFlags, 88333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson CstType superclass, TypeList interfaces, CstString sourceFile) { 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (thisClass == null) { 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("thisClass == null"); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: Maybe check accessFlags and superclass, at 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * least for easily-checked stuff? 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (interfaces == null) { 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("interfaces == null"); 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.thisClass = thisClass; 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.accessFlags = accessFlags; 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.superclass = superclass; 105de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro this.interfaces = 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (interfaces.size() == 0) ? null : new TypeListItem(interfaces); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.sourceFile = sourceFile; 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.classData = new ClassDataItem(thisClass); 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.staticValuesItem = null; 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.annotationsDirectory = new AnnotationsDirectoryItem(); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ItemType itemType() { 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ItemType.TYPE_CLASS_DEF_ITEM; 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int writeSize() { 122081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson return SizeOf.CLASS_DEF_ITEM; 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addContents(DexFile file) { 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project TypeIdsSection typeIds = file.getTypeIds(); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MixedItemSection byteData = file.getByteData(); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MixedItemSection wordData = file.getWordData(); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MixedItemSection typeLists = file.getTypeLists(); 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringIdsSection stringIds = file.getStringIds(); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project typeIds.intern(thisClass); 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!classData.isEmpty()) { 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MixedItemSection classDataSection = file.getClassData(); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classDataSection.add(classData); 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstArray staticValues = classData.getStaticValuesConstant(); 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (staticValues != null) { 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project staticValuesItem = 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byteData.intern(new EncodedArrayItem(staticValues)); 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (superclass != null) { 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project typeIds.intern(superclass); 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (interfaces != null) { 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project interfaces = typeLists.intern(interfaces); 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sourceFile != null) { 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stringIds.intern(sourceFile); 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (! annotationsDirectory.isEmpty()) { 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotationsDirectory.isInternable()) { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory = wordData.intern(annotationsDirectory); 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project wordData.add(annotationsDirectory); 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void writeTo(DexFile file, AnnotatedOutput out) { 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean annotates = out.annotates(); 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project TypeIdsSection typeIds = file.getTypeIds(); 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int classIdx = typeIds.indexOf(thisClass); 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int superIdx = (superclass == null) ? -1 : 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project typeIds.indexOf(superclass); 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int interOff = OffsettedItem.getAbsoluteOffsetOr0(interfaces); 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int annoOff = annotationsDirectory.isEmpty() ? 0 : 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory.getAbsoluteOffset(); 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sourceFileIdx = (sourceFile == null) ? -1 : 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project file.getStringIds().indexOf(sourceFile); 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int dataOff = classData.isEmpty()? 0 : classData.getAbsoluteOffset(); 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int staticValuesOff = 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project OffsettedItem.getAbsoluteOffsetOr0(staticValuesItem); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotates) { 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, indexString() + ' ' + thisClass.toHuman()); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " class_idx: " + Hex.u4(classIdx)); 188de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro out.annotate(4, " access_flags: " + 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AccessFlags.classString(accessFlags)); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " superclass_idx: " + Hex.u4(superIdx) + 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project " // " + ((superclass == null) ? "<none>" : 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project superclass.toHuman())); 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " interfaces_off: " + Hex.u4(interOff)); 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (interOff != 0) { 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project TypeList list = interfaces.getList(); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = list.size(); 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, " " + list.getType(i).toHuman()); 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " source_file_idx: " + Hex.u4(sourceFileIdx) + 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project " // " + ((sourceFile == null) ? "<none>" : 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sourceFile.toHuman())); 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " annotations_off: " + Hex.u4(annoOff)); 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " class_data_off: " + Hex.u4(dataOff)); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(4, " static_values_off: " + 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Hex.u4(staticValuesOff)); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(classIdx); 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(accessFlags); 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(superIdx); 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(interOff); 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(sourceFileIdx); 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(annoOff); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(dataOff); 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.writeInt(staticValuesOff); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the constant corresponding to this class. 222de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 22399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the constant 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CstType getThisClass() { 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return thisClass; 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the access flags. 231de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the access flags 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getAccessFlags() { 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return accessFlags; 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the superclass. 240de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 24199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the superclass or {@code null} if 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this class is a/the root class 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CstType getSuperclass() { 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return superclass; 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the list of interfaces implemented. 250de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 25199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the interfaces list 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public TypeList getInterfaces() { 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (interfaces == null) { 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return StdTypeList.EMPTY; 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return interfaces.getList(); 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the source file name. 263de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 26499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the source file name or {@code null} if unknown 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 266333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public CstString getSourceFile() { 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sourceFile; 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds a static field. 272de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 27399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param field {@code non-null;} the field to add 27499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param value {@code null-ok;} initial value for the field, if any 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addStaticField(EncodedField field, Constant value) { 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classData.addStaticField(field, value); 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds an instance field. 282de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 28399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param field {@code non-null;} the field to add 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addInstanceField(EncodedField field) { 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classData.addInstanceField(field); 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 29099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Adds a direct ({@code static} and/or {@code private}) method. 291de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 29299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method to add 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addDirectMethod(EncodedMethod method) { 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classData.addDirectMethod(method); 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds a virtual method. 300de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 30199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method to add 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addVirtualMethod(EncodedMethod method) { 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classData.addVirtualMethod(method); 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets all the methods in this class. The returned list is not linked 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in any way to the underlying lists contained in this instance, but 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the objects contained in the list are shared. 311de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 31299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} list of all methods 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ArrayList<EncodedMethod> getMethods() { 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return classData.getMethods(); 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the direct annotations on this class. These are annotations 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * made on the class, per se, as opposed to on one of its members. 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It is only valid to call this method at most once per instance. 322de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 32399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param annotations {@code non-null;} annotations to set for this class 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setClassAnnotations(Annotations annotations) { 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory.setClassAnnotations(annotations); 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds a field annotations item to this class. 331de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 33299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param field {@code non-null;} field in question 33399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param annotations {@code non-null;} associated annotations to add 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addFieldAnnotations(CstFieldRef field, 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations annotations) { 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory.addFieldAnnotations(field, annotations); 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds a method annotations item to this class. 342de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 34399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} method in question 34499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param annotations {@code non-null;} associated annotations to add 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addMethodAnnotations(CstMethodRef method, 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations annotations) { 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory.addMethodAnnotations(method, annotations); 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds a parameter annotations item to this class. 353de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 35499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} method in question 35599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param list {@code non-null;} associated list of annotation sets to add 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addParameterAnnotations(CstMethodRef method, 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AnnotationsList list) { 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory.addParameterAnnotations(method, list); 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the method annotations for a given method, if any. This is 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * meant for use by debugging / dumping code. 365de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 36699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method 36799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the method annotations, if any 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Annotations getMethodAnnotations(CstMethodRef method) { 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return annotationsDirectory.getMethodAnnotations(method); 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the parameter annotations for a given method, if any. This is 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * meant for use by debugging / dumping code. 376de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 37799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method 37899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the parameter annotations, if any 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public AnnotationsList getParameterAnnotations(CstMethodRef method) { 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return annotationsDirectory.getParameterAnnotations(method); 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 383de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prints out the contents of this instance, in a debugging-friendly 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * way. 387de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 38899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to output to 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param verbose whether to be verbose with the output 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void debugPrint(Writer out, boolean verbose) { 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project PrintWriter pw = Writers.printWriterFor(out); 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pw.println(getClass().getName() + " {"); 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pw.println(" accessFlags: " + Hex.u2(accessFlags)); 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pw.println(" superclass: " + superclass); 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pw.println(" interfaces: " + 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((interfaces == null) ? "<none>" : interfaces)); 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pw.println(" sourceFile: " + 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((sourceFile == null) ? "<none>" : sourceFile.toQuoted())); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classData.debugPrint(out, verbose); 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotationsDirectory.debugPrint(pw); 404de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pw.println("}"); 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 408