11bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver/*
21bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Copyright 2013, Google Inc.
31bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * All rights reserved.
41bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
51bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Redistribution and use in source and binary forms, with or without
61bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * modification, are permitted provided that the following conditions are
71bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * met:
81bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
91bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Redistributions of source code must retain the above copyright
101bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * notice, this list of conditions and the following disclaimer.
111bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Redistributions in binary form must reproduce the above
121bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * copyright notice, this list of conditions and the following disclaimer
131bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * in the documentation and/or other materials provided with the
141bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * distribution.
151bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Neither the name of Google Inc. nor the names of its
161bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * contributors may be used to endorse or promote products derived from
171bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * this software without specific prior written permission.
181bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
191bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
221bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver */
311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpackage org.jf.dexlib2.writer.pool;
331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
343ff884b1c345dbd030430e3eecf37e4d409f18b0Ben Gruverimport org.jf.dexlib2.Opcodes;
351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.ValueType;
360cd8417155dcbeb9ceaf7632eeb42c6d3670e256Ben Gruverimport org.jf.dexlib2.iface.Annotation;
370cd8417155dcbeb9ceaf7632eeb42c6d3670e256Ben Gruverimport org.jf.dexlib2.iface.AnnotationElement;
380cd8417155dcbeb9ceaf7632eeb42c6d3670e256Ben Gruverimport org.jf.dexlib2.iface.ClassDef;
390cd8417155dcbeb9ceaf7632eeb42c6d3670e256Ben Gruverimport org.jf.dexlib2.iface.Field;
4042627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.iface.reference.*;
411bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.value.*;
425189797292086a051666cf8c96cf44c6a23321b6Ben Gruverimport org.jf.dexlib2.writer.*;
435280047b4261f5a6619a7a7b64e2666c06e107f6Ben Gruverimport org.jf.dexlib2.writer.io.DexDataStore;
4499b46173c5294d186ccf2e647b86346a22b247c8Ben Gruverimport org.jf.dexlib2.writer.io.FileDataStore;
451bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.util.ExceptionWithContext;
461bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
471bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport javax.annotation.Nonnull;
4899b46173c5294d186ccf2e647b86346a22b247c8Ben Gruverimport java.io.File;
491bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport java.io.IOException;
501bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport java.util.Collection;
511bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport java.util.Set;
521bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
53afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamathpublic class DexPool extends DexWriter<CharSequence, StringReference, CharSequence, TypeReference,
54afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath        MethodProtoReference, FieldReference, MethodReference, PoolClassDef,
551726f028a8382cdbc01e330009eb330a3c43b57eBen Gruver        Annotation, Set<? extends Annotation>,
56242dd62a714d5d114b35437b5f39a5b2e107dcfeBen Gruver        TypeListPool.Key<? extends Collection<? extends CharSequence>>, Field, PoolMethod,
575189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        EncodedValue, AnnotationElement, StringPool, TypePool, ProtoPool, FieldPool, MethodPool, ClassPool,
585189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        TypeListPool, AnnotationPool, AnnotationSetPool> {
591bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
6059256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    private final Markable[] sections = new Markable[] {
615189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            stringSection, typeSection, protoSection, fieldSection, methodSection, classSection, typeListSection,
625189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            annotationSection, annotationSetSection
6359256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    };
6459256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver
655189797292086a051666cf8c96cf44c6a23321b6Ben Gruver    public DexPool(Opcodes opcodes) {
665189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        super(opcodes);
671bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
681bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
695189797292086a051666cf8c96cf44c6a23321b6Ben Gruver    @Nonnull @Override protected SectionProvider getSectionProvider() {
705189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        return new DexPoolSectionProvider();
711bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
721bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
738f27f45fb1d621a6cc5ca01e1eb5cc7dc67cc994Ben Gruver    public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input)
748f27f45fb1d621a6cc5ca01e1eb5cc7dc67cc994Ben Gruver            throws IOException {
755189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        DexPool dexPool = new DexPool(input.getOpcodes());
765280047b4261f5a6619a7a7b64e2666c06e107f6Ben Gruver        for (ClassDef classDef: input.getClasses()) {
7759256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver            dexPool.internClass(classDef);
785280047b4261f5a6619a7a7b64e2666c06e107f6Ben Gruver        }
795280047b4261f5a6619a7a7b64e2666c06e107f6Ben Gruver        dexPool.writeTo(dataStore);
805280047b4261f5a6619a7a7b64e2666c06e107f6Ben Gruver    }
815280047b4261f5a6619a7a7b64e2666c06e107f6Ben Gruver
821bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
835189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        DexPool dexPool = new DexPool(input.getOpcodes());
841bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        for (ClassDef classDef: input.getClasses()) {
8559256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver            dexPool.internClass(classDef);
861bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        }
8799b46173c5294d186ccf2e647b86346a22b247c8Ben Gruver        dexPool.writeTo(new FileDataStore(new File(path)));
881bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
891bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
9037f5436932687a0baf0377eaf754a7cf919d610bBen Gruver    /**
9137f5436932687a0baf0377eaf754a7cf919d610bBen Gruver     * Interns a class into this DexPool
9237f5436932687a0baf0377eaf754a7cf919d610bBen Gruver     * @param classDef The class to intern
9337f5436932687a0baf0377eaf754a7cf919d610bBen Gruver     */
9437f5436932687a0baf0377eaf754a7cf919d610bBen Gruver    public void internClass(ClassDef classDef) {
955189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        classSection.intern(classDef);
9637f5436932687a0baf0377eaf754a7cf919d610bBen Gruver    }
9737f5436932687a0baf0377eaf754a7cf919d610bBen Gruver
9859256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    /**
9959256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     * Creates a marked state that can be returned to by calling reset()
10059256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     *
10159256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     * This is useful to rollback the last added class if it causes a method/field/type overflow
10259256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     */
10359256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    public void mark() {
10459256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver        for (Markable section: sections) {
10559256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver            section.mark();
10659256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver        }
10759256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    }
10859256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver
10959256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    /**
11059256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     * Resets to the last marked state
11159256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     *
11259256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     * This is useful to rollback the last added class if it causes a method/field/type overflow
11359256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver     */
11459256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    public void reset() {
11559256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver        for (Markable section: sections) {
11659256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver            section.reset();
11759256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver        }
11859256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver    }
11959256149f100fd06d7a5bebaa2d29a3f0847ee22Ben Gruver
1201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
1211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                                               @Nonnull EncodedValue encodedValue) throws IOException {
1221bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        switch (encodedValue.getValueType()) {
1231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.ANNOTATION:
1241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                AnnotationEncodedValue annotationEncodedValue = (AnnotationEncodedValue)encodedValue;
1251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeAnnotation(annotationEncodedValue.getType(), annotationEncodedValue.getElements());
1261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.ARRAY:
1281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                ArrayEncodedValue arrayEncodedValue = (ArrayEncodedValue)encodedValue;
1291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeArray(arrayEncodedValue.getValue());
1301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.BOOLEAN:
1321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeBoolean(((BooleanEncodedValue)encodedValue).getValue());
1331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1341bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.BYTE:
1351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeByte(((ByteEncodedValue)encodedValue).getValue());
1361bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1371bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.CHAR:
1381bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeChar(((CharEncodedValue)encodedValue).getValue());
1391bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1401bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.DOUBLE:
1411bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeDouble(((DoubleEncodedValue)encodedValue).getValue());
1421bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1431bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.ENUM:
1441bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeEnum(((EnumEncodedValue)encodedValue).getValue());
1451bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1461bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.FIELD:
1471bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeField(((FieldEncodedValue)encodedValue).getValue());
1481bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1491bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.FLOAT:
1501bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeFloat(((FloatEncodedValue)encodedValue).getValue());
1511bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1521bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.INT:
1531bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeInt(((IntEncodedValue)encodedValue).getValue());
1541bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1551bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.LONG:
1561bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeLong(((LongEncodedValue)encodedValue).getValue());
1571bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1581bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.METHOD:
1591bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeMethod(((MethodEncodedValue)encodedValue).getValue());
1601bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1611bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.NULL:
1621bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeNull();
1631bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1641bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.SHORT:
1651bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeShort(((ShortEncodedValue)encodedValue).getValue());
1661bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1671bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.STRING:
1681bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeString(((StringEncodedValue)encodedValue).getValue());
1691bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1701bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.TYPE:
1711bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                writer.writeType(((TypeEncodedValue)encodedValue).getValue());
1721bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1731bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            default:
1741bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                throw new ExceptionWithContext("Unrecognized value type: %d", encodedValue.getValueType());
1751bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        }
1761bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
1771bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
1785189797292086a051666cf8c96cf44c6a23321b6Ben Gruver    void internEncodedValue(@Nonnull EncodedValue encodedValue) {
1791bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        switch (encodedValue.getValueType()) {
1801bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.ANNOTATION:
1811bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                AnnotationEncodedValue annotationEncodedValue = (AnnotationEncodedValue)encodedValue;
1825189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                typeSection.intern(annotationEncodedValue.getType());
1831bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                for (AnnotationElement element: annotationEncodedValue.getElements()) {
1845189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                    stringSection.intern(element.getName());
1855189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                    internEncodedValue(element.getValue());
1861bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                }
1871bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1881bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.ARRAY:
1891bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                for (EncodedValue element: ((ArrayEncodedValue)encodedValue).getValue()) {
1905189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                    internEncodedValue(element);
1911bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                }
1921bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1931bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.STRING:
1945189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                stringSection.intern(((StringEncodedValue)encodedValue).getValue());
1951bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1961bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.TYPE:
1975189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                typeSection.intern(((TypeEncodedValue)encodedValue).getValue());
1981bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
1991bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.ENUM:
2005189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                fieldSection.intern(((EnumEncodedValue)encodedValue).getValue());
2011bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
2021bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.FIELD:
2035189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                fieldSection.intern(((FieldEncodedValue)encodedValue).getValue());
2041bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
2051bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            case ValueType.METHOD:
2065189797292086a051666cf8c96cf44c6a23321b6Ben Gruver                methodSection.intern(((MethodEncodedValue)encodedValue).getValue());
2071bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                break;
2081bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        }
2091bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
2105189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2115189797292086a051666cf8c96cf44c6a23321b6Ben Gruver    protected class DexPoolSectionProvider extends SectionProvider {
2125189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public StringPool getStringSection() {
2135189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new StringPool(DexPool.this);
2145189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2155189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2165189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public TypePool getTypeSection() {
2175189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new TypePool(DexPool.this);
2185189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2195189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2205189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public ProtoPool getProtoSection() {
2215189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new ProtoPool(DexPool.this);
2225189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2235189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2245189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public FieldPool getFieldSection() {
2255189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new FieldPool(DexPool.this);
2265189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2275189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2285189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public MethodPool getMethodSection() {
2295189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new MethodPool(DexPool.this);
2305189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2315189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2325189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public ClassPool getClassSection() {
2335189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new ClassPool(DexPool.this);
2345189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2355189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2365189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public TypeListPool getTypeListSection() {
2375189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new TypeListPool(DexPool.this);
2385189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2395189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2405189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public AnnotationPool getAnnotationSection() {
2415189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new AnnotationPool(DexPool.this);
2425189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2435189797292086a051666cf8c96cf44c6a23321b6Ben Gruver
2445189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        @Nonnull @Override public AnnotationSetPool getAnnotationSetSection() {
2455189797292086a051666cf8c96cf44c6a23321b6Ben Gruver            return new AnnotationSetPool(DexPool.this);
2465189797292086a051666cf8c96cf44c6a23321b6Ben Gruver        }
2475189797292086a051666cf8c96cf44c6a23321b6Ben Gruver    }
2481bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver}
249