diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java index e8dd55ff..66cd506c 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java @@ -33,7 +33,7 @@ import org.jf.dexlib2.iface.value.AnnotationEncodedValue; import org.jf.util.IndentingWriter; import java.io.IOException; -import java.util.List; +import java.util.Collection; public abstract class AnnotationEncodedValueAdaptor { @@ -47,8 +47,8 @@ public abstract class AnnotationEncodedValueAdaptor { writer.write(".end subannotation"); } - public static void writeElementsTo(IndentingWriter writer, List annotationElements) - throws IOException { + public static void writeElementsTo(IndentingWriter writer, + Collection annotationElements) throws IOException { writer.indent(4); for (AnnotationElement annotationElement: annotationElements) { writer.write(annotationElement.getName()); diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java index f6a132db..8da1b044 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java @@ -33,12 +33,12 @@ import org.jf.dexlib2.iface.value.ArrayEncodedValue; import org.jf.dexlib2.iface.value.EncodedValue; import java.io.IOException; -import java.util.List; +import java.util.Collection; public class ArrayEncodedValueAdaptor { public static void writeTo(IndentingWriter writer, ArrayEncodedValue arrayEncodedValue) throws IOException { writer.write('{'); - List values = arrayEncodedValue.getValue(); + Collection values = arrayEncodedValue.getValue(); if (values.size() == 0) { writer.write('}'); return; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java index 965e48f5..4de3c729 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java @@ -31,12 +31,11 @@ package org.jf.dexlib2.dexbacked; -import org.jf.dexlib2.dexbacked.util.VariableSizeList; +import org.jf.dexlib2.dexbacked.util.VariableSizeCollection; import org.jf.dexlib2.iface.Annotation; -import org.jf.dexlib2.iface.AnnotationElement; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public class DexBackedAnnotation implements Annotation { @Nonnull public final DexBuffer dexBuf; @@ -60,23 +59,16 @@ public class DexBackedAnnotation implements Annotation { @Nonnull @Override - public List getElements() { + public Collection getElements() { DexReader reader = dexBuf.readerAt(elementsOffset); final int size = reader.readSmallUleb128(); - return new VariableSizeList(dexBuf, reader.getOffset()) { + return new VariableSizeCollection(dexBuf, reader.getOffset(), size) { @Nonnull @Override - protected AnnotationElement readItem(@Nonnull DexReader reader, int index) { + protected DexBackedAnnotationElement readNextItem(@Nonnull DexReader reader, int index) { return new DexBackedAnnotationElement(reader); } - - @Override - protected void skipItem(@Nonnull DexReader reader, int index) { - DexBackedAnnotationElement.skipFrom(reader); - } - - @Override public int size() { return size;} }; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java index dc184459..989da785 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java @@ -48,11 +48,6 @@ public class DexBackedAnnotationElement implements AnnotationElement { this.value = DexBackedEncodedValue.readFrom(reader); } - public static void skipFrom(@Nonnull DexReader reader) { - reader.skipUleb128(); - DexBackedEncodedValue.skipFrom(reader); - } - @Nonnull @Override public String getName() { return dexBuffer.getString(nameIndex); } @Nonnull @Override public EncodedValue getValue() { return value; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java index 1fe5ebef..dd6c47cb 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java @@ -45,6 +45,4 @@ public class DexBackedCatchAllExceptionHandler implements ExceptionHandler { @Nullable @Override public String getExceptionType() { return null; } @Override public int getHandlerCodeOffset() { return handlerCodeOffset; } - - public static void skipFrom(@Nonnull DexReader reader) { reader.skipUleb128(); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java index 17104815..f69fa5a4 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java @@ -33,14 +33,14 @@ package org.jf.dexlib2.dexbacked; import com.google.common.collect.ImmutableList; import org.jf.dexlib2.base.reference.BaseTypeReference; -import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory; -import org.jf.dexlib2.dexbacked.util.FixedSizeList; -import org.jf.dexlib2.dexbacked.util.StaticInitialValueIterator; -import org.jf.dexlib2.dexbacked.util.VariableSizeListWithContext; +import org.jf.dexlib2.dexbacked.util.*; import org.jf.dexlib2.iface.ClassDef; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.AbstractCollection; +import java.util.Collection; +import java.util.Iterator; import java.util.List; public class DexBackedClassDef extends BaseTypeReference implements ClassDef { @@ -117,7 +117,7 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { @Nonnull @Override - public List getFields() { + public Collection getFields() { int classDataOffset = getClassDataOffset(); if (getClassDataOffset() != 0) { DexReader reader = dexBuf.readerAt(classDataOffset); @@ -133,11 +133,11 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { dexBuf.readSmallUint(classDefOffset + STATIC_INITIAL_VALUES_OFFSET); final int fieldsStartOffset = reader.getOffset(); - return new VariableSizeListWithContext() { + return new AbstractCollection() { @Nonnull @Override - public VariableSizeListIterator listIterator() { - return new VariableSizeListIterator(dexBuf, fieldsStartOffset) { + public Iterator iterator() { + return new VariableSizeIterator(dexBuf, fieldsStartOffset, fieldCount) { private int previousFieldIndex = 0; @Nonnull private final AnnotationsDirectory.AnnotationIterator annotationIterator = annotationsDirectory.getFieldAnnotationIterator(); @@ -146,7 +146,7 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { @Nonnull @Override - protected DexBackedField readItem(@Nonnull DexReader reader, int index) { + protected DexBackedField readNextItem(@Nonnull DexReader reader, int index) { if (index == staticFieldCount) { // We reached the end of the static field, restart the numbering for // instance fields @@ -158,18 +158,6 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { previousFieldIndex = item.fieldIndex; return item; } - - @Override - protected void skipItem(@Nonnull DexReader reader, int index) { - if (index == staticFieldCount) { - // We reached the end of the static field, restart the numbering for - // instance fields - previousFieldIndex = 0; - annotationIterator.reset(); - } - previousFieldIndex = DexBackedField.skipEncodedField(reader, previousFieldIndex); - staticInitialValueIterator.skipNext(); - } }; } @@ -182,7 +170,7 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { @Nonnull @Override - public List getMethods() { + public Collection getMethods() { int classDataOffset = getClassDataOffset(); if (classDataOffset > 0) { DexReader reader = dexBuf.readerAt(classDataOffset); @@ -197,11 +185,11 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { final AnnotationsDirectory annotationsDirectory = getAnnotationsDirectory(); final int methodsStartOffset = reader.getOffset(); - return new VariableSizeListWithContext() { + return new AbstractCollection() { @Nonnull @Override - public VariableSizeListIterator listIterator() { - return new VariableSizeListIterator(dexBuf, methodsStartOffset) { + public Iterator iterator() { + return new VariableSizeIterator(dexBuf, methodsStartOffset, methodCount) { private int previousMethodIndex = 0; @Nonnull private final AnnotationsDirectory.AnnotationIterator methodAnnotationIterator = annotationsDirectory.getMethodAnnotationIterator(); @@ -210,7 +198,7 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { @Nonnull @Override - protected DexBackedMethod readItem(@Nonnull DexReader reader, int index) { + protected DexBackedMethod readNextItem(@Nonnull DexReader reader, int index) { if (index == directMethodCount) { // We reached the end of the direct methods, restart the numbering for // virtual methods @@ -223,18 +211,6 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef { previousMethodIndex = item.methodIndex; return item; } - - @Override - protected void skipItem(@Nonnull DexReader reader, int index) { - if (index == directMethodCount) { - // We reached the end of the direct methods, restart the numbering for - // virtual methods - previousMethodIndex = 0; - methodAnnotationIterator.reset(); - parameterAnnotationIterator.reset(); - } - previousMethodIndex = DexBackedMethod.skipEncodedMethod(reader, previousMethodIndex); - } }; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java index 65a2797c..4c463ecb 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java @@ -49,9 +49,4 @@ public class DexBackedExceptionHandler implements ExceptionHandler { @Nonnull @Override public String getExceptionType() { return dexBuf.getType(typeId); } @Override public int getHandlerCodeOffset() { return handlerCodeOffset; } - - public static void skipFrom(@Nonnull DexReader reader) { - reader.skipUleb128(); - reader.skipUleb128(); - } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java index a8d14c60..3ca56435 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java @@ -96,18 +96,6 @@ public class DexBackedField extends BaseFieldReference implements Field { return AnnotationsDirectory.getAnnotations(dexBuf, annotationSetOffset); } - /** - * Skips the reader over a single encoded_field structure. - * @param reader The {@code DexFileReader} to skip - * @param previousFieldIndex The field index of the previous field, or 0 if this is the first - * @return The field index of the field that was skipped - */ - public static int skipEncodedField(@Nonnull DexReader reader, int previousFieldIndex) { - int idxDiff = reader.readSmallUleb128(); - reader.skipUleb128(); - return previousFieldIndex + idxDiff; - } - /** * Skips the reader over the specified number of encoded_field structures * diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java index 96cccf76..d402177e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java @@ -41,6 +41,7 @@ import org.jf.dexlib2.iface.MethodParameter; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public class DexBackedMethod extends BaseMethodReference implements Method { @@ -116,7 +117,7 @@ public class DexBackedMethod extends BaseMethodReference implements Method { @Nonnull @Override - public List getParameters() { + public Collection getParameters() { if (getParametersOffset() > 0) { DexBackedMethodImplementation methodImpl = getImplementation(); if (methodImpl != null) { @@ -205,17 +206,4 @@ public class DexBackedMethod extends BaseMethodReference implements Method { } return parametersOffset; } - - /** - * Skips the reader over a single encoded_method structure. - * @param reader The {@code DexFileReader} to skip - * @param previousMethodIndex The method index of the previous field, or 0 if this is the first - * @return The method index of the field that was skipped - */ - public static int skipEncodedMethod(@Nonnull DexReader reader, int previousMethodIndex) { - int idxDiff = reader.readSmallUleb128(); - reader.skipUleb128(); - reader.skipUleb128(); - return previousMethodIndex + idxDiff; - } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java index 274f626b..49c9bff1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java @@ -44,6 +44,7 @@ import org.jf.dexlib2.iface.instruction.Instruction; import org.jf.util.AlignmentUtils; import javax.annotation.Nonnull; +import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -131,7 +132,7 @@ public class DexBackedMethodImplementation implements MethodImplementation { } @Nonnull - public List getParametersWithNames() { + public Collection getParametersWithNames() { return getDebugInfo().getParametersWithNames(); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java index 5cb4a11d..4cb42a08 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java @@ -31,12 +31,12 @@ package org.jf.dexlib2.dexbacked; -import org.jf.dexlib2.dexbacked.util.VariableSizeList; +import org.jf.dexlib2.dexbacked.util.VariableSizeCollection; import org.jf.dexlib2.iface.ExceptionHandler; import org.jf.dexlib2.iface.TryBlock; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public class DexBackedTryBlock implements TryBlock { @Nonnull public final DexBuffer dexBuf; @@ -60,52 +60,33 @@ public class DexBackedTryBlock implements TryBlock { @Nonnull @Override - public List getExceptionHandlers() { + public Collection getExceptionHandlers() { DexReader reader = dexBuf.readerAt(handlersStartOffset + dexBuf.readUshort(tryItemOffset + HANDLER_OFFSET_OFFSET)); final int encodedSize = reader.readSleb128(); if (encodedSize > 0) { //no catch-all - return new VariableSizeList(dexBuf, reader.getOffset()) { + return new VariableSizeCollection(dexBuf, reader.getOffset(), encodedSize) { @Nonnull @Override - protected ExceptionHandler readItem(@Nonnull DexReader reader, int index) { + protected DexBackedExceptionHandler readNextItem(@Nonnull DexReader reader, int index) { return new DexBackedExceptionHandler(reader); } - - @Override - protected void skipItem(@Nonnull DexReader dexReader, int index) { - DexBackedExceptionHandler.skipFrom(dexReader); - } - - @Override public int size() { return encodedSize; } }; } else { //with catch-all final int sizeWithCatchAll = (-1 * encodedSize) + 1; - return new VariableSizeList(dexBuf, reader.getOffset()) { + return new VariableSizeCollection(dexBuf, reader.getOffset(), sizeWithCatchAll) { @Nonnull @Override - protected ExceptionHandler readItem(@Nonnull DexReader dexReader, int index) { + protected ExceptionHandler readNextItem(@Nonnull DexReader dexReader, int index) { if (index == sizeWithCatchAll-1) { return new DexBackedCatchAllExceptionHandler(dexReader); } else { return new DexBackedExceptionHandler(dexReader); } } - - @Override - protected void skipItem(@Nonnull DexReader dexReader, int index) { - if (index == sizeWithCatchAll-1) { - DexBackedCatchAllExceptionHandler.skipFrom(dexReader); - } else { - DexBackedExceptionHandler.skipFrom(dexReader); - } - - } - - @Override public int size() { return sizeWithCatchAll; } }; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java index 0bb8320c..c13d2401 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java @@ -74,6 +74,8 @@ public class DexBackedMethodReference extends BaseMethodReference { @Nonnull @Override public TypeReference readItem(final int index) { + // Can't use DexBackedTypeReference, because we don't want to read in the type index until it + // is asked for return new TypeReference() { @Nonnull @Override diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java index c5c8628d..6c496668 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java @@ -48,11 +48,12 @@ import org.jf.dexlib2.immutable.debug.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.List; public abstract class DebugInfo implements Iterable { - @Nonnull public abstract List getParametersWithNames(); + @Nonnull public abstract Collection getParametersWithNames(); public static DebugInfo newOrEmpty(@Nonnull DexBuffer dexBuf, int debugInfoOffset, @Nonnull DexBackedMethodImplementation methodImpl) { @@ -102,8 +103,8 @@ public abstract class DebugInfo implements Iterable { final LocalInfo[] locals = new LocalInfo[registerCount]; Arrays.fill(locals, EMPTY_LOCAL_INFO); - VariableSizeList parameters = getParametersWithNames(); - final VariableSizeList.Iterator parameterIterator = parameters.listIterator(); + final VariableSizeIterator parameterIterator = + getParametersWithNames().iterator(); // first, we grab all the parameters and temporarily store them at the beginning of locals, // disregarding any wide types @@ -232,7 +233,7 @@ public abstract class DebugInfo implements Iterable { @Nonnull @Override - public VariableSizeList getParametersWithNames() { + public VariableSizeCollection getParametersWithNames() { DexReader reader = dexBuf.readerAt(debugInfoOffset); reader.skipUleb128(); final int parameterNameCount = reader.readSmallUleb128(); @@ -240,10 +241,11 @@ public abstract class DebugInfo implements Iterable { methodImpl.method.getParametersWithoutNames(); //TODO: make sure dalvik doesn't allow more parameter names than we have parameters - return new VariableSizeList(dexBuf, reader.getOffset()) { + return new VariableSizeCollection(dexBuf, reader.getOffset(), + methodParametersWithoutNames.size()) { @Nonnull @Override - protected MethodParameter readItem(@Nonnull DexReader reader, int index) { + protected MethodParameter readNextItem(@Nonnull DexReader reader, int index) { final MethodParameter methodParameter = methodParametersWithoutNames.get(index); String _name = null; if (index < parameterNameCount) { @@ -260,8 +262,6 @@ public abstract class DebugInfo implements Iterable { } }; } - - @Override public int size() { return methodParametersWithoutNames.size(); } }; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeList.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeCollection.java similarity index 50% rename from dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeList.java rename to dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeCollection.java index 1c47f7d7..c1adb406 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeList.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeCollection.java @@ -33,78 +33,34 @@ package org.jf.dexlib2.dexbacked.util; import org.jf.dexlib2.dexbacked.DexBuffer; import org.jf.dexlib2.dexbacked.DexReader; -import org.jf.util.AbstractListIterator; import javax.annotation.Nonnull; -import java.util.AbstractSequentialList; -import java.util.NoSuchElementException; +import java.util.AbstractCollection; +import java.util.Iterator; -/** - * Provides a base class for a list that is backed by variable size items in a dex file - * @param The type of the item that this list contains - */ -public abstract class VariableSizeList extends AbstractSequentialList { +public abstract class VariableSizeCollection extends AbstractCollection { @Nonnull private final DexBuffer dexBuf; private final int offset; + private final int size; - public VariableSizeList(@Nonnull DexBuffer dexBuf, int offset) { + public VariableSizeCollection(@Nonnull DexBuffer dexBuf, int offset, int size) { this.dexBuf = dexBuf; this.offset = offset; + this.size = size; } - @Nonnull - protected abstract T readItem(@Nonnull DexReader reader, int index); + @Nonnull protected abstract T readNextItem(@Nonnull DexReader reader, int index); - protected void skipItem(@Nonnull DexReader reader, int index) { - readItem(reader, index); - } - - @Nonnull @Override - public Iterator listIterator(int startIndex) { - Iterator iterator = listIterator(); - if (startIndex < 0 || startIndex >= size()) { - throw new IndexOutOfBoundsException(); - } - for (int i=0; i { - private int index = 0; - @Nonnull private final DexReader reader = dexBuf.readerAt(offset); - - @Override public boolean hasNext() { return index < size(); } - @Override public int nextIndex() { return index; } - - protected void checkBounds(int index) { - if (index >= size()) { - throw new NoSuchElementException(); + public VariableSizeIterator iterator() { + return new VariableSizeIterator(dexBuf, offset, size) { + @Nonnull + @Override + protected T readNextItem(@Nonnull DexReader reader, int index) { + return VariableSizeCollection.this.readNextItem(reader, index); } - } - - @Nonnull - @Override - public T next() { - checkBounds(index); - return readItem(reader, index++); - } - - public void skip() { - checkBounds(index); - skipItem(reader, index++); - } - - public int getReaderOffset() { - return reader.getOffset(); - } + }; } + + @Override public int size() { return size; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java new file mode 100644 index 00000000..bbffc72c --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.jf.dexlib2.dexbacked.util; + +import org.jf.dexlib2.dexbacked.DexBuffer; +import org.jf.dexlib2.dexbacked.DexReader; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public abstract class VariableSizeIterator implements Iterator { + @Nonnull private final DexReader reader; + protected final int size; + + private int index; + + protected VariableSizeIterator(@Nonnull DexBuffer dexBuf, int offset, int size) { + this.reader = dexBuf.readerAt(offset); + this.size = size; + } + + /** + * Reads the next item from reader. + * + * @param reader The {@code DexReader} to read the next item from + * @param index The index of the item being read. This is guaranteed to be less than {@code size} + * @return The item that was read + */ + @Nonnull protected abstract T readNextItem(@Nonnull DexReader reader, int index); + + public int getReaderOffset() { + return reader.getOffset(); + } + + @Override + public boolean hasNext() { + return index < size; + } + + @Override + @Nonnull + public T next() { + if (index >= size) { + throw new NoSuchElementException(); + } + return readNextItem(reader, index++); + } + + @Override public void remove() { throw new UnsupportedOperationException(); } +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeListWithContext.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeListWithContext.java deleted file mode 100644 index 5b5364a7..00000000 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeListWithContext.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2012, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.jf.dexlib2.dexbacked.util; - -import org.jf.dexlib2.dexbacked.DexBuffer; -import org.jf.dexlib2.dexbacked.DexReader; -import org.jf.util.AbstractListIterator; - -import javax.annotation.Nonnull; -import java.util.AbstractSequentialList; -import java.util.NoSuchElementException; - -/** - * Provides a base class for a list that is backed by variable size items in a dex file. - * - * This class is similar to VariableSizeList, except that it requires the implementing - * class to implement {@code listIterator}. This allows the base class to extend - * {@code Iterator}, when it needs to store additional context while iterating the list. - * - * @param The type of the item that this list contains - */ -public abstract class VariableSizeListWithContext extends AbstractSequentialList { - @Nonnull - @Override - public VariableSizeListIterator listIterator(int startIndex) { - VariableSizeListIterator iterator = listIterator(); - if (startIndex < 0 || startIndex >= size()) { - throw new IndexOutOfBoundsException(); - } - for (int i=0; i { - private int index = 0; - @Nonnull private final DexReader reader; - - public VariableSizeListIterator(@Nonnull DexBuffer dexBuf, int offset) { - this.reader = dexBuf.readerAt(offset); - } - - /** - * Read the next item from {@code reader}. - * - * The index field will contain the index of the item being read. - * - * @return The next item that was read from {@code reader} - */ - @Nonnull protected abstract T readItem(@Nonnull DexReader reader, int index); - - /** - * Skip the next item in {@code reader}. - * - * The default implementation simply calls readNextItem and throws away the result. This - * can be overridden if skipping an item can be implemented more efficiently than reading - * the same item. - */ - protected void skipItem(@Nonnull DexReader reader, int index) { - readItem(reader, index); - } - - @Override public boolean hasNext() { return index < size(); } - @Override public int nextIndex() { return index; } - - protected void checkBounds(int index) { - if (index >= size()) { - throw new NoSuchElementException(); - } - } - - @Nonnull - @Override - public T next() { - checkBounds(index); - return readItem(reader, index++); - } - - public void skip() { - checkBounds(index); - skipItem(reader, index++); - } - } -} - diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java index 508d34cf..4e418d30 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java @@ -31,37 +31,37 @@ package org.jf.dexlib2.dexbacked.value; -import org.jf.dexlib2.ValueType; import org.jf.dexlib2.base.value.BaseAnnotationEncodedValue; import org.jf.dexlib2.dexbacked.DexBackedAnnotationElement; import org.jf.dexlib2.dexbacked.DexBuffer; import org.jf.dexlib2.dexbacked.DexReader; -import org.jf.dexlib2.dexbacked.util.VariableSizeList; -import org.jf.dexlib2.iface.AnnotationElement; +import org.jf.dexlib2.dexbacked.util.VariableSizeCollection; import org.jf.dexlib2.iface.value.AnnotationEncodedValue; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public class DexBackedAnnotationEncodedValue extends BaseAnnotationEncodedValue implements AnnotationEncodedValue { @Nonnull public final DexBuffer dexBuf; @Nonnull public final String type; + private final int elementCount; private final int elementsOffset; public DexBackedAnnotationEncodedValue(@Nonnull DexReader reader) { this.dexBuf = reader.getDexBuffer(); this.type = reader.getType(reader.readSmallUleb128()); + this.elementCount = reader.readSmallUleb128(); this.elementsOffset = reader.getOffset(); - skipElements(reader); + skipElements(reader, elementCount); } public static void skipFrom(@Nonnull DexReader reader) { - reader.skipUleb128(); - skipElements(reader); + reader.skipUleb128(); // type + int elementCount = reader.readSmallUleb128(); + skipElements(reader, elementCount); } - private static void skipElements(@Nonnull DexReader reader) { - int elementCount = reader.readSmallUleb128(); + private static void skipElements(@Nonnull DexReader reader, int elementCount) { for (int i=0; i getElements() { - DexReader reader = dexBuf.readerAt(elementsOffset); - final int size = reader.readSmallUleb128(); - - return new VariableSizeList(dexBuf, reader.getOffset()) { + public Collection getElements() { + return new VariableSizeCollection(dexBuf, elementsOffset, elementCount) { @Nonnull @Override - protected AnnotationElement readItem(@Nonnull DexReader dexReader, int index) { + protected DexBackedAnnotationElement readNextItem(@Nonnull DexReader dexReader, int index) { return new DexBackedAnnotationElement(dexReader); } - - @Override - protected void skipItem(@Nonnull DexReader reader, int index) { - DexBackedAnnotationElement.skipFrom(reader); - } - - @Override public int size() { return size;} }; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java index 76b13ba0..a27decf1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java @@ -31,29 +31,34 @@ package org.jf.dexlib2.dexbacked.value; -import org.jf.dexlib2.ValueType; import org.jf.dexlib2.base.value.BaseArrayEncodedValue; import org.jf.dexlib2.dexbacked.DexBuffer; import org.jf.dexlib2.dexbacked.DexReader; -import org.jf.dexlib2.dexbacked.util.VariableSizeList; +import org.jf.dexlib2.dexbacked.util.VariableSizeCollection; import org.jf.dexlib2.iface.value.ArrayEncodedValue; import org.jf.dexlib2.iface.value.EncodedValue; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public class DexBackedArrayEncodedValue extends BaseArrayEncodedValue implements ArrayEncodedValue { @Nonnull public final DexBuffer dexBuf; + private final int elementCount; private final int encodedArrayOffset; public DexBackedArrayEncodedValue(@Nonnull DexReader reader) { this.dexBuf = reader.getDexBuffer(); + this.elementCount = reader.readSmallUleb128(); this.encodedArrayOffset = reader.getOffset(); - skipFrom(reader); + skipElementsFrom(reader, elementCount); } public static void skipFrom(@Nonnull DexReader reader) { int elementCount = reader.readSmallUleb128(); + skipElementsFrom(reader, elementCount); + } + + private static void skipElementsFrom(@Nonnull DexReader reader, int elementCount) { for (int i=0; i getValue() { - DexReader reader = dexBuf.readerAt(encodedArrayOffset); - final int size = reader.readSmallUleb128(); - - return new VariableSizeList(dexBuf, reader.getOffset()) { + public Collection getValue() { + return new VariableSizeCollection(dexBuf, encodedArrayOffset, elementCount) { @Nonnull @Override - protected EncodedValue readItem(@Nonnull DexReader dexReader, int index) { + protected EncodedValue readNextItem(@Nonnull DexReader dexReader, int index) { return DexBackedEncodedValue.readFrom(dexReader); } - - @Override - protected void skipItem(@Nonnull DexReader reader, int index) { - DexBackedEncodedValue.skipFrom(reader); - } - - @Override public int size() { return size;} }; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java index a6cafddd..88183899 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java @@ -32,6 +32,7 @@ package org.jf.dexlib2.iface; import javax.annotation.Nonnull; +import java.util.Collection; import java.util.List; public interface Annotation { @@ -42,5 +43,5 @@ public interface Annotation { int getVisibility(); @Nonnull String getType(); - @Nonnull List getElements(); + @Nonnull Collection getElements(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java index b09394a5..0f1796b6 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java @@ -35,6 +35,7 @@ import org.jf.dexlib2.iface.reference.TypeReference; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public interface ClassDef extends TypeReference { @@ -44,6 +45,6 @@ public interface ClassDef extends TypeReference { @Nonnull List getInterfaces(); @Nullable String getSourceFile(); @Nonnull List getAnnotations(); - @Nonnull List getFields(); - @Nonnull List getMethods(); + @Nonnull Collection getFields(); + @Nonnull Collection getMethods(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java index fb582d1b..80c36d1f 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java @@ -35,12 +35,13 @@ import org.jf.dexlib2.iface.reference.MethodReference; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public interface Method extends MethodReference { @Nonnull String getContainingClass(); @Nonnull String getName(); - @Nonnull List getParameters(); + @Nonnull Collection getParameters(); @Nonnull String getReturnType(); int getAccessFlags(); @Nonnull List getAnnotations(); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodPrototype.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodPrototype.java index b8d53d1a..90905d30 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodPrototype.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodPrototype.java @@ -34,9 +34,9 @@ package org.jf.dexlib2.iface; import org.jf.dexlib2.iface.reference.TypeReference; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public interface MethodPrototype { - @Nonnull List getParameters(); + @Nonnull Collection getParameters(); @Nonnull String getReturnType(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java index 93ce5f2d..e15220f2 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java @@ -32,10 +32,10 @@ package org.jf.dexlib2.iface; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public interface TryBlock { int getStartCodeOffset(); int getCodeUnitCount(); - @Nonnull List getExceptionHandlers(); + @Nonnull Collection getExceptionHandlers(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java index 280677f0..0a10baf1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java @@ -34,11 +34,11 @@ package org.jf.dexlib2.iface.reference; import org.jf.dexlib2.iface.MethodPrototype; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public interface MethodReference extends Reference, MethodPrototype { @Nonnull String getContainingClass(); @Nonnull String getName(); - @Nonnull List getParameters(); + @Nonnull Collection getParameters(); @Nonnull String getReturnType(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java index fb027a34..9721f27a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java @@ -34,9 +34,10 @@ package org.jf.dexlib2.iface.value; import org.jf.dexlib2.iface.AnnotationElement; import javax.annotation.Nonnull; +import java.util.Collection; import java.util.List; public interface AnnotationEncodedValue extends EncodedValue { @Nonnull String getType(); - @Nonnull List getElements(); + @Nonnull Collection getElements(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java index abccd43d..6dcb590a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java @@ -32,8 +32,9 @@ package org.jf.dexlib2.iface.value; import javax.annotation.Nonnull; +import java.util.Collection; import java.util.List; public interface ArrayEncodedValue extends EncodedValue { - @Nonnull List getValue(); + @Nonnull Collection getValue(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java index 8ccaab1b..28e43e64 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java @@ -39,6 +39,7 @@ import org.jf.util.ImmutableListUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public class ImmutableAnnotation implements Annotation { @@ -48,7 +49,7 @@ public class ImmutableAnnotation implements Annotation { public ImmutableAnnotation(int visibility, @Nonnull String type, - @Nullable List elements) { + @Nullable Collection elements) { this.visibility = visibility; this.type = type; this.elements = ImmutableAnnotationElement.immutableListOf(elements); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java index e95f25c2..578f0164 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java @@ -72,7 +72,7 @@ public class ImmutableAnnotationElement implements AnnotationElement { @Nonnull public static ImmutableList immutableListOf( - @Nullable List list) { + @Nullable Iterable list) { return CONVERTER.convert(list); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java index bdb67e80..2aedbc47 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java @@ -42,6 +42,7 @@ import org.jf.util.ImmutableListUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public class ImmutableClassDef extends BaseTypeReference implements ClassDef { @@ -60,8 +61,8 @@ public class ImmutableClassDef extends BaseTypeReference implements ClassDef { @Nullable List interfaces, @Nullable String sourceFile, @Nullable List annotations, - @Nullable List fields, - @Nullable List methods) { + @Nullable Collection fields, + @Nullable Collection methods) { this.type = type; this.accessFlags = accessFlags; this.superclass = superclass; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java index 5c91cdb0..1c077cfc 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java @@ -37,7 +37,6 @@ import org.jf.util.ImmutableListConverter; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; public class ImmutableExceptionHandler implements ExceptionHandler { @Nullable public final String exceptionType; @@ -63,7 +62,7 @@ public class ImmutableExceptionHandler implements ExceptionHandler { @Nonnull public static ImmutableList immutableListOf( - @Nullable List list) { + @Nullable Iterable list) { return CONVERTER.convert(list); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java index caa9b662..4252cfe3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java @@ -102,7 +102,7 @@ public class ImmutableField extends BaseFieldReference implements Field { @Nonnull @Override public ImmutableList getAnnotations() { return annotations; } @Nonnull - public static ImmutableList immutableListOf(@Nullable List list) { + public static ImmutableList immutableListOf(@Nullable Iterable list) { return CONVERTER.convert(list); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java index 19823b52..ec45038b 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java @@ -42,6 +42,7 @@ import org.jf.util.ImmutableListUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public class ImmutableMethod extends BaseMethodReference implements Method { @@ -55,7 +56,7 @@ public class ImmutableMethod extends BaseMethodReference implements Method { public ImmutableMethod(@Nonnull String containingClass, @Nonnull String name, - @Nullable List parameters, + @Nullable Collection parameters, @Nonnull String returnType, int accessFlags, @Nullable List annotations, @@ -108,7 +109,7 @@ public class ImmutableMethod extends BaseMethodReference implements Method { @Nullable public ImmutableMethodImplementation getImplementation() { return methodImplementation; } @Nonnull - public static ImmutableList immutableListOf(@Nullable List list) { + public static ImmutableList immutableListOf(@Nullable Iterable list) { return CONVERTER.convert(list); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java index 39077422..1f23eb5e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java @@ -82,7 +82,7 @@ public class ImmutableMethodParameter extends BaseTypeReference implements Metho @Nonnull public static ImmutableList immutableListOf( - @Nullable List list) { + @Nullable Iterable list) { return CONVERTER.convert(list); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java index 85d0c70c..d81a5dfc 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java @@ -39,6 +39,7 @@ import org.jf.util.ImmutableListUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; public class ImmutableTryBlock implements TryBlock { @@ -48,7 +49,7 @@ public class ImmutableTryBlock implements TryBlock { public ImmutableTryBlock(int startCodeOffset, int codeUnitCount, - @Nullable List exceptionHandlers) { + @Nullable Collection exceptionHandlers) { this.startCodeOffset = startCodeOffset; this.codeUnitCount = codeUnitCount; this.exceptionHandlers = ImmutableExceptionHandler.immutableListOf(exceptionHandlers); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java index 9f4a2b84..b12c44df 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java @@ -40,7 +40,7 @@ import org.jf.util.ImmutableListUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; +import java.util.Collection; public class ImmutableAnnotationEncodedValue extends BaseAnnotationEncodedValue implements ImmutableEncodedValue, AnnotationEncodedValue { @@ -48,7 +48,7 @@ public class ImmutableAnnotationEncodedValue extends BaseAnnotationEncodedValue @Nonnull public final ImmutableList elements; public ImmutableAnnotationEncodedValue(@Nonnull String type, - @Nullable List elements) { + @Nullable Collection elements) { this.type = type; this.elements = ImmutableAnnotationElement.immutableListOf(elements); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java index a3be24a7..5ff091df 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java @@ -37,13 +37,13 @@ import org.jf.dexlib2.iface.value.ArrayEncodedValue; import org.jf.dexlib2.iface.value.EncodedValue; import javax.annotation.Nonnull; -import java.util.List; +import java.util.Collection; public class ImmutableArrayEncodedValue extends BaseArrayEncodedValue implements ImmutableEncodedValue, ArrayEncodedValue { @Nonnull public final ImmutableList value; - public ImmutableArrayEncodedValue(@Nonnull List value) { + public ImmutableArrayEncodedValue(@Nonnull Collection value) { this.value = ImmutableEncodedValueFactory.immutableListOf(value); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java index 633639f4..24477bbd 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java @@ -39,7 +39,6 @@ import org.jf.util.ImmutableListConverter; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; public class ImmutableEncodedValueFactory { @Nullable @@ -87,7 +86,8 @@ public class ImmutableEncodedValueFactory { } @Nonnull - public static ImmutableList immutableListOf(@Nullable List list) { + public static ImmutableList immutableListOf + (@Nullable Iterable list) { return CONVERTER.convert(list); }