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
19fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilsonimport com.android.dex.util.ExceptionWithContext;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpec;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeBearer;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.MutabilityControl;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ToHuman;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Representation of an array of local variables, with Java semantics.
28de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro *
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> For the most part, the documentation for this class
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ignores the distinction between {@link Type} and {@link
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TypeBearer}.</p>
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class LocalsArray extends MutabilityControl implements ToHuman {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance, explicitly indicating the mutability.
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param mutable {@code true} if this instance is mutable
39de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     */
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected LocalsArray(boolean mutable) {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(mutable);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Makes and returns a mutable copy of this instance.
46de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
4799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the copy
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract LocalsArray copy();
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Annotates (adds context to) the given exception with information
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * about this instance.
54de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
5599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param ex {@code non-null;} the exception to annotate
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void annotate(ExceptionWithContext ex);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Replaces all the occurrences of the given uninitialized type in
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this array with its initialized equivalent.
62de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
6399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} type to replace
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void makeInitialized(Type type);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the maximum number of locals this instance can refer to.
69de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the max locals
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract int getMaxLocals();
7399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the type stored at the given local index. If the given type
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is category-2, then (a) the index must be at least two less than
7799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@link #getMaxLocals} and (b) the next index gets invalidated
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * by the operation. In case of either category, if the <i>previous</i>
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * local contains a category-2 value, then it too is invalidated by
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this operation.
81de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
8299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMaxLocals();} which local
8399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} new type for the local at {@code idx}
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void set(int idx, TypeBearer type);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the type for the local indicated by the given register spec
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to that register spec (which includes type and optional name
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * information). This is identical to calling
9199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code set(spec.getReg(), spec)}.
92de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
9399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param spec {@code non-null;} register spec to use as the basis for the update
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void set(RegisterSpec spec);
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Invalidates the local at the given index.
99de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
10099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMaxLocals();} which local
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void invalidate(int idx);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
10599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Gets the type stored at the given local index, or {@code null}
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if the given local is uninitialized / invalid.
107de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
10899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMaxLocals();} which local
10999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the type of value stored in that local
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract TypeBearer getOrNull(int idx);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the type stored at the given local index, only succeeding if
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the given local contains a valid type (though it is allowed to
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be an uninitialized instance).
117de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
11899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMaxLocals();} which local
11999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the type of value stored in that local
12099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @throws SimException thrown if {@code idx} is valid, but
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the contents are invalid
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract TypeBearer get(int idx);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the type stored at the given local index, which is expected
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to be an initialized category-1 value.
128de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
12999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMaxLocals();} which local
13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the type of value stored in that local
13199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @throws SimException thrown if {@code idx} is valid, but
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * one of the following holds: (a) the local is invalid; (b) the local
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * contains an uninitialized instance; (c) the local contains a
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * category-2 value
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract TypeBearer getCategory1(int idx);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the type stored at the given local index, which is expected
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to be a category-2 value.
141de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
14299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param idx {@code >= 0, < getMaxLocals();} which local
14399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the type of value stored in that local
14499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @throws SimException thrown if {@code idx} is valid, but
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * one of the following holds: (a) the local is invalid; (b) the local
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * contains a category-1 value
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract TypeBearer getCategory2(int idx);
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
15199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Merges this instance with {@code other}. If the merged result is
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the same as this instance, then this is returned (not a copy).
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
15499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param other {@code non-null;} another LocalsArray
15599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the merge result, a new instance or this
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract LocalsArray merge(LocalsArray other);
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
16099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Merges this instance with a {@code LocalsSet} from a subroutine
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * caller. To be used when merging in the first block of a subroutine.
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
16399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param other {@code other non-null;} another LocalsArray. The final locals
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * state of a subroutine caller.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param predLabel the label of the subroutine caller block.
16699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the merge result, a new instance or this
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract LocalsArraySet mergeWithSubroutineCaller
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            (LocalsArray other, int predLabel);
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the locals set appropriate for the current execution context.
17399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * That is, if this is a {@code OneLocalsArray} instance, then return
17499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code this}, otherwise return {@code LocalsArraySet}'s
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * primary.
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return locals for this execution context.
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected abstract OneLocalsArray getPrimary();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
182