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.dex.code;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashSet;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Container for all the pieces of a concrete method. Each instance
2599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * corresponds to a {@code code} structure in a {@code .dex} file.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class DalvCode {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * how much position info to preserve; one of the static
30de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     * constants in {@link PositionList}
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final int positionInfo;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} the instruction list, ready for final processing;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * nulled out in {@link #finishProcessingIfNecessary}
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private OutputFinisher unprocessedInsns;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
4199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code non-null;} unprocessed catch table;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * nulled out in {@link #finishProcessingIfNecessary}
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private CatchBuilder unprocessedCatches;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
4799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} catch table; set in
48de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     * {@link #finishProcessingIfNecessary}
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private CatchTable catches;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} source positions list; set in
54de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     * {@link #finishProcessingIfNecessary}
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private PositionList positions;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} local variable list; set in
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #finishProcessingIfNecessary}
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private LocalList locals;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
6599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} the processed instruction list; set in
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #finishProcessingIfNecessary}
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private DalvInsnList insns;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param positionInfo how much position info to preserve; one of the
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * static constants in {@link PositionList}
7599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param unprocessedInsns {@code non-null;} the instruction list, ready
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for final processing
7799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param unprocessedCatches {@code non-null;} unprocessed catch
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (exception handler) table
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DalvCode(int positionInfo, OutputFinisher unprocessedInsns,
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            CatchBuilder unprocessedCatches) {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (unprocessedInsns == null) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("unprocessedInsns == null");
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (unprocessedCatches == null) {
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("unprocessedCatches == null");
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.positionInfo = positionInfo;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.unprocessedInsns = unprocessedInsns;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.unprocessedCatches = unprocessedCatches;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.catches = null;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.positions = null;
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.locals = null;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.insns = null;
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish up processing of the method.
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void finishProcessingIfNecessary() {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (insns != null) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        insns = unprocessedInsns.finishProcessingAndGetList();
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        positions = PositionList.make(insns, positionInfo);
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        locals = LocalList.make(insns);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catches = unprocessedCatches.build();
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Let them be gc'ed.
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unprocessedInsns = null;
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unprocessedCatches = null;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assign indices in all instructions that need them, using the
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * given callback to perform lookups. This must be called before
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #getInsns}.
121de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
12299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param callback {@code non-null;} callback object
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void assignIndices(AssignIndicesCallback callback) {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        unprocessedInsns.assignIndices(callback);
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
127de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance has any position data to represent.
130de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
13199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff this instance has any position
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * data to represent
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean hasPositions() {
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (positionInfo != PositionList.NONE)
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            && unprocessedInsns.hasAnyPositionInfo();
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
138de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance has any local variable data to represent.
141de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
14299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff this instance has any local variable
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * data to represent
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean hasLocals() {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return unprocessedInsns.hasAnyLocalInfo();
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance has any catches at all (either typed
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or catch-all).
152de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return whether this instance has any catches at all
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean hasAnyCatches() {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return unprocessedCatches.hasAnyCatches();
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
158de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the set of catch types handled anywhere in the code.
161de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
16299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the set of catch types
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public HashSet<Type> getCatchTypes() {
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return unprocessedCatches.getCatchTypes();
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the set of all constants referred to by instructions in
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the code.
171de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
17299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the set of constants
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public HashSet<Constant> getInsnConstants() {
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return unprocessedInsns.getAllConstants();
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the list of instructions.
180de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
18199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the instruction list
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DalvInsnList getInsns() {
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finishProcessingIfNecessary();
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return insns;
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the catch (exception handler) table.
190de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
19199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the catch table
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CatchTable getCatches() {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finishProcessingIfNecessary();
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return catches;
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the source positions list.
200de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
20199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the source positions list
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public PositionList getPositions() {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finishProcessingIfNecessary();
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return positions;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the source positions list.
210de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
21199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the source positions list
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public LocalList getLocals() {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finishProcessingIfNecessary();
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return locals;
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class used as a callback for {@link #assignIndices}.
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static interface AssignIndicesCallback {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Gets the index for the given constant.
224de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro         *
22599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * @param cst {@code non-null;} the constant
22699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * @return {@code >= -1;} the index or {@code -1} if the constant
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * shouldn't actually be reified with an index
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int getIndex(Constant cst);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
232