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