1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.code; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Insn; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegOps; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Rop; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.Rops; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.ThrowingCstInsn; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.RegisterSpec; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstFieldRef; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstString; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashMap; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Translator from rop-level {@link Insn} instances to corresponding 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Dop} instances. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class RopToDop { 3899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} map from all the common rops to dalvik opcodes */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final HashMap<Rop, Dop> MAP; 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is uninstantiable. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private RopToDop() { 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // This space intentionally left blank. 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static { 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: The choices made here are to pick the optimistically 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * smallest Dalvik opcode, and leave it to later processing to 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pessimize. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP = new HashMap<Rop, Dop>(400); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NOP, Dops.NOP); 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_INT, Dops.MOVE); 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_LONG, Dops.MOVE_WIDE); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_FLOAT, Dops.MOVE); 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_DOUBLE, Dops.MOVE_WIDE); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_OBJECT, Dops.MOVE_OBJECT); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_PARAM_INT, Dops.MOVE); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_PARAM_LONG, Dops.MOVE_WIDE); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_PARAM_FLOAT, Dops.MOVE); 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_PARAM_DOUBLE, Dops.MOVE_WIDE); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MOVE_PARAM_OBJECT, Dops.MOVE_OBJECT); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No entry for MOVE_EXCEPTION, since it varies by 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception type. (That is, there is no unique instance to 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * add to the map.) 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONST_INT, Dops.CONST_4); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONST_LONG, Dops.CONST_WIDE_16); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONST_FLOAT, Dops.CONST_4); 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONST_DOUBLE, Dops.CONST_WIDE_16); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No entry for CONST_OBJECT, since it needs to turn 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * into either CONST_STRING or CONST_CLASS. 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: I think the only case of this is for null, and 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * const/4 should cover that. 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONST_OBJECT_NOTHROW, Dops.CONST_4); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GOTO, Dops.GOTO); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_EQZ_INT, Dops.IF_EQZ); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_NEZ_INT, Dops.IF_NEZ); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_LTZ_INT, Dops.IF_LTZ); 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_GEZ_INT, Dops.IF_GEZ); 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_LEZ_INT, Dops.IF_LEZ); 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_GTZ_INT, Dops.IF_GTZ); 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_EQZ_OBJECT, Dops.IF_EQZ); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_NEZ_OBJECT, Dops.IF_NEZ); 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_EQ_INT, Dops.IF_EQ); 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_NE_INT, Dops.IF_NE); 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_LT_INT, Dops.IF_LT); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_GE_INT, Dops.IF_GE); 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_LE_INT, Dops.IF_LE); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_GT_INT, Dops.IF_GT); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_EQ_OBJECT, Dops.IF_EQ); 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.IF_NE_OBJECT, Dops.IF_NE); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SWITCH, Dops.SPARSE_SWITCH); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.ADD_INT, Dops.ADD_INT_2ADDR); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.ADD_LONG, Dops.ADD_LONG_2ADDR); 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.ADD_FLOAT, Dops.ADD_FLOAT_2ADDR); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.ADD_DOUBLE, Dops.ADD_DOUBLE_2ADDR); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SUB_INT, Dops.SUB_INT_2ADDR); 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SUB_LONG, Dops.SUB_LONG_2ADDR); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SUB_FLOAT, Dops.SUB_FLOAT_2ADDR); 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SUB_DOUBLE, Dops.SUB_DOUBLE_2ADDR); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MUL_INT, Dops.MUL_INT_2ADDR); 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MUL_LONG, Dops.MUL_LONG_2ADDR); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MUL_FLOAT, Dops.MUL_FLOAT_2ADDR); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MUL_DOUBLE, Dops.MUL_DOUBLE_2ADDR); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.DIV_INT, Dops.DIV_INT_2ADDR); 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.DIV_LONG, Dops.DIV_LONG_2ADDR); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.DIV_FLOAT, Dops.DIV_FLOAT_2ADDR); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.DIV_DOUBLE, Dops.DIV_DOUBLE_2ADDR); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.REM_INT, Dops.REM_INT_2ADDR); 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.REM_LONG, Dops.REM_LONG_2ADDR); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.REM_FLOAT, Dops.REM_FLOAT_2ADDR); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.REM_DOUBLE, Dops.REM_DOUBLE_2ADDR); 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NEG_INT, Dops.NEG_INT); 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NEG_LONG, Dops.NEG_LONG); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NEG_FLOAT, Dops.NEG_FLOAT); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NEG_DOUBLE, Dops.NEG_DOUBLE); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AND_INT, Dops.AND_INT_2ADDR); 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AND_LONG, Dops.AND_LONG_2ADDR); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.OR_INT, Dops.OR_INT_2ADDR); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.OR_LONG, Dops.OR_LONG_2ADDR); 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.XOR_INT, Dops.XOR_INT_2ADDR); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.XOR_LONG, Dops.XOR_LONG_2ADDR); 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SHL_INT, Dops.SHL_INT_2ADDR); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SHL_LONG, Dops.SHL_LONG_2ADDR); 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SHR_INT, Dops.SHR_INT_2ADDR); 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SHR_LONG, Dops.SHR_LONG_2ADDR); 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.USHR_INT, Dops.USHR_INT_2ADDR); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.USHR_LONG, Dops.USHR_LONG_2ADDR); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NOT_INT, Dops.NOT_INT); 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NOT_LONG, Dops.NOT_LONG); 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.ADD_CONST_INT, Dops.ADD_INT_LIT8); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik ops for other types of add_const. 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No dalvik ops for any type of sub_const; there's a 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * *reverse* sub (constant - reg) for ints, though, but that 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should end up getting handled at optimization time. 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MUL_CONST_INT, Dops.MUL_INT_LIT8); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik ops for other types of mul_const. 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.DIV_CONST_INT, Dops.DIV_INT_LIT8); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik ops for other types of div_const. 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.REM_CONST_INT, Dops.REM_INT_LIT8); 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik ops for other types of rem_const. 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AND_CONST_INT, Dops.AND_INT_LIT8); 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik op for and_const_long. 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.OR_CONST_INT, Dops.OR_INT_LIT8); 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik op for or_const_long. 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.XOR_CONST_INT, Dops.XOR_INT_LIT8); 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik op for xor_const_long. 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SHL_CONST_INT, Dops.SHL_INT_LIT8); 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik op for shl_const_long. 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.SHR_CONST_INT, Dops.SHR_INT_LIT8); 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik op for shr_const_long. 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.USHR_CONST_INT, Dops.USHR_INT_LIT8); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Note: No dalvik op for shr_const_long. 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CMPL_LONG, Dops.CMP_LONG); 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CMPL_FLOAT, Dops.CMPL_FLOAT); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CMPL_DOUBLE, Dops.CMPL_DOUBLE); 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CMPG_FLOAT, Dops.CMPG_FLOAT); 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CMPG_DOUBLE, Dops.CMPG_DOUBLE); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_L2I, Dops.LONG_TO_INT); 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_F2I, Dops.FLOAT_TO_INT); 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_D2I, Dops.DOUBLE_TO_INT); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_I2L, Dops.INT_TO_LONG); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_F2L, Dops.FLOAT_TO_LONG); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_D2L, Dops.DOUBLE_TO_LONG); 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_I2F, Dops.INT_TO_FLOAT); 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_L2F, Dops.LONG_TO_FLOAT); 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_D2F, Dops.DOUBLE_TO_FLOAT); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_I2D, Dops.INT_TO_DOUBLE); 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_L2D, Dops.LONG_TO_DOUBLE); 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CONV_F2D, Dops.FLOAT_TO_DOUBLE); 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.TO_BYTE, Dops.INT_TO_BYTE); 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.TO_CHAR, Dops.INT_TO_CHAR); 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.TO_SHORT, Dops.INT_TO_SHORT); 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.RETURN_VOID, Dops.RETURN_VOID); 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.RETURN_INT, Dops.RETURN); 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.RETURN_LONG, Dops.RETURN_WIDE); 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.RETURN_FLOAT, Dops.RETURN); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.RETURN_DOUBLE, Dops.RETURN_WIDE); 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.RETURN_OBJECT, Dops.RETURN_OBJECT); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.ARRAY_LENGTH, Dops.ARRAY_LENGTH); 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.THROW, Dops.THROW); 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MONITOR_ENTER, Dops.MONITOR_ENTER); 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.MONITOR_EXIT, Dops.MONITOR_EXIT); 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_INT, Dops.AGET); 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_LONG, Dops.AGET_WIDE); 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_FLOAT, Dops.AGET); 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_DOUBLE, Dops.AGET_WIDE); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_OBJECT, Dops.AGET_OBJECT); 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_BOOLEAN, Dops.AGET_BOOLEAN); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_BYTE, Dops.AGET_BYTE); 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_CHAR, Dops.AGET_CHAR); 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.AGET_SHORT, Dops.AGET_SHORT); 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_INT, Dops.APUT); 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_LONG, Dops.APUT_WIDE); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_FLOAT, Dops.APUT); 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_DOUBLE, Dops.APUT_WIDE); 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_OBJECT, Dops.APUT_OBJECT); 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_BOOLEAN, Dops.APUT_BOOLEAN); 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_BYTE, Dops.APUT_BYTE); 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_CHAR, Dops.APUT_CHAR); 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.APUT_SHORT, Dops.APUT_SHORT); 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.NEW_INSTANCE, Dops.NEW_INSTANCE); 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.CHECK_CAST, Dops.CHECK_CAST); 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.INSTANCE_OF, Dops.INSTANCE_OF); 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_FIELD_LONG, Dops.IGET_WIDE); 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_FIELD_FLOAT, Dops.IGET); 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_FIELD_DOUBLE, Dops.IGET_WIDE); 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_FIELD_OBJECT, Dops.IGET_OBJECT); 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No map entries for get_field_* for non-long integral types, 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * since they need to be handled specially (see dopFor() below). 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_STATIC_LONG, Dops.SGET_WIDE); 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_STATIC_FLOAT, Dops.SGET); 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_STATIC_DOUBLE, Dops.SGET_WIDE); 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.GET_STATIC_OBJECT, Dops.SGET_OBJECT); 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No map entries for get_static* for non-long integral types, 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * since they need to be handled specially (see dopFor() below). 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_FIELD_LONG, Dops.IPUT_WIDE); 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_FIELD_FLOAT, Dops.IPUT); 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_FIELD_DOUBLE, Dops.IPUT_WIDE); 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_FIELD_OBJECT, Dops.IPUT_OBJECT); 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No map entries for put_field_* for non-long integral types, 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * since they need to be handled specially (see dopFor() below). 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_STATIC_LONG, Dops.SPUT_WIDE); 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_STATIC_FLOAT, Dops.SPUT); 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_STATIC_DOUBLE, Dops.SPUT_WIDE); 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MAP.put(Rops.PUT_STATIC_OBJECT, Dops.SPUT_OBJECT); 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No map entries for put_static* for non-long integral types, 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * since they need to be handled specially (see dopFor() below). 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No map entries for invoke*, new_array, and 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * filled_new_array, since they need to be handled specially 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (see dopFor() below). 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the dalvik opcode appropriate for the given register-based 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction. 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 28199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param insn {@code non-null;} the original instruction 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the corresponding dalvik opcode; one of the constants in 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Dops} 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static Dop dopFor(Insn insn) { 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Rop rop = insn.getOpcode(); 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * First, just try looking up the rop in the MAP of easy 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * cases. 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dop result = MAP.get(rop); 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (result != null) { 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * There was no easy case for the rop, so look up the opcode, and 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * do something special for each: 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The move_exception, new_array, filled_new_array, and 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * invoke* opcodes won't be found in MAP, since they'll each 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have different source and/or result register types / lists. 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The get* and put* opcodes for (non-long) integral types 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * aren't in the map, since the type signatures aren't 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sufficient to distinguish between the types (the salient 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * source or result will always be just "int"). 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * And const instruction need to distinguish between strings and 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes. 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (rop.getOpcode()) { 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.MOVE_EXCEPTION: return Dops.MOVE_EXCEPTION; 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.INVOKE_STATIC: return Dops.INVOKE_STATIC; 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.INVOKE_VIRTUAL: return Dops.INVOKE_VIRTUAL; 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.INVOKE_SUPER: return Dops.INVOKE_SUPER; 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.INVOKE_DIRECT: return Dops.INVOKE_DIRECT; 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.INVOKE_INTERFACE: return Dops.INVOKE_INTERFACE; 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.NEW_ARRAY: return Dops.NEW_ARRAY; 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.FILLED_NEW_ARRAY: return Dops.FILLED_NEW_ARRAY; 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.FILL_ARRAY_DATA: return Dops.FILL_ARRAY_DATA; 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.MOVE_RESULT: { 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec resultReg = insn.getResult(); 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (resultReg == null) { 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Dops.NOP; 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (resultReg.getBasicType()) { 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_INT: 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_FLOAT: 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BOOLEAN: 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BYTE: 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_CHAR: 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_SHORT: 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Dops.MOVE_RESULT; 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_LONG: 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_DOUBLE: 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Dops.MOVE_RESULT_WIDE; 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_OBJECT: 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Dops.MOVE_RESULT_OBJECT; 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: { 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("Unexpected basic type"); 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.GET_FIELD: { 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstFieldRef ref = 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (CstFieldRef) ((ThrowingCstInsn) insn).getConstant(); 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int basicType = ref.getBasicType(); 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (basicType) { 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BOOLEAN: return Dops.IGET_BOOLEAN; 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BYTE: return Dops.IGET_BYTE; 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_CHAR: return Dops.IGET_CHAR; 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_SHORT: return Dops.IGET_SHORT; 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_INT: return Dops.IGET; 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.PUT_FIELD: { 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstFieldRef ref = 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (CstFieldRef) ((ThrowingCstInsn) insn).getConstant(); 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int basicType = ref.getBasicType(); 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (basicType) { 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BOOLEAN: return Dops.IPUT_BOOLEAN; 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BYTE: return Dops.IPUT_BYTE; 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_CHAR: return Dops.IPUT_CHAR; 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_SHORT: return Dops.IPUT_SHORT; 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_INT: return Dops.IPUT; 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.GET_STATIC: { 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstFieldRef ref = 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (CstFieldRef) ((ThrowingCstInsn) insn).getConstant(); 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int basicType = ref.getBasicType(); 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (basicType) { 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BOOLEAN: return Dops.SGET_BOOLEAN; 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BYTE: return Dops.SGET_BYTE; 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_CHAR: return Dops.SGET_CHAR; 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_SHORT: return Dops.SGET_SHORT; 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_INT: return Dops.SGET; 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.PUT_STATIC: { 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstFieldRef ref = 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (CstFieldRef) ((ThrowingCstInsn) insn).getConstant(); 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int basicType = ref.getBasicType(); 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (basicType) { 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BOOLEAN: return Dops.SPUT_BOOLEAN; 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_BYTE: return Dops.SPUT_BYTE; 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_CHAR: return Dops.SPUT_CHAR; 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_SHORT: return Dops.SPUT_SHORT; 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case Type.BT_INT: return Dops.SPUT; 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.CONST: { 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Constant cst = ((ThrowingCstInsn) insn).getConstant(); 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (cst instanceof CstType) { 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Dops.CONST_CLASS; 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (cst instanceof CstString) { 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Dops.CONST_STRING; 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("unknown rop: " + rop); 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 416