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