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.Hex; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Representation of a set of local variable arrays, with Java semantics. 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This peculiar case is to support in-method subroutines, which can 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have different locals sets for each caller. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> For the most part, the documentation for this class 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ignores the distinction between {@link com.android.dx.rop.type.Type} and {@link 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * com.android.dx.rop.type.TypeBearer}.</p> 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class LocalsArraySet extends LocalsArray { 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The primary LocalsArray represents the locals as seen from 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the subroutine itself, which is the merged representation of all the 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * individual locals states. 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final OneLocalsArray primary; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indexed by label of caller block: the locals specific to each caller's 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * invocation of the subroutine. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final ArrayList<LocalsArray> secondaries; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. The locals array initially consists of 5299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * all-uninitialized values (represented as {@code null}s). 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param maxLocals {@code >= 0;} the maximum number of locals this instance 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * can refer to 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalsArraySet(int maxLocals) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(maxLocals != 0); 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary = new OneLocalsArray(maxLocals); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project secondaries = new ArrayList(); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance with the specified primary and secondaries set. 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param primary {@code non-null;} primary locals to use 6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param secondaries {@code non-null;} secondaries set, indexed by subroutine 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caller label. 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalsArraySet(OneLocalsArray primary, 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<LocalsArray> secondaries) { 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(primary.getMaxLocals() > 0); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.primary = primary; 75de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro this.secondaries = secondaries; 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance which is a copy of another. 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param toCopy {@code non-null;} instance to copy. 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private LocalsArraySet(LocalsArraySet toCopy) { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(toCopy.getMaxLocals() > 0); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary = toCopy.primary.copy(); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project secondaries = new ArrayList(toCopy.secondaries.size()); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = toCopy.secondaries.size(); 9041aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (int i = 0; i < sz; i++) { 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la = toCopy.secondaries.get(i); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la == null) { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project secondaries.add(null); 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project secondaries.add(la.copy()); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setImmutable() { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary.setImmutable(); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10741aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (LocalsArray la : secondaries) { 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la.setImmutable(); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super.setImmutable(); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalsArray copy() { 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new LocalsArraySet(this); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void annotate(ExceptionWithContext ex) { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ex.addContext("(locals array set; primary)"); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary.annotate(ex); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = secondaries.size(); 12841aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (int label = 0; label < sz; label++) { 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la = secondaries.get(label); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ex.addContext("(locals array set: primary for caller " 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + Hex.u2(label) + ')'); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la.getPrimary().annotate(ex); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc*/ 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toHuman() { 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuilder sb = new StringBuilder(); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("(locals array set; primary)\n"); 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(getPrimary().toHuman()); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('\n'); 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = secondaries.size(); 15041aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (int label = 0; label < sz; label++) { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la = secondaries.get(label); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("(locals array set: primary for caller " 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + Hex.u2(label) + ")\n"); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(la.getPrimary().toHuman()); 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append('\n'); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void makeInitialized(Type type) { 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = primary.getMaxLocals(); 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (len == 0) { 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // We have to check for this before checking for immutability. 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary.makeInitialized(type); 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17941aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (LocalsArray la : secondaries) { 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la.makeInitialized(type); 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getMaxLocals() { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return primary.getMaxLocals(); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void set(int idx, TypeBearer type) { 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary.set(idx, type); 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19941aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (LocalsArray la : secondaries) { 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la.set(idx, type); 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void set(RegisterSpec spec) { 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set(spec.getReg(), spec); 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void invalidate(int idx) { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project primary.invalidate(idx); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21941aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (LocalsArray la : secondaries) { 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la.invalidate(idx); 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public TypeBearer getOrNull(int idx) { 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return primary.getOrNull(idx); 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public TypeBearer get(int idx) { 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return primary.get(idx); 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public TypeBearer getCategory1(int idx) { 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return primary.getCategory1(idx); 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public TypeBearer getCategory2(int idx) { 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return primary.getCategory2(idx); 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 25199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Merges this set with another {@code LocalsArraySet} instance. 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 25399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param other {@code non-null;} to merge 25499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} this instance if merge was a no-op, or 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * new merged instance. 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private LocalsArraySet mergeWithSet(LocalsArraySet other) { 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project OneLocalsArray newPrimary; 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<LocalsArray> newSecondaries; 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean secondariesChanged = false; 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newPrimary = primary.merge(other.getPrimary()); 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz1 = secondaries.size(); 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz2 = other.secondaries.size(); 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = Math.max(sz1, sz2); 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondaries = new ArrayList(sz); 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la1 = (i < sz1 ? secondaries.get(i) : null); 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la2 = (i < sz2 ? other.secondaries.get(i) : null); 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray resultla = null; 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la1 == la2) { 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project resultla = la1; 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (la1 == null) { 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project resultla = la2; 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (la2 == null) { 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project resultla = la1; 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project resultla = la1.merge(la2); 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (SimException ex) { 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ex.addContext( 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "Merging locals set for caller block " + Hex.u2(i)); 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project secondariesChanged = secondariesChanged || (la1 != resultla); 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondaries.add(resultla); 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((primary == newPrimary) && ! secondariesChanged ) { 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return this; 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new LocalsArraySet(newPrimary, newSecondaries); 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 30299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Merges this set with a {@code OneLocalsArray} instance. 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 30499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param other {@code non-null;} to merge 30599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} this instance if merge was a no-op, or 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * new merged instance. 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private LocalsArraySet mergeWithOne(OneLocalsArray other) { 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project OneLocalsArray newPrimary; 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<LocalsArray> newSecondaries; 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean secondariesChanged = false; 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newPrimary = primary.merge(other.getPrimary()); 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondaries = new ArrayList(secondaries.size()); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = secondaries.size(); 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la = secondaries.get(i); 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray resultla = null; 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project resultla = la.merge(other); 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (SimException ex) { 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ex.addContext("Merging one locals against caller block " 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + Hex.u2(i)); 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project secondariesChanged = secondariesChanged || (la != resultla); 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondaries.add(resultla); 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((primary == newPrimary) && ! secondariesChanged ) { 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return this; 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new LocalsArraySet(newPrimary, newSecondaries); 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** @inheritDoc */ 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalsArraySet merge(LocalsArray other) { 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArraySet result; 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (other instanceof LocalsArraySet) { 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = mergeWithSet((LocalsArraySet) other); 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = mergeWithOne((OneLocalsArray) other); 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (SimException ex) { 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ex.addContext("underlay locals:"); 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotate(ex); 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ex.addContext("overlay locals:"); 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project other.annotate(ex); 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw ex; 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.setImmutable(); 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 36699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the {@code LocalsArray} instance for a specified subroutine 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caller label, or null if label has no locals associated with it. 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 36999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param label {@code >= 0;} subroutine caller label 37099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} locals if available. 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private LocalsArray getSecondaryForLabel(int label) { 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (label >= secondaries.size()) { 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return secondaries.get(label); 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalsArraySet mergeWithSubroutineCaller 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (LocalsArray other, int predLabel) { 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray mine = getSecondaryForLabel(predLabel); 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray newSecondary; 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project OneLocalsArray newPrimary; 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newPrimary = primary.merge(other.getPrimary()); 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (mine == other) { 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondary = mine; 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (mine == null) { 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondary = other; 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondary = mine.merge(other); 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((newSecondary == mine) && (newPrimary == primary)) { 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return this; 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We're going to re-build a primary as a merge of all the 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * secondaries. 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newPrimary = null; 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int szSecondaries = secondaries.size(); 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = Math.max(predLabel + 1, szSecondaries); 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<LocalsArray> newSecondaries = new ArrayList(sz); 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray la = null; 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (i == predLabel) { 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This LocalsArray always replaces any existing one, 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * since this is the result of a refined iteration. 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la = newSecondary; 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (i < szSecondaries) { 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project la = secondaries.get(i); 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (la != null) { 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (newPrimary == null) { 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newPrimary = la.getPrimary(); 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newPrimary = newPrimary.merge(la.getPrimary()); 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSecondaries.add(la); 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArraySet result 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project = new LocalsArraySet(newPrimary, newSecondaries); 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.setImmutable(); 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns a LocalsArray instance representing the locals state that should 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be used when returning to a subroutine caller. 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 44699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param subLabel {@code >= 0;} A calling label of a subroutine 44799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} an instance for this subroutine, or null if subroutine 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is not in this set. 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public LocalsArray subArrayForLabel(int subLabel) { 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LocalsArray result = getSecondaryForLabel(subLabel); 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /**{@inheritDoc}*/ 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected OneLocalsArray getPrimary() { 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return primary; 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 461