PoolClassDef.java revision fbdc6cb9cbb0401d1212b0a8e7de661a1b2f7325
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2013, Google Inc. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All rights reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Redistribution and use in source and binary forms, with or without 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modification, are permitted provided that the following conditions are 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * met: 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * Redistributions of source code must retain the above copyright 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * notice, this list of conditions and the following disclaimer. 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * Redistributions in binary form must reproduce the above 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copyright notice, this list of conditions and the following disclaimer 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the documentation and/or other materials provided with the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribution. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * Neither the name of Google Inc. nor the names of its 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * contributors may be used to endorse or promote products derived from 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this software without specific prior written permission. 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpackage org.jf.dexlib2.writer.pool; 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport com.google.common.collect.*; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.base.reference.BaseTypeReference; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.iface.Annotation; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.iface.ClassDef; 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.iface.Field; 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport javax.annotation.Nonnull; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport javax.annotation.Nullable; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport java.util.*; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PoolClassDef extends BaseTypeReference implements ClassDef { 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull final ClassDef classDef; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull final TypeListPool.Key<SortedSet<String>> interfaces; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull final ImmutableSortedSet<Field> staticFields; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull final ImmutableSortedSet<Field> instanceFields; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull final ImmutableSortedSet<PoolMethod> directMethods; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull final ImmutableSortedSet<PoolMethod> virtualMethods; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int classDefOffset = DexPool.NO_OFFSET; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int encodedArrayOffset = DexPool.NO_OFFSET; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int annotationDirectoryOffset = DexPool.NO_OFFSET; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PoolClassDef(@Nonnull ClassDef classDef) { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this.classDef = classDef; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org interfaces = new TypeListPool.Key<SortedSet<String>>(ImmutableSortedSet.copyOf(classDef.getInterfaces())); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org staticFields = ImmutableSortedSet.copyOf(classDef.getStaticFields()); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org instanceFields = ImmutableSortedSet.copyOf(classDef.getInstanceFields()); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org directMethods = ImmutableSortedSet.copyOf( 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Iterables.transform(classDef.getDirectMethods(), PoolMethod.TRANSFORM)); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtualMethods = ImmutableSortedSet.copyOf( 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Iterables.transform(classDef.getVirtualMethods(), PoolMethod.TRANSFORM)); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public String getType() { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return classDef.getType(); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Override public int getAccessFlags() { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return classDef.getAccessFlags(); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nullable @Override public String getSuperclass() { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return classDef.getSuperclass(); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public SortedSet<String> getInterfaces() { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return interfaces.types; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nullable @Override public String getSourceFile() { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return classDef.getSourceFile(); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public Set<? extends Annotation> getAnnotations() { 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return classDef.getAnnotations(); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public SortedSet<Field> getStaticFields() { 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return staticFields; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public SortedSet<Field> getInstanceFields() { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return instanceFields; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public Collection<Field> getFields() { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return new AbstractCollection<Field>() { 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public Iterator<Field> iterator() { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Iterators.mergeSorted( 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ImmutableList.of(staticFields.iterator(), instanceFields.iterator()), 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Ordering.natural()); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Override public int size() { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return staticFields.size() + instanceFields.size(); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public SortedSet<PoolMethod> getDirectMethods() { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return directMethods; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public SortedSet<PoolMethod> getVirtualMethods() { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return virtualMethods; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public Collection<PoolMethod> getMethods() { 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return new AbstractCollection<PoolMethod>() { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Nonnull @Override public Iterator<PoolMethod> iterator() { 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Iterators.mergeSorted( 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ImmutableList.of(directMethods.iterator(), virtualMethods.iterator()), 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Ordering.natural()); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org @Override public int size() { 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return directMethods.size() + virtualMethods.size(); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org