12bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson/* 22bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Copyright (C) 2011 The Android Open Source Project 32bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * 42bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 52bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * you may not use this file except in compliance with the License. 62bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * You may obtain a copy of the License at 72bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * 82bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 92bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * 102bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Unless required by applicable law or agreed to in writing, software 112bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 122bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * See the License for the specific language governing permissions and 142bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * limitations under the License. 152bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 162bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 172bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonpackage com.android.dex; 182bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 192bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonimport com.android.dex.util.ByteInput; 202bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 212bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson/** 222bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Pull parser for encoded values. 232bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 242bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilsonpublic final class EncodedValueReader { 252bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_BYTE = 0x00; 262bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_SHORT = 0x02; 272bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_CHAR = 0x03; 282bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_INT = 0x04; 292bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_LONG = 0x06; 302bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_FLOAT = 0x10; 312bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_DOUBLE = 0x11; 322bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_STRING = 0x17; 332bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_TYPE = 0x18; 342bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_FIELD = 0x19; 352bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_ENUM = 0x1b; 362bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_METHOD = 0x1a; 372bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_ARRAY = 0x1c; 382bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_ANNOTATION = 0x1d; 392bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_NULL = 0x1e; 402bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public static final int ENCODED_BOOLEAN = 0x1f; 412bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 422bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** placeholder type if the type is not yet known */ 432bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private static final int MUST_READ = -1; 442bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 452bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson protected final ByteInput in; 462bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private int type = MUST_READ; 472bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private int annotationType; 482bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private int arg; 492bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 502bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public EncodedValueReader(ByteInput in) { 512bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson this.in = in; 522bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 532bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 542bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public EncodedValueReader(EncodedValue in) { 552bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson this(in.asByteInput()); 562bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 572bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 582bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** 592bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Creates a new encoded value reader whose only value is the specified 602bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * known type. This is useful for encoded values without a type prefix, 612bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * such as class_def_item's encoded_array or annotation_item's 622bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * encoded_annotation. 632bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 642bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public EncodedValueReader(ByteInput in, int knownType) { 652bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson this.in = in; 662bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson this.type = knownType; 672bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 682bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 692bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public EncodedValueReader(EncodedValue in, int knownType) { 702bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson this(in.asByteInput(), knownType); 712bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 722bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 732bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** 742bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Returns the type of the next value to read. 752bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 762bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int peek() { 772bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (type == MUST_READ) { 782bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson int argAndType = in.readByte() & 0xff; 792bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = argAndType & 0x1f; 802bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson arg = (argAndType & 0xe0) >> 5; 812bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 822bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return type; 832bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 842bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 852bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** 862bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Begins reading the elements of an array, returning the array's size. The 872bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * caller must follow up by calling a read method for each element in the 882bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * array. For example, this reads a byte array: <pre> {@code 892bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * int arraySize = readArray(); 902bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * for (int i = 0, i < arraySize; i++) { 912bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * readByte(); 922bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * } 932bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * }</pre> 942bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 952bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readArray() { 962bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_ARRAY); 972bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 982bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return Leb128.readUnsignedLeb128(in); 992bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1002bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1012bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** 1022bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Begins reading the fields of an annotation, returning the number of 1032bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * fields. The caller must follow up by making alternating calls to {@link 1042bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * #readAnnotationName()} and another read method. For example, this reads 1052bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * an annotation whose fields are all bytes: <pre> {@code 1062bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * int fieldCount = readAnnotation(); 1072bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * int annotationType = getAnnotationType(); 1082bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * for (int i = 0; i < fieldCount; i++) { 1092bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * readAnnotationName(); 1102bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * readByte(); 1112bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * } 1122bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * }</pre> 1132bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 1142bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readAnnotation() { 1152bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_ANNOTATION); 1162bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1172bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson annotationType = Leb128.readUnsignedLeb128(in); 1182bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return Leb128.readUnsignedLeb128(in); 1192bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1202bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1212bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** 1222bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Returns the type of the annotation just returned by {@link 1232bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * #readAnnotation()}. This method's value is undefined unless the most 1242bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * recent call was to {@link #readAnnotation()}. 1252bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 1262bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int getAnnotationType() { 1272bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return annotationType; 1282bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1292bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1302bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readAnnotationName() { 1312bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return Leb128.readUnsignedLeb128(in); 1322bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1332bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1342bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public byte readByte() { 1352bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_BYTE); 1362bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1372bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return (byte) EncodedValueCodec.readSignedInt(in, arg); 1382bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1392bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1402bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public short readShort() { 1412bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_SHORT); 1422bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1432bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return (short) EncodedValueCodec.readSignedInt(in, arg); 1442bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1452bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1462bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public char readChar() { 1472bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_CHAR); 1482bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1492bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return (char) EncodedValueCodec.readUnsignedInt(in, arg, false); 1502bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1512bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1522bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readInt() { 1532bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_INT); 1542bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1552bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readSignedInt(in, arg); 1562bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1572bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1582bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public long readLong() { 1592bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_LONG); 1602bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1612bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readSignedLong(in, arg); 1622bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1632bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1642bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public float readFloat() { 1652bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_FLOAT); 1662bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1672bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return Float.intBitsToFloat(EncodedValueCodec.readUnsignedInt(in, arg, true)); 1682bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1692bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1702bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public double readDouble() { 1712bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_DOUBLE); 1722bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1732bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return Double.longBitsToDouble(EncodedValueCodec.readUnsignedLong(in, arg, true)); 1742bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1752bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1762bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readString() { 1772bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_STRING); 1782bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1792bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readUnsignedInt(in, arg, false); 1802bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1812bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1822bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readType() { 1832bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_TYPE); 1842bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1852bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readUnsignedInt(in, arg, false); 1862bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1872bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1882bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readField() { 1892bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_FIELD); 1902bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1912bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readUnsignedInt(in, arg, false); 1922bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1932bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 1942bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readEnum() { 1952bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_ENUM); 1962bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 1972bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readUnsignedInt(in, arg, false); 1982bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 1992bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2002bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public int readMethod() { 2012bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_METHOD); 2022bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 2032bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return EncodedValueCodec.readUnsignedInt(in, arg, false); 2042bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2052bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2062bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public void readNull() { 2072bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_NULL); 2082bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 2092bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2102bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2112bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public boolean readBoolean() { 2122bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson checkType(ENCODED_BOOLEAN); 2132bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson type = MUST_READ; 2142bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson return arg != 0; 2152bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2162bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2172bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson /** 2182bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * Skips a single value, including its nested values if it is an array or 2192bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson * annotation. 2202bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson */ 2212bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson public void skipValue() { 2222bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson switch (peek()) { 2232bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_BYTE: 2242bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readByte(); 2252bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2262bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_SHORT: 2272bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readShort(); 2282bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2292bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_CHAR: 2302bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readChar(); 2312bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2322bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_INT: 2332bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readInt(); 2342bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2352bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_LONG: 2362bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readLong(); 2372bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2382bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_FLOAT: 2392bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readFloat(); 2402bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2412bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_DOUBLE: 2422bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readDouble(); 2432bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2442bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_STRING: 2452bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readString(); 2462bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2472bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_TYPE: 2482bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readType(); 2492bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2502bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_FIELD: 2512bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readField(); 2522bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2532bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_ENUM: 2542bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readEnum(); 2552bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2562bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_METHOD: 2572bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readMethod(); 2582bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2592bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_ARRAY: 2602bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (int i = 0, size = readArray(); i < size; i++) { 2612bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson skipValue(); 2622bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2632bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2642bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_ANNOTATION: 2652bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson for (int i = 0, size = readAnnotation(); i < size; i++) { 2662bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readAnnotationName(); 2672bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson skipValue(); 2682bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2692bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2702bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_NULL: 2712bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readNull(); 2722bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2732bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson case ENCODED_BOOLEAN: 2742bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson readBoolean(); 2752bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson break; 2762bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson default: 2772bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson throw new DexException("Unexpected type: " + Integer.toHexString(type)); 2782bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2792bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2802bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson 2812bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson private void checkType(int expected) { 2822bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson if (peek() != expected) { 2831f203dc168cd4ab457d9690bc78766fe63da2cf9Brian Carlstrom throw new IllegalStateException( 2841f203dc168cd4ab457d9690bc78766fe63da2cf9Brian Carlstrom String.format("Expected %x but was %x", expected, peek())); 2852bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2862bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson } 2872bea5ee615b0f4add658d5660bd81c5145a0d05eJesse Wilson} 288