1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.cf.code; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttCode; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttLineNumberTable; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttLocalVariableTable; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttLocalVariableTypeTable; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.AttributeList; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.ClassFile; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.Method; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.AccessFlags; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.SourcePosition; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstNat; 29333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Prototype; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Container for all the giblets that make up a concrete Java bytecode method. 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It implements {@link Method}, so it provides all the original access 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (by delegation), but it also constructs and keeps useful versions of 3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * stuff extracted from the method's {@code Code} attribute. 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class ConcreteMethod implements Method { 4099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} method being wrapped */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Method method; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 4499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} the class's {@code SourceFile} attribute value, 45de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * if any 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 47333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson private final CstString sourceFile; 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * whether the class that this method is part of is defined with 51de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * {@code ACC_SUPER} 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final boolean accSuper; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} the code attribute */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final AttCode attCode; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} line number list */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final LineNumberList lineNumbers; 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} local variable list */ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final LocalVariableList localVariables; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 66de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method to be based on 6899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param cf {@code non-null;} the class file that contains this method 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param keepLines whether to keep the line number information 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (if any) 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param keepLocals whether to keep the local variable 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * information (if any) 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 74ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson public ConcreteMethod(Method method, ClassFile cf, boolean keepLines, boolean keepLocals) { 75ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson this(method, cf.getAccessFlags(), cf.getSourceFile(), keepLines, keepLocals); 76ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson } 77ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson 78333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public ConcreteMethod(Method method, int accessFlags, CstString sourceFile, 79ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson boolean keepLines, boolean keepLocals) { 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.method = method; 81ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson this.accSuper = (accessFlags & AccessFlags.ACC_SUPER) != 0; 82ed0fe6c2f310f8c2cc28c35c2b473d8de36db8a4Jesse Wilson this.sourceFile = sourceFile; 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList attribs = method.getAttributes(); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.attCode = (AttCode) attribs.findFirst(AttCode.ATTRIBUTE_NAME); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList codeAttribs = attCode.getAttributes(); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Combine all LineNumberTable attributes into one, with the 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * combined result saved into the instance. The following code 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * isn't particularly efficient for doing merges, but as far 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * as I know, this situation rarely occurs "in the 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * wild," so there's not much point in optimizing for it. 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LineNumberList lineNumbers = LineNumberList.EMPTY; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (keepLines) { 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (AttLineNumberTable lnt = (AttLineNumberTable) 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project codeAttribs.findFirst(AttLineNumberTable.ATTRIBUTE_NAME); 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lnt != null; 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lnt = (AttLineNumberTable) codeAttribs.findNext(lnt)) { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lineNumbers = LineNumberList.concat(lineNumbers, 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lnt.getLineNumbers()); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.lineNumbers = lineNumbers; 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalVariableList localVariables = LocalVariableList.EMPTY; 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (keepLocals) { 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do likewise (and with the same caveat) for 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LocalVariableTable and LocalVariableTypeTable attributes. 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This combines both of these kinds of attribute into a 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * single LocalVariableList. 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (AttLocalVariableTable lvt = (AttLocalVariableTable) 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project codeAttribs.findFirst( 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttLocalVariableTable.ATTRIBUTE_NAME); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lvt != null; 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lvt = (AttLocalVariableTable) codeAttribs.findNext(lvt)) { 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project localVariables = 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalVariableList.concat(localVariables, 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lvt.getLocalVariables()); 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalVariableList typeList = LocalVariableList.EMPTY; 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (AttLocalVariableTypeTable lvtt = (AttLocalVariableTypeTable) 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project codeAttribs.findFirst( 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttLocalVariableTypeTable.ATTRIBUTE_NAME); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lvtt != null; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lvtt = 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (AttLocalVariableTypeTable) codeAttribs.findNext(lvtt)) { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project typeList = 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalVariableList.concat(typeList, 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lvtt.getLocalVariables()); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (typeList.size() != 0) { 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project localVariables = 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalVariableList.mergeDescriptorsAndSignatures( 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project localVariables, typeList); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.localVariables = localVariables; 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CstNat getNat() { 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getNat(); 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 153333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public CstString getName() { 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getName(); 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 158333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public CstString getDescriptor() { 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getDescriptor(); 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getAccessFlags() { 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getAccessFlags(); 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public AttributeList getAttributes() { 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getAttributes(); 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CstType getDefiningClass() { 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getDefiningClass(); 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Prototype getEffectiveDescriptor() { 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return method.getEffectiveDescriptor(); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets whether the class that this method is part of is defined with 18499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code ACC_SUPER}. 185de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 18699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return the {@code ACC_SUPER} value 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean getAccSuper() { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return accSuper; 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the maximum stack size. 194de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 19599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the maximum stack size 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getMaxStack() { 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return attCode.getMaxStack(); 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the number of locals. 203de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 20499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} the number of locals 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getMaxLocals() { 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return attCode.getMaxLocals(); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the bytecode array. 212de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 21399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the bytecode array 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public BytecodeArray getCode() { 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return attCode.getCode(); 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the exception table. 221de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 22299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the exception table 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ByteCatchList getCatches() { 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return attCode.getCatches(); 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the line number list. 230de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 23199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the line number list 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LineNumberList getLineNumbers() { 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return lineNumbers; 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the local variable list. 239de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 24099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the local variable list 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalVariableList getLocalVariables() { 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return localVariables; 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns a {@link SourcePosition} instance corresponding to the 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given bytecode offset. 249de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 25099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param offset {@code >= 0;} the bytecode offset 25199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} an appropriate instance 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public SourcePosition makeSourcePosistion(int offset) { 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new SourcePosition(sourceFile, offset, 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lineNumbers.pcToLine(offset)); 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 258