DexBackedClassDef.java revision 87179940cbe7b0570f2fbdd9bc0b218e3535bcf7
1be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver/* 2be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * Copyright 2012, Google Inc. 3be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * All rights reserved. 4be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * 5be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * Redistribution and use in source and binary forms, with or without 6be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * modification, are permitted provided that the following conditions are 7be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * met: 8be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * 9be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * * Redistributions of source code must retain the above copyright 10be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * notice, this list of conditions and the following disclaimer. 11be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * * Redistributions in binary form must reproduce the above 12be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * copyright notice, this list of conditions and the following disclaimer 13be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * in the documentation and/or other materials provided with the 14be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * distribution. 15be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * * Neither the name of Google Inc. nor the names of its 16be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * contributors may be used to endorse or promote products derived from 17be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * this software without specific prior written permission. 18be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * 19be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver */ 31be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 32be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverpackage org.jf.dexlib2.dexbacked; 33be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 34be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport com.google.common.collect.ImmutableList; 35be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport org.jf.dexlib2.dexbacked.util.*; 36be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport org.jf.dexlib2.iface.ClassDef; 37be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 38be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport javax.annotation.Nonnull; 39be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport javax.annotation.Nullable; 40be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport java.util.List; 41be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 42be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverpublic class DexBackedClassDef implements ClassDef { 4336e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver @Nonnull public final DexBuffer dexBuf; 44be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 45be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull public final String name; 46be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver public final int accessFlags; 47be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nullable public final String superclass; 48be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nullable public final String sourceFile; 49be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 50be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull private final AnnotationsDirectory annotationsDirectory; 51be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private final int staticInitialValuesOffset; 52be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 53be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private final int interfacesOffset; 54be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private final int classDataOffset; 55be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 56be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver //class_def_item offsets 57be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int ACCESS_FLAGS_OFFSET = 4; 58be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int SUPERCLASS_OFFSET = 8; 59be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int INTERFACES_OFFSET = 12; 60be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int SOURCE_FILE_OFFSET = 16; 61be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int ANNOTATIONS_OFFSET = 20; 62be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int CLASS_DATA_OFFSET = 24; 63be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private static final int STATIC_INITIAL_VALUES_OFFSET = 28; 64be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 6536e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver public DexBackedClassDef(@Nonnull DexBuffer dexBuf, 66be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver int classDefOffset) { 6736e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.dexBuf = dexBuf; 68be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 6936e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.name = dexBuf.getType(dexBuf.readSmallUint(classDefOffset)); 7036e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.accessFlags = dexBuf.readSmallUint(classDefOffset + ACCESS_FLAGS_OFFSET); 712e34c4499c1bb971ed5c5545f984ec1a0a080eb3Ben Gruver this.superclass = dexBuf.getOptionalType(dexBuf.readOptionalUint(classDefOffset + SUPERCLASS_OFFSET)); 7236e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.interfacesOffset = dexBuf.readSmallUint(classDefOffset + INTERFACES_OFFSET); 7390a1ffeda1ae9a4d3d5801aa4389cf2a559a46f2Ben Gruver this.sourceFile = dexBuf.getOptionalString(dexBuf.readOptionalUint(classDefOffset + SOURCE_FILE_OFFSET)); 74be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 7536e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver int annotationsDirectoryOffset = dexBuf.readSmallUint(classDefOffset + ANNOTATIONS_OFFSET); 7636e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.annotationsDirectory = AnnotationsDirectory.newOrEmpty(dexBuf, annotationsDirectoryOffset); 77be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 780f7b4c40f446889066e77e707a1f1033af87e6c6Ben Gruver this.classDataOffset = dexBuf.readSmallUint(classDefOffset + CLASS_DATA_OFFSET); 7936e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.staticInitialValuesOffset = dexBuf.readSmallUint(classDefOffset + STATIC_INITIAL_VALUES_OFFSET); 80be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 81be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 82be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 83be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull @Override public String getName() { return name; } 84be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override public int getAccessFlags() { return accessFlags; } 85be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nullable @Override public String getSuperclass() { return superclass; } 86be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nullable @Override public String getSourceFile() { return sourceFile; } 87be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 88be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull 89be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 90be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver public List<String> getInterfaces() { 91be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver if (interfacesOffset > 0) { 9236e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver final int size = dexBuf.readSmallUint(interfacesOffset); 93be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver return new FixedSizeList<String>() { 9425d385a441b95d56987c81f00f19297d799e1b31Ben Gruver @Nonnull 95be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 96be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver public String readItem(int index) { 972e34c4499c1bb971ed5c5545f984ec1a0a080eb3Ben Gruver return dexBuf.getType(dexBuf.readSmallUint(interfacesOffset + 4 + (2*index))); 98be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 99be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 100be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override public int size() { return size; } 101be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver }; 102be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 103be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver return ImmutableList.of(); 104be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 105be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 106be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull 107be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 108be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver public List<? extends DexBackedAnnotation> getAnnotations() { 109be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver return annotationsDirectory.getClassAnnotations(); 110be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 111be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 112be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull 113be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 114be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver public List<? extends DexBackedField> getFields() { 115be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver if (classDataOffset != 0) { 11636e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver DexReader reader = dexBuf.readerAt(classDataOffset); 11787179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver final int staticFieldCount = reader.readSmallUleb128(); 118be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver int instanceFieldCount = reader.readSmallUleb128(); 119be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver final int fieldCount = staticFieldCount + instanceFieldCount; 120be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver if (fieldCount > 0) { 121be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver reader.skipUleb128(); //direct_methods_size 122be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver reader.skipUleb128(); //virtual_methods_size 123be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 124be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver final int fieldsStartOffset = reader.getOffset(); 125be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 126be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver return new VariableSizeListWithContext<DexBackedField>() { 127be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull 128be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 129be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver public Iterator listIterator() { 13036e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver return new Iterator(dexBuf, fieldsStartOffset) { 131be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver private int previousFieldIndex = 0; 132be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull private final AnnotationsDirectory.AnnotationIterator annotationIterator = 133be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver annotationsDirectory.getFieldAnnotationIterator(); 134be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull private final StaticInitialValueIterator staticInitialValueIterator = 13536e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver StaticInitialValueIterator.newOrEmpty(dexBuf, staticInitialValuesOffset); 136be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 137be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull 138be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 13925d385a441b95d56987c81f00f19297d799e1b31Ben Gruver protected DexBackedField readItem(@Nonnull DexReader reader, int index) { 14087179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver if (index == staticFieldCount) { 14187179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // We reached the end of the static field, restart the numbering for 14287179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // instance fields 14387179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver previousFieldIndex = 0; 14487179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver } 145be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver DexBackedField item = new DexBackedField(reader, previousFieldIndex, 146be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver staticInitialValueIterator, annotationIterator); 147be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver previousFieldIndex = item.fieldIndex; 148be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver return item; 149be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 150be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 151be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 15225d385a441b95d56987c81f00f19297d799e1b31Ben Gruver protected void skipItem(@Nonnull DexReader reader, int index) { 15387179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver if (index == staticFieldCount) { 15487179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // We reached the end of the static field, restart the numbering for 15587179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // instance fields 15687179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver previousFieldIndex = 0; 15787179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver } 158be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver previousFieldIndex = DexBackedField.skipEncodedField(reader, previousFieldIndex); 159be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver staticInitialValueIterator.skipNext(); 160be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 161be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver }; 162be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 163be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 164be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override public int size() { return fieldCount; } 165be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver }; 166be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 167be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 168be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver return ImmutableList.of(); 169be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 170be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver 171be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Nonnull 172be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver @Override 1733f2861b47702ee56a8f3dbcd2feedbdfd31789b2Ben Gruver public List<? extends DexBackedMethod> getMethods() { 17463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver if (classDataOffset > 0) { 17536e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver DexReader reader = dexBuf.readerAt(classDataOffset); 17663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver int staticFieldCount = reader.readSmallUleb128(); 17763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver int instanceFieldCount = reader.readSmallUleb128(); 17887179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver final int directMethodCount = reader.readSmallUleb128(); 17963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver int virtualMethodCount = reader.readSmallUleb128(); 18063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver final int methodCount = directMethodCount + virtualMethodCount; 18163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver if (methodCount > 0) { 18263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver DexBackedField.skipAllFields(reader, staticFieldCount + instanceFieldCount); 18363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver 18463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver final int methodsStartOffset = reader.getOffset(); 18563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver 18663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver return new VariableSizeListWithContext<DexBackedMethod>() { 18763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Nonnull 18863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Override 18963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver public Iterator listIterator() { 19036e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver return new Iterator(dexBuf, methodsStartOffset) { 19163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver private int previousMethodIndex = 0; 19263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Nonnull private final AnnotationsDirectory.AnnotationIterator methodAnnotationIterator = 19363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver annotationsDirectory.getMethodAnnotationIterator(); 19463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Nonnull private final AnnotationsDirectory.AnnotationIterator parameterAnnotationIterator = 19563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver annotationsDirectory.getParameterAnnotationIterator(); 19663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver 19763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Nonnull 19863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Override 19925d385a441b95d56987c81f00f19297d799e1b31Ben Gruver protected DexBackedMethod readItem(@Nonnull DexReader reader, int index) { 20087179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver if (index == directMethodCount) { 20187179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // We reached the end of the direct methods, restart the numbering for 20287179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // virtual methods 20387179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver previousMethodIndex = 0; 20487179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver } 20563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver DexBackedMethod item = new DexBackedMethod(reader, previousMethodIndex, 20663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver methodAnnotationIterator, parameterAnnotationIterator); 20763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver previousMethodIndex = item.methodIndex; 20863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver return item; 20963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver } 21063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver 21163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Override 21225d385a441b95d56987c81f00f19297d799e1b31Ben Gruver protected void skipItem(@Nonnull DexReader reader, int index) { 21387179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver if (index == directMethodCount) { 21487179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // We reached the end of the direct methods, restart the numbering for 21587179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver // virtual methods 21687179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver previousMethodIndex = 0; 21787179940cbe7b0570f2fbdd9bc0b218e3535bcf7Ben Gruver } 21863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver previousMethodIndex = DexBackedMethod.skipEncodedMethod(reader, previousMethodIndex); 21963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver } 22063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver }; 22163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver } 22263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver 22363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver @Override public int size() { return methodCount; } 22463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver }; 22563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver } 22663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver } 22763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver return ImmutableList.of(); 228be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver } 229be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver} 230