1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.dex.code; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegisterSpec; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegisterSpecList; 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegisterSpecSet; 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.SourcePosition; 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Pseudo-instruction which is used to hold a snapshot of the 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * state of local variable name mappings that exists immediately after 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * the instance in an instruction array. 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class LocalSnapshot extends ZeroSizeInsn { 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} local state associated with this instance */ 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final RegisterSpecSet locals; 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constructs an instance. The output address of this instance is initially 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * unknown ({@code -1}). 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param position {@code non-null;} source position 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param locals {@code non-null;} associated local variable state 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public LocalSnapshot(SourcePosition position, RegisterSpecSet locals) { 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson super(position); 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (locals == null) { 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("locals == null"); 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.locals = locals; 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public DalvInsn withRegisterOffset(int delta) { 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return new LocalSnapshot(getPosition(), locals.withOffset(delta)); 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public DalvInsn withRegisters(RegisterSpecList registers) { 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return new LocalSnapshot(getPosition(), locals); 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the local state associated with this instance. 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the state 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public RegisterSpecSet getLocals() { 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return locals; 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson protected String argString() { 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return locals.toString(); 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson protected String listingString0(boolean noteIndices) { 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int sz = locals.size(); 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int max = locals.getMaxSize(); 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StringBuffer sb = new StringBuffer(100 + sz * 40); 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson sb.append("local-snapshot"); 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < max; i++) { 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson RegisterSpec spec = locals.get(i); 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (spec != null) { 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson sb.append("\n "); 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson sb.append(LocalStart.localString(spec)); 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return sb.toString(); 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 97