Machine.java revision f6c387128427e121477c1b32ad35cdcaa5101ba3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.cf.code; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Prototype; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.LocalItem; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interface for machines capable of executing bytecode by acting 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * upon a {@link Frame}. A machine conceptually contains four arbitrary-value 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * argument slots, slots for several literal-value arguments, and slots for 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * branch target information. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic interface Machine { 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the effective prototype of the method that this instance is 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * being used for. The <i>effective</i> prototype includes an initial 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>this</code> argument for instance methods. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return non-null; the method prototype 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Prototype getPrototype(); 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Clears the regular and auxiliary arguments area. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void clearArgs(); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pops the given number of values from the stack (of either category), 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and store them in the arguments area, indicating that there are now 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that many arguments. Also, clear the auxiliary arguments. 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param count >= 0; number of values to pop 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void popArgs(Frame frame, int count); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pops values from the stack of the types indicated by the given 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>Prototype</code> (popped in reverse of the argument 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * order, so the first prototype argument type is for the deepest 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element of the stack), and store them in the arguments area, 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * indicating that there are now that many arguments. Also, clear 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the auxiliary arguments. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param prototype non-null; prototype indicating arguments to pop 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void popArgs(Frame frame, Prototype prototype); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pops a value from the stack of the indicated type, and store it 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the arguments area, indicating that there are now that many 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * arguments. Also, clear the auxiliary arguments. 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type non-null; type of the argument 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void popArgs(Frame frame, Type type); 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pops values from the stack of the indicated types (popped in 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reverse argument order, so the first indicated type is for the 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * deepest element of the stack), and store them in the arguments 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * area, indicating that there are now that many arguments. Also, 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * clear the auxiliary arguments. 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type1 non-null; type of the first argument 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type2 non-null; type of the second argument 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void popArgs(Frame frame, Type type1, Type type2); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pops values from the stack of the indicated types (popped in 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reverse argument order, so the first indicated type is for the 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * deepest element of the stack), and store them in the arguments 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * area, indicating that there are now that many arguments. Also, 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * clear the auxiliary arguments. 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type1 non-null; type of the first argument 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type2 non-null; type of the second argument 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type3 non-null; type of the third argument 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void popArgs(Frame frame, Type type1, Type type2, Type type3); 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Loads the local variable with the given index as the sole argument in 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the arguments area. Also, clear the auxiliary arguments. 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param idx >= 0; the local variable index 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void localArg(Frame frame, int idx); 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that the salient type of this operation is as 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given. This differentiates between, for example, the various 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * arithmetic opcodes, which, by the time they hit a 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>Machine</code> are collapsed to the <code>int</code> 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * variant. (See {@link BytecodeArray#parseInstruction} for 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * details.) 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type non-null; the salient type of the upcoming operation 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void auxType(Type type); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that there is an auxiliary (inline, not stack) 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * argument of type <code>int</code>, with the given value. 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> Perhaps unintuitively, the stack manipulation 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ops (e.g., <code>dup</code> and <code>swap</code>) use this to 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * indicate the result stack pattern with a straightforward hex 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * encoding of the push order starting with least-significant 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * nibbles getting pushed first). For example, an all-category-1 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>dup2_x1</code> sets this to <code>0x12312</code>, and the 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * other form of that op sets this to 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>0x121</code>.</p> 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Also Note:</b> For <code>switch*</code> instructions, this is 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * used to indicate the padding value (which is only useful for 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * verification).</p> 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value the argument value 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void auxIntArg(int value); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that there is an auxiliary (inline, not stack) object 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * argument, with the value based on the given constant. 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> Some opcodes use both <code>int</code> and 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constant auxiliary arguments.</p> 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param cst non-null; the constant containing / referencing 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the value 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void auxCstArg(Constant cst); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that there is an auxiliary (inline, not stack) argument 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * indicating a branch target. 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param target the argument value 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void auxTargetArg(int target); 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that there is an auxiliary (inline, not stack) argument 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * consisting of a <code>switch*</code> table. 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> This is generally used in conjunction with 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link #auxIntArg} (which holds the padding).</p> 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param cases non-null; the list of key-target pairs, plus the default 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * target 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void auxSwitchArg(SwitchList cases); 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that there is an auxiliary (inline, not stack) argument 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * consisting of a list of initial values for a newly created array. 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param initValues non-null; the list of constant values to initialize 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the array 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void auxInitValues(ArrayList<Constant> initValues); 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates that the target of this operation is the given local. 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param idx >= 0; the local variable index 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type non-null; the type of the local 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param local null-ok; the name and signature of the local, if known 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void localTarget(int idx, Type type, LocalItem local); 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "Runs" the indicated opcode in an appropriate way, using the arguments 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * area as appropriate, and modifying the given frame in response. 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param frame non-null; frame to operate on 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param offset >= 0; byte offset in the method to the opcode being 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * run 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param opcode >= 0; the opcode to run 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void run(Frame frame, int offset, int opcode); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 209