DexBackedClassDef.java revision 36e2ee200517b36652a6e8fe1c5aa24ce249765e
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 Gruverimport org.jf.dexlib2.iface.Method;
38be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
39be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport javax.annotation.Nonnull;
40be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport javax.annotation.Nullable;
41be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverimport java.util.List;
42be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
43be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruverpublic class DexBackedClassDef implements ClassDef {
4436e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver    @Nonnull public final DexBuffer dexBuf;
45be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
46be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nonnull public final String name;
47be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    public final int accessFlags;
48be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nullable public final String superclass;
49be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nullable public final String sourceFile;
50be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
51be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nonnull private final AnnotationsDirectory annotationsDirectory;
52be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private final int staticInitialValuesOffset;
53be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
54be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private final int interfacesOffset;
55be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private final int classDataOffset;
56be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
57be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    //class_def_item offsets
58be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int ACCESS_FLAGS_OFFSET = 4;
59be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int SUPERCLASS_OFFSET = 8;
60be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int INTERFACES_OFFSET = 12;
61be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int SOURCE_FILE_OFFSET = 16;
62be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int ANNOTATIONS_OFFSET = 20;
63be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int CLASS_DATA_OFFSET = 24;
64be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    private static final int STATIC_INITIAL_VALUES_OFFSET = 28;
65be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
6636e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver    public DexBackedClassDef(@Nonnull DexBuffer dexBuf,
67be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                             int classDefOffset) {
6836e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.dexBuf = dexBuf;
69be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
7036e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.name = dexBuf.getType(dexBuf.readSmallUint(classDefOffset));
7136e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.accessFlags = dexBuf.readSmallUint(classDefOffset + ACCESS_FLAGS_OFFSET);
7236e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.superclass = dexBuf.getOptionalString(dexBuf.readSmallUint(classDefOffset + SUPERCLASS_OFFSET));
7336e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.interfacesOffset = dexBuf.readSmallUint(classDefOffset + INTERFACES_OFFSET);
7436e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.sourceFile = dexBuf.getOptionalString(dexBuf.readSmallUint(classDefOffset + SOURCE_FILE_OFFSET));
75be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
7636e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        int annotationsDirectoryOffset = dexBuf.readSmallUint(classDefOffset + ANNOTATIONS_OFFSET);
7736e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.annotationsDirectory = AnnotationsDirectory.newOrEmpty(dexBuf, annotationsDirectoryOffset);
78be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
7936e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.classDataOffset = dexBuf.readSmallUint(CLASS_DATA_OFFSET);
8036e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver        this.staticInitialValuesOffset = dexBuf.readSmallUint(classDefOffset + STATIC_INITIAL_VALUES_OFFSET);
81be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    }
82be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
83be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
84be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nonnull @Override public String getName() { return name; }
85be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Override public int getAccessFlags() { return accessFlags; }
86be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nullable @Override public String getSuperclass() { return superclass; }
87be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nullable @Override public String getSourceFile() { return sourceFile; }
88be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
89be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nonnull
90be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Override
91be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    public List<String> getInterfaces() {
92be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver        if (interfacesOffset > 0) {
9336e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver            final int size = dexBuf.readSmallUint(interfacesOffset);
94be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver            return new FixedSizeList<String>() {
95be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                @Override
96be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                public String readItem(int index) {
9736e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                    return dexBuf.getString(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);
117be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver            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
13936e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                            protected DexBackedField readItem(DexReader reader, int index) {
140be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                                DexBackedField item = new DexBackedField(reader, previousFieldIndex,
141be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                                        staticInitialValueIterator, annotationIterator);
142be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                                previousFieldIndex = item.fieldIndex;
143be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                                return item;
144be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                            }
145be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
146be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                            @Override
14736e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                            protected void skipItem(DexReader reader, int index) {
148be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                                previousFieldIndex = DexBackedField.skipEncodedField(reader, previousFieldIndex);
149be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                                staticInitialValueIterator.skipNext();
150be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                            }
151be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                        };
152be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                    }
153be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
154be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                    @Override public int size() { return fieldCount; }
155be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver                };
156be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver            }
157be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver        }
158be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver        return ImmutableList.of();
159be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    }
160be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver
161be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Nonnull
162be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    @Override
163be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    public List<? extends Method> getMethods() {
16463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver        if (classDataOffset > 0) {
16536e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver            DexReader reader = dexBuf.readerAt(classDataOffset);
16663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            int staticFieldCount = reader.readSmallUleb128();
16763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            int instanceFieldCount = reader.readSmallUleb128();
16863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            int directMethodCount = reader.readSmallUleb128();
16963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            int virtualMethodCount = reader.readSmallUleb128();
17063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            final int methodCount = directMethodCount + virtualMethodCount;
17163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            if (methodCount > 0) {
17263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                DexBackedField.skipAllFields(reader, staticFieldCount + instanceFieldCount);
17363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver
17463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                final int methodsStartOffset = reader.getOffset();
17563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver
17663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                return new VariableSizeListWithContext<DexBackedMethod>() {
17763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                    @Nonnull
17863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                    @Override
17963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                    public Iterator listIterator() {
18036e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                        return new Iterator(dexBuf, methodsStartOffset) {
18163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            private int previousMethodIndex = 0;
18263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            @Nonnull private final AnnotationsDirectory.AnnotationIterator methodAnnotationIterator =
18363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                    annotationsDirectory.getMethodAnnotationIterator();
18463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            @Nonnull private final AnnotationsDirectory.AnnotationIterator parameterAnnotationIterator =
18563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                    annotationsDirectory.getParameterAnnotationIterator();
18663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            @Nonnull private final StaticInitialValueIterator staticInitialValueIterator =
18736e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                                    StaticInitialValueIterator.newOrEmpty(dexBuf, staticInitialValuesOffset);
18863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver
18963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            @Nonnull
19063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            @Override
19136e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                            protected DexBackedMethod readItem(DexReader reader, int index) {
19263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                DexBackedMethod item = new DexBackedMethod(reader, previousMethodIndex,
19363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                        methodAnnotationIterator, parameterAnnotationIterator);
19463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                previousMethodIndex = item.methodIndex;
19563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                return item;
19663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            }
19763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver
19863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            @Override
19936e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver                            protected void skipItem(DexReader reader, int index) {
20063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                previousMethodIndex = DexBackedMethod.skipEncodedMethod(reader, previousMethodIndex);
20163d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                                staticInitialValueIterator.skipNext();
20263d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                            }
20363d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                        };
20463d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                    }
20563d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver
20663d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                    @Override public int size() { return methodCount; }
20763d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver                };
20863d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver            }
20963d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver        }
21063d840670311d96aa92c38f1d118ab2d7f590ce3Ben Gruver        return ImmutableList.of();
211be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver    }
212be799799ff8bbc5d86f8cfdc850947ab4f41695fBen Gruver}
213