15867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com/*
25867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * [The "BSD licence"]
300fc68adf2e39aeb9fed35293f2576bbe729ec4bJesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver (JesusFreke)
45867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * All rights reserved.
55867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com *
65867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without
75867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions
85867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * are met:
95867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright
105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com *    notice, this list of conditions and the following disclaimer.
115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright
125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com *    notice, this list of conditions and the following disclaimer in the
135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com *    documentation and/or other materials provided with the distribution.
145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products
155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com *    derived from this software without specific prior written permission.
165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com *
175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */
285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compackage org.jf.dexlib;
305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.*;
325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport java.util.Collections;
34b3abca4c90929e31e6a8c52bc0178c44e3e53c6bJesusFreke@JesusFreke.comimport java.util.List;
355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compublic class ClassDataItem extends Item<ClassDataItem> {
375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    private EncodedField[] staticFields;
385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    private EncodedField[] instanceFields;
395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    private EncodedMethod[] directMethods;
405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    private EncodedMethod[] virtualMethods;
415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    private ClassDefItem parent = null;
435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * Creates a new uninitialized <code>ClassDataItem</code>
465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param dexFile The <code>DexFile</code> that this item belongs to
475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public ClassDataItem(final DexFile dexFile) {
495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        super(dexFile);
505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * Creates a new <code>ClassDataItem</code> with the given values
545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param dexFile The <code>DexFile</code> that this item belongs to
555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param staticFields The static fields for this class
565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param instanceFields The instance fields for this class
575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param directMethods The direct methods for this class
585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param virtualMethods The virtual methods for this class
595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    private ClassDataItem(DexFile dexFile, EncodedField[] staticFields, EncodedField[] instanceFields,
615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                         EncodedMethod[] directMethods, EncodedMethod[] virtualMethods) {
625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        super(dexFile);
635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        this.staticFields = staticFields==null?new EncodedField[0]:staticFields;
645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        this.instanceFields = instanceFields==null?new EncodedField[0]:instanceFields;
655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        this.directMethods = directMethods==null?new EncodedMethod[0]:directMethods;
665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        this.virtualMethods = virtualMethods==null?new EncodedMethod[0]:virtualMethods;
675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * Creates a new <code>ClassDataItem</code> with the given values
715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param dexFile The <code>DexFile</code> that this item belongs to
725867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param staticFields The static fields for this class
735867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param instanceFields The instance fields for this class
745867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param directMethods The direct methods for this class
755867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param virtualMethods The virtual methods for this class
765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @return a new <code>ClassDataItem</code> with the given values
775867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
78928790f2939e0eec7ab2e4653a19c6c27a113634JesusFreke@JesusFreke.com    public static ClassDataItem internClassDataItem(DexFile dexFile, List<EncodedField> staticFields,
795867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                                                         List<EncodedField> instanceFields,
805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                                                         List<EncodedMethod> directMethods,
815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                                                         List<EncodedMethod> virtualMethods) {
825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedField[] staticFieldsArray = null;
835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedField[] instanceFieldsArray = null;
845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedMethod[] directMethodsArray = null;
855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedMethod[] virtualMethodsArray = null;
865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (staticFields != null && staticFields.size() > 0) {
885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            Collections.sort(staticFields);
895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            staticFieldsArray = new EncodedField[staticFields.size()];
905867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            staticFields.toArray(staticFieldsArray);
915867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
925867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
935867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (instanceFields != null && instanceFields.size() > 0) {
945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            Collections.sort(instanceFields);
955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            instanceFieldsArray = new EncodedField[instanceFields.size()];
965867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            instanceFields.toArray(instanceFieldsArray);
975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (directMethods != null && directMethods.size() > 0) {
1005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            Collections.sort(directMethods);
1015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            directMethodsArray = new EncodedMethod[directMethods.size()];
1025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            directMethods.toArray(directMethodsArray);
1035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (virtualMethods != null && virtualMethods.size() > 0) {
1065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            Collections.sort(virtualMethods);
1075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            virtualMethodsArray = new EncodedMethod[virtualMethods.size()];
1085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            virtualMethods.toArray(virtualMethodsArray);
1095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        ClassDataItem classDataItem = new ClassDataItem(dexFile, staticFieldsArray, instanceFieldsArray,
1125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                directMethodsArray, virtualMethodsArray);
1135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return dexFile.ClassDataSection.intern(classDataItem);
1145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
1155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
1175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    protected void readItem(Input in, ReadContext readContext) {
1185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        staticFields = new EncodedField[in.readUnsignedLeb128()];
1195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        instanceFields = new EncodedField[in.readUnsignedLeb128()];
1205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        directMethods = new EncodedMethod[in.readUnsignedLeb128()];
1215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        virtualMethods = new EncodedMethod[in.readUnsignedLeb128()];
1225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedField previousEncodedField = null;
1245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (int i=0; i<staticFields.length; i++) {
12516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            try {
12616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                staticFields[i] = previousEncodedField = new EncodedField(dexFile, in, previousEncodedField);
12716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            } catch (Exception ex) {
12816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                throw ExceptionWithContext.withContext(ex, "Error while reading static field at index " + i);
12916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            }
1305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        previousEncodedField = null;
1335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (int i=0; i<instanceFields.length; i++) {
13416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            try {
13516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                instanceFields[i] = previousEncodedField = new EncodedField(dexFile, in, previousEncodedField);
13616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            } catch (Exception ex) {
13716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                throw ExceptionWithContext.withContext(ex, "Error while reading instance field at index " + i);
13816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            }
1395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedMethod previousEncodedMethod = null;
1425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (int i=0; i<directMethods.length; i++) {
14316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            try {
14416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                directMethods[i] = previousEncodedMethod = new EncodedMethod(dexFile, readContext, in,
14516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                        previousEncodedMethod);
14616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            } catch (Exception ex) {
14716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                throw ExceptionWithContext.withContext(ex, "Error while reading direct method at index " + i);
14816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            }
1495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        previousEncodedMethod = null;
1525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (int i=0; i<virtualMethods.length; i++) {
15316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            try {
15416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                virtualMethods[i] = previousEncodedMethod = new EncodedMethod(dexFile, readContext, in,
15516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                        previousEncodedMethod);
15616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            } catch (Exception ex) {
15716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                throw ExceptionWithContext.withContext(ex, "Error while reading virtual method at index " + i);
15816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            }
1595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
1615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
1635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    protected int placeItem(int offset) {
1645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        offset += Leb128Utils.unsignedLeb128Size(staticFields.length);
1655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        offset += Leb128Utils.unsignedLeb128Size(instanceFields.length);
1665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        offset += Leb128Utils.unsignedLeb128Size(directMethods.length);
1675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        offset += Leb128Utils.unsignedLeb128Size(virtualMethods.length);
1685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedField previousEncodedField = null;
1705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (EncodedField encodedField: staticFields) {
1715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset = encodedField.place(offset, previousEncodedField);
1725867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedField = encodedField;
1735867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1745867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1755867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        previousEncodedField = null;
1765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (EncodedField encodedField: instanceFields) {
1775867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset = encodedField.place(offset, previousEncodedField);
1785867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedField = encodedField;
1795867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        EncodedMethod previousEncodedMethod = null;
1825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (EncodedMethod encodedMethod: directMethods) {
1835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset = encodedMethod.place(offset, previousEncodedMethod);
1845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedMethod = encodedMethod;
1855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        previousEncodedMethod = null;
1885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (EncodedMethod encodedMethod: virtualMethods) {
1895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset = encodedMethod.place(offset, previousEncodedMethod);
1905867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedMethod = encodedMethod;
1915867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
1925867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1935867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return offset;
1945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
1955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
1965867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
1975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    protected void writeItem(AnnotatedOutput out) {
1985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (out.annotates()) {
1995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.annotate("static_fields_size: 0x" + Integer.toHexString(staticFields.length) + " (" +
2005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    staticFields.length + ")");
2015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(staticFields.length);
2025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.annotate("instance_fields_size: 0x" + Integer.toHexString(instanceFields.length) + " (" +
2035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    instanceFields.length + ")");
2045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(instanceFields.length);
2055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.annotate("direct_methods_size: 0x" + Integer.toHexString(directMethods.length) + " (" +
2065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    directMethods.length + ")");
2075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(directMethods.length);
2085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.annotate("virtual_methods_size: 0x" + Integer.toHexString(virtualMethods.length) + " (" +
2095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    virtualMethods.length + ")");
2105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(virtualMethods.length);
2115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int index = 0;
2135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            EncodedField previousEncodedField = null;
2145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedField encodedField: staticFields) {
2155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("[" + index++ + "] static_field");
2165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.indent();
2175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedField.writeTo(out, previousEncodedField);
2185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.deindent();
2195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedField = encodedField;
2205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            index = 0;
2235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedField = null;
2245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedField encodedField: instanceFields) {
2255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("[" + index++ + "] instance_field");
2265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.indent();
2275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedField.writeTo(out, previousEncodedField);
2285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.deindent();
2295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedField = encodedField;
2305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            index = 0;
2335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            EncodedMethod previousEncodedMethod = null;
2345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedMethod encodedMethod: directMethods) {
2355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("[" + index++ + "] direct_method");
2365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.indent();
2375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedMethod.writeTo(out, previousEncodedMethod);
2385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.deindent();
2395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedMethod = encodedMethod;
2405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            index = 0;
2435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedMethod = null;
2445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedMethod encodedMethod: virtualMethods) {
2455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("[" + index++ + "] virtual_method");
2465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.indent();
2475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedMethod.writeTo(out, previousEncodedMethod);
2485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.deindent();
2495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedMethod = encodedMethod;
2505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        } else {
2525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(staticFields.length);
2535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(instanceFields.length);
2545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(directMethods.length);
2555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            out.writeUnsignedLeb128(virtualMethods.length);
2565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            EncodedField previousEncodedField = null;
2585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedField encodedField: staticFields) {
2595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedField.writeTo(out, previousEncodedField);
2605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedField = encodedField;
2615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedField = null;
2645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedField encodedField: instanceFields) {
2655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedField.writeTo(out, previousEncodedField);
2665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedField = encodedField;
2675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            EncodedMethod previousEncodedMethod = null;
2705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedMethod encodedMethod: directMethods) {
2715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedMethod.writeTo(out, previousEncodedMethod);
2725867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedMethod = encodedMethod;
2735867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2745867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2755867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            previousEncodedMethod = null;
2765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            for (EncodedMethod encodedMethod: virtualMethods) {
2775867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                encodedMethod.writeTo(out, previousEncodedMethod);
2785867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                previousEncodedMethod = encodedMethod;
2795867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
2805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
2815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
2825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
2845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public ItemType getItemType() {
2855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return ItemType.TYPE_CLASS_DATA_ITEM;
2865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
2875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
2895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public String getConciseIdentity() {
29016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        if (parent == null) {
29116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            return "class_data_item @0x" + Integer.toHexString(getOffset());
29216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        }
29316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        return "class_data_item @0x" + Integer.toHexString(getOffset()) + " (" + parent.getClassType() +")";
2945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
2955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
2965867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
2975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public int compareTo(ClassDataItem other) {
2985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (parent == null) {
2995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            if (other.parent == null) {
3005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                return 0;
3015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
3025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return -1;
3035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
3045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (other.parent == null) {
3055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return 1;
3065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
3075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return parent.compareTo(other.parent);
3085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
3095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
3105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
3115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * Sets the <code>ClassDefItem</code> that this <code>ClassDataItem</code> is associated with
3125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param classDefItem the <code>ClassDefItem</code> that this <code>ClassDataItem</code> is associated with
3135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
3145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    protected void setParent(ClassDefItem classDefItem) {
3155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        this.parent = classDefItem;
3165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
3175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
3185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
3195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @return the static fields for this class
3205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
3215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public EncodedField[] getStaticFields() {
3225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return staticFields;
3235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
3245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
3255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
3265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @return the instance fields for this class
3275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
3285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public EncodedField[] getInstanceFields() {
3295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return instanceFields;
3305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
3315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
3325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
3335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @return the direct methods for this class
3345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
3355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public EncodedMethod[] getDirectMethods() {
3365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return directMethods;
3375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
3385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
3395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
3405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @return the virtual methods for this class
3415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
3425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public EncodedMethod[] getVirtualMethods() {
3435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        return virtualMethods;
3445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
3455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
3462f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    /**
3472f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * Performs a binary search for the definition of the specified direct method
3482f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * @param methodIdItem The MethodIdItem of the direct method to search for
3492f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * @return The EncodedMethod for the specified direct method, or null if not found
3502f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     */
3512f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    public EncodedMethod findDirectMethodByMethodId(MethodIdItem methodIdItem) {
3522f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        return findMethodByMethodIdInternal(methodIdItem.index, directMethods);
3532f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
3542f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3552f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    /**
3562f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * Performs a binary search for the definition of the specified virtual method
3572f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * @param methodIdItem The MethodIdItem of the virtual method to search for
3582f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * @return The EncodedMethod for the specified virtual method, or null if not found
3592f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     */
3602f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    public EncodedMethod findVirtualMethodByMethodId(MethodIdItem methodIdItem) {
3612f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        return findMethodByMethodIdInternal(methodIdItem.index, virtualMethods);
3622f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
3632f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3642f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    /**
3652f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * Performs a binary search for the definition of the specified method. It can be either direct or virtual
3662f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * @param methodIdItem The MethodIdItem of the virtual method to search for
3672f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     * @return The EncodedMethod for the specified virtual method, or null if not found
3682f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com     */
3692f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    public EncodedMethod findMethodByMethodId(MethodIdItem methodIdItem) {
3702f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        EncodedMethod encodedMethod = findMethodByMethodIdInternal(methodIdItem.index, directMethods);
3712f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        if (encodedMethod != null) {
3722f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            return encodedMethod;
3732f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        }
3742f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3752f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        return findMethodByMethodIdInternal(methodIdItem.index, virtualMethods);
3762f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
3772f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3782f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    private static EncodedMethod findMethodByMethodIdInternal(int methodIdItemIndex, EncodedMethod[] encodedMethods) {
3792f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        int min = 0;
3802f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        int max = encodedMethods.length;
3812f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3822f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        while (min<max) {
3832f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            int index = (min+max)>>1;
3842f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3852f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            EncodedMethod encodedMethod = encodedMethods[index];
3862f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
3872f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            int encodedMethodIndex = encodedMethod.method.getIndex();
3882f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            if (encodedMethodIndex == methodIdItemIndex) {
3892f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com                return encodedMethod;
3902f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            } else if (encodedMethodIndex < methodIdItemIndex) {
391049bba5d986e610318abeba94e1b324ff8c37931Ben Gruver                if (min == index) {
392049bba5d986e610318abeba94e1b324ff8c37931Ben Gruver                    break;
393049bba5d986e610318abeba94e1b324ff8c37931Ben Gruver                }
3942f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com                min = index;
3952f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            } else {
396049bba5d986e610318abeba94e1b324ff8c37931Ben Gruver                if (max == index) {
397049bba5d986e610318abeba94e1b324ff8c37931Ben Gruver                    break;
398049bba5d986e610318abeba94e1b324ff8c37931Ben Gruver                }
3992f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com                max = index;
4002f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com            }
4012f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        }
4022f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
4032f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        return null;
4042f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
4052f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
4065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public static class EncodedField implements Comparable<EncodedField> {
4075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * The <code>FieldIdItem</code> that this <code>EncodedField</code> is associated with
4095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public final FieldIdItem field;
4115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * The access flags for this field
4145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public final int accessFlags;
4165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Constructs a new <code>EncodedField</code> with the given values
4195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param field The <code>FieldIdItem</code> that this <code>EncodedField</code> is associated with
4205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param accessFlags The access flags for this field
4215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public EncodedField(FieldIdItem field, int accessFlags) {
4235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            this.field = field;
4245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            this.accessFlags = accessFlags;
4255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
4265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * This is used internally to construct a new <code>EncodedField</code> while reading in a <code>DexFile</code>
4295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param dexFile The <code>DexFile</code> that is being read in
4305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param in the Input object to read the <code>EncodedField</code> from
4315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param previousEncodedField The previous <code>EncodedField</code> in the list containing this
4325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>EncodedField</code>.
4335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        private EncodedField(DexFile dexFile, Input in, EncodedField previousEncodedField) {
4355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int previousIndex = previousEncodedField==null?0:previousEncodedField.field.getIndex();
4365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            field = dexFile.FieldIdsSection.getItemByIndex(in.readUnsignedLeb128() + previousIndex);
4375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            accessFlags = in.readUnsignedLeb128();
4385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
4395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Writes the <code>EncodedField</code> to the given <code>AnnotatedOutput</code> object
4425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param out the <code>AnnotatedOutput</code> object to write to
4435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param previousEncodedField The previous <code>EncodedField</code> in the list containing this
4445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>EncodedField</code>.
4455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        private void writeTo(AnnotatedOutput out, EncodedField previousEncodedField) {
4475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int previousIndex = previousEncodedField==null?0:previousEncodedField.field.getIndex();
4485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            if (out.annotates()) {
4505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("field: " + field.getFieldString());
4515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(field.getIndex() - previousIndex);
4525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("access_flags: " + AccessFlags.formatAccessFlagsForField(accessFlags));
4535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(accessFlags);
4545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }else {
4555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(field.getIndex() - previousIndex);
4565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(accessFlags);
4575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
4585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
4595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Calculates the size of this <code>EncodedField</code> and returns the offset
4625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * immediately following it
4635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param offset the offset of this <code>EncodedField</code> in the <code>DexFile</code>
4645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param previousEncodedField The previous <code>EncodedField</code> in the list containing this
4655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>EncodedField</code>.
4665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @return the offset immediately following this <code>EncodedField</code>
4675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        private int place(int offset, EncodedField previousEncodedField) {
4695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int previousIndex = previousEncodedField==null?0:previousEncodedField.field.getIndex();
4705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset += Leb128Utils.unsignedLeb128Size(field.getIndex() - previousIndex);
4725867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset += Leb128Utils.unsignedLeb128Size(accessFlags);
4735867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return  offset;
4745867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
4755867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4775867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Compares this <code>EncodedField</code> to another, based on the comparison of the associated
4785867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>FieldIdItem</code>
4795867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param other The <code>EncodedField</code> to compare against
4805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @return a standard integer comparison value indicating the relationship
4815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public int compareTo(EncodedField other)
4835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        {
4845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return field.compareTo(other.field);
4855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
4865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @return true if this is a static field
4895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4905867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public boolean isStatic() {
4915867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return (accessFlags & AccessFlags.STATIC.getValue()) != 0;
4925867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
4935867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
4945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
4955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public static class EncodedMethod implements Comparable<EncodedMethod> {
4965867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
4975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * The <code>MethodIdItem</code> that this <code>EncodedMethod</code> is associated with
4985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
4995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public final MethodIdItem method;
5005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * The access flags for this method
5035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
5045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public final int accessFlags;
5055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * The <code>CodeItem</code> containing the code for this method, or null if there is no code for this method
5085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * (i.e. an abstract method)
5095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
5105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public final CodeItem codeItem;
5115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Constructs a new <code>EncodedMethod</code> with the given values
5145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param method The <code>MethodIdItem</code> that this <code>EncodedMethod</code> is associated with
5155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param accessFlags The access flags for this method
5165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param codeItem The <code>CodeItem</code> containing the code for this method, or null if there is no code
5175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * for this method (i.e. an abstract method)
5185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
5195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public EncodedMethod(MethodIdItem method, int accessFlags, CodeItem codeItem) {
5205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            this.method = method;
5215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            this.accessFlags = accessFlags;
5225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            this.codeItem = codeItem;
5235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            if (codeItem != null) {
5245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                codeItem.setParent(this);
5255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
5265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
5275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * This is used internally to construct a new <code>EncodedMethod</code> while reading in a <code>DexFile</code>
5305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param dexFile The <code>DexFile</code> that is being read in
5315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param readContext a <code>ReadContext</code> object to hold information that is only needed while reading
5325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * in a file
5335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param in the Input object to read the <code>EncodedMethod</code> from
5345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param previousEncodedMethod The previous <code>EncodedMethod</code> in the list containing this
5355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>EncodedMethod</code>.
5365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
5375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public EncodedMethod(DexFile dexFile, ReadContext readContext, Input in, EncodedMethod previousEncodedMethod) {
5385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int previousIndex = previousEncodedMethod==null?0:previousEncodedMethod.method.getIndex();
5395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            method = dexFile.MethodIdsSection.getItemByIndex(in.readUnsignedLeb128() + previousIndex);
5405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            accessFlags = in.readUnsignedLeb128();
541d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com            if (dexFile.skipInstructions()) {
542d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com                in.readUnsignedLeb128();
543d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com                codeItem = null;
544d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com            } else {
545d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com                codeItem = (CodeItem)readContext.getOptionalOffsettedItemByOffset(ItemType.TYPE_CODE_ITEM,
546d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com                        in.readUnsignedLeb128());
547d79d9ebbe9cdbec7f386d3db0cdb9e57893d28e6JesusFreke@JesusFreke.com            }
5485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            if (codeItem != null) {
5495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                codeItem.setParent(this);
5505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
5515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
5525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Writes the <code>EncodedMethod</code> to the given <code>AnnotatedOutput</code> object
5555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param out the <code>AnnotatedOutput</code> object to write to
5565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param previousEncodedMethod The previous <code>EncodedMethod</code> in the list containing this
5575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>EncodedMethod</code>.
5585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
5595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        private void writeTo(AnnotatedOutput out, EncodedMethod previousEncodedMethod) {
5605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int previousIndex = previousEncodedMethod==null?0:previousEncodedMethod.method.getIndex();
5615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            if (out.annotates()) {
5635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("method: " + method.getMethodString());
5645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(method.getIndex() - previousIndex);
5655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.annotate("access_flags: " + AccessFlags.formatAccessFlagsForMethod(accessFlags));
5665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(accessFlags);
5675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                if (codeItem != null) {
56816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                    out.annotate("code_off: 0x" + Integer.toHexString(codeItem.getOffset()));
5695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    out.writeUnsignedLeb128(codeItem.getOffset());
5705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                } else {
5715867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    out.annotate("code_off: 0x0");
5725867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    out.writeUnsignedLeb128(0);
5735867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                }
5745867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }else {
5755867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(method.getIndex() - previousIndex);
5765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(accessFlags);
5775867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                out.writeUnsignedLeb128(codeItem==null?0:codeItem.getOffset());
5785867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            }
5795867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
5805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Calculates the size of this <code>EncodedMethod</code> and returns the offset
5835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * immediately following it
5845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param offset the offset of this <code>EncodedMethod</code> in the <code>DexFile</code>
5855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param previousEncodedMethod The previous <code>EncodedMethod</code> in the list containing this
5865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>EncodedMethod</code>.
5875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @return the offset immediately following this <code>EncodedField</code>
5885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
5895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        private int place(int offset, EncodedMethod previousEncodedMethod) {
5905867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            int previousIndex = previousEncodedMethod==null?0:previousEncodedMethod.method.getIndex();
5915867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5925867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset += Leb128Utils.unsignedLeb128Size(method.getIndex() - previousIndex);
5935867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset += Leb128Utils.unsignedLeb128Size(accessFlags);
5945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            offset += codeItem==null?1:Leb128Utils.unsignedLeb128Size(codeItem.getOffset());
5955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return  offset;
5965867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
5975867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
5985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
5995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * Compares this <code>EncodedMethod</code> to another, based on the comparison of the associated
6005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * <code>MethodIdItem</code>
6015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @param other The <code>EncodedMethod</code> to compare against
6025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @return a standard integer comparison value indicating the relationship
6035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
6045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public int compareTo(EncodedMethod other) {
6055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return method.compareTo(other.method);
6065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
6075867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
6085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        /**
6095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         * @return true if this is a direct method
6105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com         */
6115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        public boolean isDirect() {
6125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return ((accessFlags & (AccessFlags.STATIC.getValue() | AccessFlags.PRIVATE.getValue() |
6135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com                    AccessFlags.CONSTRUCTOR.getValue())) != 0);
6145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
6155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
6165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com}
617