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