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