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